本文主要是介绍I2C通信外设,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
I2C外设介绍
主机,就是拥有主动控制总线的权利。从机,只能在从机允许的情况下,才能控制总线。
多主机模型可分为固定多主机和可变多主机。固定多主机就是总线上,有2个或2个以上固定的主机,上面固定为主机,下面是从机,只能是主机对从机进行控制,从机不能控制主机,当2个主机同时控制时,就会产生总线冲突,就要进行总线仲裁,仲裁失败的一方让出总线控制权。
可变多主机,总线上挂载多个设备,总线上没有固定的主机和从机,任何一个设备,都可以在总线空闲时跳出来作为主机,然后指定其他任何一个设备进行通信,通信完成后,跳出来的主机就要退回到从机的位置。对于STM32的I2C,使用的是可变多主机。
支持7位/10位地址模式(7位地址只能支持128个设备,地址数量不够时可以通过开辟多条I2C总线或者改用10位地址来解决,十位地址的情况下就需要规定起始位后的两个字节都作为寻址为使用,如果想将第二个字节作为寻址使用那就要将第一个字节前五位写入11110来作为标志)
兼容SMBus协议(此协议是基于I2C总线改进而来的,主要应用于电源管理系统中)是系统管理总线。
硬件I2C和软件I2C,硬件I2C在stm32中最多只能有2路I2C总线。软件I2C,没有限制,只要代码存得下。
I2C外设框图
复用引脚,I2C1的
复用引脚,I2C2的引脚,I2C2还可以重映射到PB8,PB9两个引脚
I2C基本结构
这个移位寄存器和数据寄存器是核心,因为这是高位先行,所以这个移位寄存器向左先行,在法送时,最高位移出去,一个SCL时钟,是移位一次;移位8次,这就能把一个字节,由高位到低位,依次放到SDA总线上。
接收时,数据从GPIO口,从右边依次移进来,移位8次,最终一个字节就接收完成了。
对于GPIO口都要配置成复用开漏输出模式,复用就是GPIO口的状态,由片上外设控制的;开漏输出,是I2C协议要求配置。
SCL这里,时钟控制器通过GPIO去控制时钟线。SDA部分,输出数据,通过GPIO,输出到端口,输入数据,通过GPIO,输入到移位寄存器。
主机发送
7位地址的主发送和10位地址的主发送,区别是,7位地址,起始条件后的一个字节是寻址;
10位地址,起始条件后的两个字节都是寻址,其中前一个字节,帧头:内容是5位的标志位11110+2位地址+1位读写位,后一个字节,是8位地址,两个字节加一起,构成10位寻址。
7位地址的主发送:流程是,起始,从机地址,应答,数据1,应答,数据2,应答,最后P停止。
首先,初始化后,总线默认空闲状态,STM32默认从模式,为了产生一个起始条件,STM32需要写入控制寄存器,之后,STM32由从模式转换为主模式,然后会发生EV5事件,EV5其实相当于检查标志位,SB表示状态寄存器的一个状态,SB置1,表示起始条件已发送,当检测起始地址已发送时,就可以发送一个字节的从机地址,从机地址需要写到数据寄存器DR中,写入DR后,硬件电路会自动把这一字节,转到移位寄存器里,在把这个字节发送到I2C总线上,之后硬件自动接收应答并判读,如没有应答,硬件就会置应答失败的标志位,在寻址完成后,会发生EV6事件,EV6事件结束后,发送EV8事件,然后接收应答,数据2就转入移位寄存器发送,又发生EV8事件,但此时下一个数据,已经被写到寄存器等着了,所以EV8事件消失,之后应答,产生EV8事件,写入数据寄存器,EV8消失。一旦检测到EV8事件,就开始写入下一个数据,最后,当想要发送的数据写完后,这时就没有新的数据写入数据寄存器,当移位寄存器移位完成时,此时就是移位寄存器器空,数据寄存器也空状态,这个事件就是EV8_2,检测到EV8_2时,产生终止条件。
主机接收
时序流程是,起始,从机地址+读,接收应答,然后接收数据,发送应答,接收数据,发送应答,最后一个数据给非应答,然后终止。
首先,写入控制寄存器start位,产生起始条件,然后等待EV5事件,EV5事件代表起始条件已发送,之后是寻址,接收应答,产生EV6事件,EV6事件代表寻址已完成,数据1代表数据正通过移位寄存器进行输入,,EV6_1是没有对应的事件标志,只适用于接收1个字节的情况,这个,EV6_1,是数据1还在移位,数据没有收到,所以事件没有标志位,之后当时序单元完成时,把应答位发送出去,移入的一个字节就整体转移到数据寄存器,同时置RXNE标志位,表数据寄存器费空,收到了一个字节的数据,就是,EV7事件,当把数据读走后,,EV7事件就没了,说明此时数据1被读走,当然数据1还没读走的时候,数据2就可以直接移入移位寄存器,之后,数据2移位完成,收到数据2,产生,EV7事件,读走数据2,,EV7事件没了,按照这个流程,就一直接收数据,最后,当不需要接收时,需要在最后一个时序单元发生时,提前把ACK置0,,并设置终止条件的请求,这就是,EV7_1事件,之后,在时序完成后,设置了ACK=0,这里就给出非应答,由于设置STOP位,产生终止条件。
软件硬件波形对比
上面波形是软件I2C波形,下面波形是硬件I2C波形。
软件和硬件生成时序异同:引脚电平变化趋势一样,时钟线规整程度上看,硬件I2C更加规整;软件I2C,由于加了延时,软件时序不规整。
这篇关于I2C通信外设的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!