SPI通信
SPI简介:(高速,全双工,4线同步串行总线)
SCK:主机输出的用来同步数据传输的串行时钟;MOSI:主机输出从机输入;MISO主机输入从机输出;NSS:由主机输出的片选使能低电平有效
SPI例程相关配置如下:
注意事项:(与配置UART 类似)
1.配置SPI x时应确保对应相应路的SPI
2. 配置相关GPIO和使能其时钟时要对应正确的管脚类型
3.特别注意配置各路SPI时,确定其对应的替代函数映射形式
硬件连接示意图:
SPI通信是由主设备时钟信号来确定主/从设备间的通信。一旦检测到主设备的时钟信号,在SCK(只由主机控制)的控制下,两个串行移位寄存器进行数据交换。
注意:当一个系统下挂有多个SPI从机设备时,可以有GPIO口对使能端NSS进行控制,当只有一个从机时可以将使能端NSS直接接地拉低。
SPI寄存器数据传输图示
SPI各个设备传输数据的过程中总是先发送或接收高字节数据,每个时钟周期接收器或收发器左移1位数据。对于小于16位的数据在发送之前必须左对齐,如果接收的数据小于16
位则采用软件将无效的数据位屏蔽。
特别注意:主机的时钟极性和相位以从机为基准,要搞清楚数据传输是在上升沿输出还是在下降沿接收数据等等,都要进行一一对应。
I2C通信
I2C简介:一个双向的两线连续总线,一条数据线(SDA)和一条时钟线(SCL)。
I2C总线有三种数据传输速度:标准模式100Kbps,快速模式400Kbps和高速模式可达3.4Mbps。
I2C总线结构主要用于连接整体电路,一种双向控制总线,即多个芯片(设备)可连接同一总线结构下,每个设备都可以作为实时数据传输的控制源,简化了总线结构。
外设连接示意图:
在不发送任何数据的时候数据线和时钟线都为高电平。
所以I2C通信在硬件设计,需要在数据线和时钟线上分别加上两个上拉电阻。
其次,I2C控制硬件进行数据传输时,硬件状态的改变需要一定的时间。
I2C例程配置如下:
注意事项:(与配置SPI,UART 类似)
1.配置I2C x时应确保对应相应路的I2C(例程为I2C3)
2. 配置相关GPIO和使能其时钟时要对应正确的管脚类型
3.特别注意在主函数中,开始时要对相关的时钟进行使能
数据通信时序简介:
1.主机发送开始信号,将SDA拉低,此时SCL处于高电平状态。
2.从机检测到开始信号,准备接收数据。
3.主机先拉低SCL将数据一位一位放在SDA上,然后再将SCL拉高(释放)。
4.从机检测到SCL的变化,会在SCL高电平期间(主机不会太长时间去等待从机接受)将
下一个SDA数据放进自己的寄存器中待处理。
5.主机会在设定好的时间后将SCL拉低并放进下一个SDA,然后再拉高SCL,从机会在SCL 高电平期间读取SDA数据。
6.如此往复,完成8位数据(1Byte)传输,此时SCL处于低电平,SDA处于高电平。
总线死锁现象分析与解决方法
I2C总线写操作过程中,主机在产生启动信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从机输出应答信号,将SDA信号拉为低电平。
如果这个时候主机异常复位,SCL就会被释放为高电平。此时,如果从机没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。而对于主机来说,复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C 总线被占用,会一直等待SCL和SDA信号变为高电平。这样,主机等待从机释放SDA信号,而同时从机又在等待主机将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。同样,当I2C进行读操作时,从机应答后输出数据,如果在这个时刻主机异常复位而此时从机输出的数据位正好为0,也会导致I2C总线进入死锁状态。
解决方案通常有如下几种:
(1)将从机的电源设计为可控,当发生总线死锁时将从机复位
(2)可以在从机的程序中加入监测功能,如果总线长时间被拉低则释放对总线的控制(3)在主机中增加I2C总线恢复程序。每次主机复位后,如果检测到SDA被拉低,则控制SCL产生<=9个时钟脉冲(针对8位数据的情况),每发送一个时钟脉冲就检测SDA是否被释放,如果SDA已经被释放就再模拟产生一个停止信号,这样从机就可以完成被挂起的读写操作,从死锁状态中恢复过来。这种方法有一定的局限性,因为大部分主机的I2C模块由内置的硬件电路来实现,软件并不能够直接控制SCL信号模拟产生需要时钟脉冲。
笔记:
时钟SCL只能由主机控制,数据SDA主机从机都可控制。
I2C主机通过地址选择要与自己通信的从机;
I2C起始信号:SCL = 1, SDA产生一个下降沿;
I2C结束信号:SCL = 1,SDA产生一个上升沿;
在数据传输阶段:SCL = 1的时候SDA数据线不能变化,如果SDA发生变化那意味着结束;
SCL = 1; SDA = 1; 为空闲状态;
总线上各器件的SCL、SDA为线与关系,某一个器件的引脚输出低,则为低。
通信过程中要注意应答信号,在第9个时钟时,SDA=0(ack响应),SDA=1(nak不响应)。