stm32指南者I2C通信总结!

该文资料来自野火官方

一、I2C基础

        一个I2C有一个主机和多个从机,这些主从机的数据通过总线SDA发送或接收;SCl为串行时钟总线,其作用为同步数据总线SDA的数据发送或接收。

        在I2C通信过程中,未进行通信的(空闲的)从机是输出高阻态的,避免从机之间短接,。当所有从机都空闲的时候,都输出高阻态,上拉电阻就会使总线拉成高电平。

        每一个从机都有自己的地址,当主机通过SDA先发送该地址的时候,就可以找到对应的从机,然后主机和从机之间就可以进行数据传输。注:主机与从机的地址位数初始化时要设定一致,如都是7位或都是10位,否则通信失败。(可以通过查主从机的资料查看其对应的地址是多少位)

        I2C三种传输速度:需要查看主从机的资料确定其支持的速度,一般设置为快速。

                                标准:100kbit/s

                                快速:400bit/s

                                高速:3.4Mbit/s

stm32指南者I2C通信总结!_第1张图片

 二、I2C协议

1、写过程

        拿主机为stm32举例,首先stm32需要发送一个起始信号(s)给从机,然后再发送从机的地址(7或10位地址,一般为7为)和写信号(0),然后等待从机应答,从机应答后,主机发送数据给从机,由此从机每应答一次,主机就发送一次数据,直到从机不应答,然后设置停止发送(P)。

stm32指南者I2C通信总结!_第2张图片

2、 读过程:

        读过程和写过程差不多,首先stm32需要发送一个起始信号(s)给从机,然后再发送从机的地址(7或10位地址,一般为7为)和读信号(1),然后等待从机应答,从机应答后,便主动发送数据给主机然后等待主机应答,主机应答后从机再次发送数据给主机,由此主机每应答一次,从机就发送一次数据,直到主机不应答,然后主机设置停止发送(P)。

stm32指南者I2C通信总结!_第3张图片

 3,、读写复合

        该图可以看出,有两个一样的过程,都是从S---A/~AA,但是不同的是第一个date是主机发送给从机的一个“从机里面储存数据的地址”,第二个date则是数据。读写复合是I2C最常用的。

stm32指南者I2C通信总结!_第4张图片

 4、起始信号(s)、停止信号(P)、从机地址、应答和非应答

起始信号:SDA置低电平,SCL为高电平(通信开始)

停止信号:SDA置高电平,SCL为高电平(通信停止)

stm32指南者I2C通信总结!_第5张图片

当数据开始传输时,SCL为高电平的时候传输的数据是有效的,反之无效,直至下一个SCL高电平。

stm32指南者I2C通信总结!_第6张图片

 前面说过,从机地址位7位或者10位,一般为7位,加上读写(1或0)就变成8位,

MSB:高位先行(代表高位)

LSB:低位先行(代表低位)

stm32指南者I2C通信总结!_第7张图片

        那什么是应答信号或非应答呢?

        当数据传输完成之后,数据传输端(可能是主机,也可能是从机)使SDA变成高电平,然后放弃空SDA先,给数据接收端控制该总线,若数据接收端将SDA置低电平则为应答信号,控制权再交给数据发送端,,,反之SDA一直为高电平时,则为非应答信号。

 stm32指南者I2C通信总结!_第8张图片

 三、STM32与I2C

1、框架

发送数据:当Stm32要发送数据的时候,需要从数据寄存器(DR)一位一位的将数据放到移位寄存器中,然后再一位位的发送给从机。

接收数据:数据是从机一位位的传输到移位寄存器中,然后再存放到数据寄存器里面。

stm32指南者I2C通信总结!_第9张图片

 2、主发送器和主接收器

EV都是事件,简单来说都是标志位,用来检测某些动作是否完成的标志位。

主发送器:

        a、控制产生起始信号 (S) ,当发生起始信号后它产事件“ EV5 ”,并会对 SR1 寄存器的“ SB ”位置 1,表示起始信号已经发送;
        b、发送设备地址并等待应答信号,若有从机则产生事件“ EV6 ”及 “EV8 ”,这时 SR1 寄存器的    “ ADDR ”位及“ TXE”位被置 1,ADDR 为1表示地址已经发送,TXE为1表数据寄存器为空。

         c、往I2C 的“数据寄存器 DR ”写入要发送的数据,这时TXE位会被重置 0,表 示数据寄存器非空, I2C 外设通过 SDA 信号线一位把数据发送出去后,又 会产生“ EV8 ”事件,即 TXE位被置 1,重复这个过程,可以发送多字节数据;
        d、发送数据完成后,控制 I2C 设备产生一个停止信号 (P) ,这个时候会产生 EV2 事件, SR1 的TXE位及 BTF BTF位都被置 1,表示通讯结束。

stm32指南者I2C通信总结!_第10张图片

主接收器: 

        a、起始信号 (S) 是由主机端产生的,控制发起始信号后它事件 “EV5 ”,并会对 SR1 寄存器的“ 寄存器的“ SB ”位置 1,表示起始信号已经发送;
        b、发送设备地址并等待应答信号,若有从机则产生事件“ EV6 ”这 时SR1 寄存器的“ ADDR ”位被置 1,表示地址已经发送。

        c、从机端接收到地址后,开始向主发送数据。当这些后,会产生“ EV7 ”事件, SR1 寄存器的 RXNE 被置 1,表示接收数据 寄存器非空,读取该后可对数据清以便接收下一次数据。此时可以控制 I2C 发送应答信号 (ACK) 或非应答信号 (NACK) ,若 应答,则重复以上步骤接收数据若非停止传输;
        d、发送非应答信号 后,产生停止(P) ,结束传输。

stm32指南者I2C通信总结!_第11张图片

 四、结束语

        在实际编程中,写入数据可以根据主发送器来编程,读取数据可以根据读写复合时序来编程,并且要熟悉各种事件的判断。stm32的硬件I2C似乎有点问题,所以很多人直接操作GPIO口来写软件I2C,软件I2C确实际编程起来简单些,只需把起始信号,停止信号,发送数据等写成模块,然后根据读写复合时序编程即可。(根据野火水哥教学随便总结,凌晨了,碎觉去)

你可能感兴趣的:(stm32,stm32,单片机,嵌入式硬件)