Bootstrap

STM32 IIC通信-硬件从机 cube-HAL库

前言:搞过很长时间的stm32 了,但是一直没有深入的研究底层,iic方面之前多是作为主机 ,而且多是使用io口模拟的,网上在这方面有用的东西确实不多,由于工作需要学习了下iic硬件从机的使用,使用cube创建工程,hal库。上次用cube还是三年前,调iic从机陷入困境,经老大指导再次用起,结果~真香,,但是要注意移植的时候的坑点

任务目标:先介绍下目标任务-----树莓派与32通过iic双向实时通信(本文做到树莓派能检测到32从机的ID地址即可),32作为下位机,所以是从机了,实现方法有软件模拟和硬件iic。

软件模拟iic从机没试过,因为这次试用硬件iic通过了就没必要试验了,但是估计也行,用中断来实现,借助时序图写下思路,下次需要时可据此快速开发。可以将SDA设置为外部io中断,跳变沿触发,触发后检测sda电平高低,根据高低可以判断是开始还是结束,只要知道是开始就可以了,后面要做的就是根据iic的时序图写出自己的接收发送程序,细节可以自行研究实现。

 

基础知识补充一:iic通信中有三种信号

开始信号:SCL高时,SDA从高变为低

结束信号:SCL高时,SDA从低变为高

应答信号:数据接收端收到8bit数据后要发送应答信号ACK

注意:开始信号必须有,结束与应答可以没有,iic通信只能由主机主动发起,即使主机从从机读取数据也要由主机先发送获取指令。

 

基础知识补充二:IIC总线的数据传送
IIC总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(地址通过物理接地或者拉高),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。

也就是说,主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。

  • 主设备往从设备中写数据。数据传输格式如下:

淡蓝色部分表示数据由主机向从机传送,粉红色部分则表示数据由从机向主机传送。

写用0来表示(高电平),读用1来表示(低电平)。

 

  • 主设备从从设备中读数据。数据传输格式如下:

这里图颜色和过程上面写数据不同,读之后的应答由从机产生,之后的数据也是从机的,再之后的应答是主机的。

 

基础知识补充三:cubemx建立工程全步骤

参考:https://mp-new.csdn.net/mp_blog/creation/editor/117856825

 

主要操作:

1.cube中设置iic参数,注意地址填多少地址就是多少,但是程序初始化中不会是这个数,因为还有别的1位

2.设置iic中断

3.修改代码----只有cube的初始化的话主机无法检测从机,无法进iic接收中断(主循环写轮询接收也可以实现主机的检测与数据接收)

(1)iic初始化中加这个接收函数,否则不进中断---------串口通信uart初始化同理,不清楚其他中断等方式,需要注意

    HAL_I2C_Slave_Receive_IT(&hi2c2, (uint8_t *)aRxBuffer_iic, 1);

(2)接收中断添加这句话,不加下次应该进不来中断

(3)自此能把数据存进aRxBuffer_iic数组了,主机(比如树莓派能检测到已经挂载的从机了)

编外:树莓派查看iic设备指令sudo i2cdetect -y 1

           如40就是个从机ID,就是cubemx中设置的从机地址,没有的话检查硬件连接,或者看iic选择器是否跳转到对应的通道

;