目录
一、SPI的简介
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。
SPI 通讯设备之间的常用连接方式,如下图:
SPI数据发送接收
SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。
首先拉低对应SS信号线,表示与该设备进行通信
主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据
这里要注意,SCLK时钟信号可能是低电平有效,也可能是高电平有效,因为SPI有四种模式,这个我们在下面会介绍
主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
SPI的通信协议
这是一个主机的通讯时序。NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。
二、OLED显示个人学号姓名
1.文字取模方法
由于OLED显示中使用了中文字符,因此需要将中文进行取模得到中文的点阵编码并存到oledfont.h中,方便程序调用并显示到OLED上去。
字模软件下载链接:百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1GRe2X3p2ETJJEFwXsnV1sw
提取码:fn8i
打开应用程序,输入自己选取的汉字,注意,这里需要将正向的文字左旋 90 °,然后再向下翻转,这样,OLED 上显示的文字才是正向的。
2.代码编写
主要程序举例:
main.c
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "gui.h"
#include "test.h"
#include "bsp_i2c.h"
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
OLED_Init(); //初始化OLED
IIC_Init(); //初始化IIC
OLED_Clear(0); //清屏(全黑)
while(1)
{
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x27,OLED_CMD); //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte(0x01,OLED_CMD); //终止页 1
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0xFF,OLED_CMD); //虚拟字节
TEST_ShowMyName(); //显示文本
read_AHT20_once(); //读取温度并显示
OLED_WR_Byte(0x2F,OLED_CMD); //开启滚动
delay_ms(1500);
delay_ms(1350);
内容显示函数test.c
void TEST_ShowMyName(void)
{
GUI_ShowCHinese(0,0,16,"重庆交通大学",1);
GUI_ShowString(0,16,"631907123",16,1);
GUI_ShowCHinese(80,16,16,"张某人",1);
}
其余代码放在文末,读者可以参考
三、结果展示
1.硬件连接
PA9连到USB模块的RX,PA10连到USB模块的TX,温湿度传感器的SCL连接PB6,SDA连接PB7
OLED连线如图
2.效果展示
四、使用逻辑分析仪深入了解协议
1. I2C协议
当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。当 SCL 是高电平时 SDA线由低电平向高电平切换,表示通讯的停止。
对于I2C协议前面有所提到,当SCL为高电平时,SDA才有作用, 每一个上升沿读取一个bit,则第一个波形对应的二进制信号为01000001,而最后一个是I2C协议的一个应答信号,当SDA为低电平时表示ACK希望继续接收信号,当SDA为高电平表示NAK表示不接收信号了。
分析代码:
首先初始化SCL和SDA都为高电平,那么在SDA从高电平跳变到低电平时表示开始接收。
开始接收,SDA从1到0
该函数功能即将SCL为高电平时,存储SDA的电平值。
这两个函数定义了ACK和NAK应答信号的发送。
2.SPI协议
当CH3即SS为低电平时SPI协议开始工作,而当CH2即时钟信号在上升沿则MOSI和MISO同步开始发送和采集信号,由图中可读出第一个信号的二进制码为MOSI:00111000以及MISO:00111001。
分析代码:
该函数是对SPI协议的一个初始化
该函数是SPI工作时的操作函数。
五、参考文献及资料
1.相关资料
代码相关资料:链接:https://pan.baidu.com/s/1CebJFltCz5Jzo8rhY12HuQ
提取码:2002