I2C完整讲解(一)

**I2C 通讯协议(Inter-Integrated Circuit)**是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART,CAN等通讯 协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

I2C物理层

I2C协议是一个支持多设备的总线,该总线包括两条,一条双向串行数据线(SDA),一条串行时钟线 (SCL).数据线即用来表示数据,时钟线用于数 据收发同步.每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问,传输数据的方向可以从机到主机也可以主机到从机,当I2C设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平模拟IIC一定要将GPIO端口设置为开漏输出并加上上拉电阻.(硬件IIC会自动配置为开漏输出),关于开漏和推挽可以参考这个链接https://blog.csdn.net/qq_27016651/article/details/83096126
为什么要加上拉电阻:
IIC的从器件,不具备拉高总线的能力,从机控制SDA上的电平,只能通过令SDA接地或不接地来实现输出0或1,而无法通过接地或接VCC来实现输出0或1.这就要求IIC总线上必须是默认上拉的,否则从机无法令SDA为高
为什么要用开漏
主机如果使用了推挽,当主机释放SDA时(令SDA=1时),相当于SDA被接通到VCC,这时从机无法控制SDA为0;
主机如果使用了开漏,当主机释放SDA时(令SDA=1时),相当于SDA被悬空上拉到VCC,这时从机可以拉低SDA,使SDA=0,也可以释放SDA使SDA=1,这样从机才能发数据。
另外使用推挽输出会造成短路
在这里插入图片描述
IIC总线框图
改图为转载图

I2C协议层

I2C的协议定义了通讯的起始和停止信号,数据有效性,响应,仲裁,时钟同步和地址广播等环节。
在这里插入图片描述
数据传输主机产生一个起始信号,接着后面跟着一个广播从机地址,告诉总线我要和这个从机地址
进行通信,从机地址后面跟着一位用来标识是读(1)还是写(0),A标识应答位,当从机设备发现这个地
址和自己的地址一致时,向主机发出这个应答位,主机接到第一次应答信号后就可以接着发送数据了,
每次发送的数据过后会根据从机的应答或者非应答来决定是否继续发数据,但非应答信号产生后主
机主动发送一个停止信号P
在这里插入图片描述
起始信号,从机地址,结束信号都是由主机产生的,S+SLAVEADDRESS+R/W的语法格式跟主机读
从机的格式时一样的,不同的是现在的数据是由从机向主机传输,应答位有主机产生,但是P停止信号
依旧由主机产生
在这里插入图片描述
复合格式比较特殊,它有两个起始信号, 第一个起始信号发出后接着的地址是一个从机设备
地址
,得到从机响应后,跟着的DATA是从机设备的内部地址,表示要读的是从机存储设备的
内部地址
,Sr重新开始一个起始信号,按照读从机设备数据的协议读取从机数据,该数据从发出
的DATA地址开始读

起始信号(S)和停止信号§的表示
在这里插入图片描述
总线上的从机设备会实时监听总线上的SCL和SDA线,当发现有起始信号的时候(上课打铃)
,比较后面跟着的设备地址是否跟自己一致,一致的话就应答(点名,点到喊到!),当发现有停止
信号时结束传输(下课铃响)

数据有效性

每个比特位用一个SCL周期传输,比如产用7位从机地址时,需要7个SCL周期传输,特别注意的是
有些I2C驱动将7位地址位和1位读写位看成一个8位设备地址来传输

响应:
在这里插入图片描述
相当于老师喊话:“小红在吗???”,然后老师安静了(发生端释放SDA控制权),如果小红在的话回应到(应答信号),
不在话小红就没说到(非应答信号)

框图

在这里插入图片描述
SCL部分
在这里插入图片描述
CCR寄存器第15位可选择I2C通讯的"标准/快速"模式,这两个模式分别对应的100/400Kbit/s的通讯速率
在这里插入图片描述
标准模式或SMBus模式
Thigh表示输出高电平的时间,我们的I2C总线是挂载在PCLK1总线上的,所以为36Mhz,Thigh = CCR
寄存器填写在0到11的值乘以1/36Mhz,Tlow与其类似,所以一个I2C周期等于Thigh+Tlow=2CCR1/36
快速模式
设置CCR寄存器第14位改变占空比,根据DUTY的值的不同计算不同的Thigh和Tlow
例子:
快速模式中(Tlow/Thigh=2)时,TSCL=3CCRTpckl1
在这里插入图片描述
SDA部分
在这里插入图片描述
1.当我们需要使用I2C发送一个字节数据时我们只需要将数据写入数据寄存器DR[7:0],数据寄存器会将
数据发送到数据移位寄存器,I2C协议是先发送高位数据的,数据移位寄存器就是将数据寄存器并行发
送来的数据串行一位位发送出去,接受数据时反过来,道理也是一样
2.地址寄存器用来跟总线上发来的地址进行比较,作为从机的角度,如果一致则响应
3.PEC寄存器用来数据校验的
CR1,CR2,SR1,SR2控制器部分
CR1和CR2寄存器用来发送起始信号,停止信号,具体见F103中文参考手册
SR1和SR2寄存器用来检测是否有应答,数据状态寄存器是否为空,总线是否忙等状态的消息,具体见F103中文参考手册
在这里插入图片描述
F103ZET6硬件I2C硬件
在这里插入图片描述

通讯过程

在这里插入图片描述
上面一行表示控制寄存器发送的内容,下面一行表示转台寄存器检测的内容,也就是说我们的控制寄存器每做一个步骤,
相应的状态寄存器会产生一个相应的事件来检测,通过标志位来检测是否成功,等待工作完成后再继续,避免乱序

S信号:往I2C_CR1的第8位写入1,会产生一个起始信号
EV5事件:I2C_SR1的第0位(SB位)置1,根据SB位判断是否产生起始信号
EV6事件:,I2C_SR1的第1位(addr位)置1表示地址发送结束,
EV8事件:,I2C_SR1的第7位(TxE位)置1表示数据寄存器为空,数据发送成功,当数据寄存器为空又可以发送下一个数据
EV8_2事件:,I2C_SR1的第2位(BTF位)置1,表示数据移位寄存器为空才可以产生停止信号
在这里插入图片描述
在这里插入图片描述
EV7事件:表示接受到了数据,SR1寄存器的第6位RxNE置1
这里的在这里插入图片描述在这里插入图片描述省略了EV8是因为是主机发送模式,不用检测主机的(发送)数据寄存器是否为空,只需要接受数据
其他事件和上面的一致
Ev7_1事件:,发送倒数第二个数据时这设置成无ACK信号,还要设置STOP信号

发布了83 篇原创文章 · 获赞 3 · 访问量 1260

猜你喜欢

转载自blog.csdn.net/qq_41936794/article/details/104889634
I2C
今日推荐