I2C通讯
I2C通讯使用双向二线制同步串行总线(SDA,SCL)
传输步骤
读字节操作
- 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信(发送起始信号);
- 主机向总线发送要与之通信的从机的地址,以及写位;
- 主机等待应答;
- 主机发送要读的地址;
- 主机等待应答;
- 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信(再次发送起始信号);
- 主机等待应答;
- 主机开始接收数据;
- 传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧;
- 随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件(发送停止信号)。
写字节操作
- 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信(发送起始信号);
- 主机向总线发送要与之通信的从机的地址,以及读/写位;
- 主机等待应答;
- 主机发送要写的地址;
- 主机等待应答;
- 主机开始写入数据;
- 主机等待应答;
- 随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件(发送停止信号)。
SPI通讯
SPI通讯使用3条总线及片选线,3条总线分别为SCK、MOSI、MISO,NSS/SS
NSS、SCK、MOSI信号都由主机控制产生,而MISO的信号由从机产生,主机通过该信号线读取从机的数据。 MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。观察图中的标号处,MOSI及MISO的数据在SCK的上升沿期间变化输出,在SCK的下降沿时被采样。即在SCK的下降沿时刻, MOSI及MISO的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI及MISO为下一次表示数据做准备。
四种通讯模式
上面讲述的图SPI通讯时序中的时序只是SPI中的其中一种通讯模式,SPI一共有四种通讯模式, 它们的主要区别是总线空闲时SCK的时钟状态以及数据采样时刻。为方便说明,在此引入“时钟极性CPOL”和“时钟相位CPHA”的概念。
时钟极性CPOL是指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即SPI通讯开始前、 NSS线为高电平时SCK的状态)。CPOL=0时, SCK在空闲状态时为低电平,CPOL=1时,则相反。
时钟相位CPHA是指数据的采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时, 数据线在SCK的“偶数边沿”采样。见图 CPHA =0时的SPI通讯模式及图 CPHA = 1时的SPI通讯模式。
由CPOL及CPHA的不同状态,SPI分成了四种模式,见表SPI的四种模式, 主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是“模式0”与“模式3”。
主模式收发流程
- 控制NSS信号线, 产生起始信号(选择要通讯的从机,图中没有画出);
- 把要发送的数据写入到“数据寄存器DR”中, 该数据会被存储到发送缓冲区;
- 通讯开始,SCK时钟开始运行。MOSI把发送缓冲区中的数据一位一位地传输出去; MISO则把数据一位一位地存储进接收缓冲区中;
- 当发送完一帧数据的时候,“状态寄存器SR”中的“TXE标志位”会被置1,表示传输完一帧,发送缓冲区已空;类似地, 当接收完一帧数据的时候,“RXNE标志位”会被置1,表示传输完一帧,接收缓冲区非空;
- 等待到“TXE标志位”为1时,若还要继续发送数据,则再次往“数据寄存器DR”写入数据即可;等待到“RXNE标志位”为1时, 通过读取“数据寄存器DR”可以获取接收缓冲区中的内容。
串口通讯
串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通讯的协议层中, 规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据, 其组成见图 串口数据包的基本组成。
方的数据包格式要约定一致才能正常收发数据, 其组成见图 串口数据包的基本组成。
参考链接野火STM32库开发实战指南