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信号

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I2C通信协议是一种串行总线协议,它允许多个设备在同一条总线上进行通信。在I2C总线上,每个设备都有一个唯一的地址,可以通过这个地址与其他设备进行通信。下面是I2C通信协议的详细讲解: 1. 总线结构 I2C总线结构包括两根信号线:SCL和SDA。SCL是时钟线,由主设备负责产生;SDA是数据线,用于传输数据。 2. 通信方式 I2C通信协议主要分为两种方式:传输数据和发送命令。在传输数据时,从设备首先向主设备发送一个应答信号(ACK),主设备接收到应答信号后,才会继续发送数据。在发送命令时,主设备向从设备发送命令并等待从设备的应答信号。 3. 传输数据 在I2C总线上传输数据时,每个字节都由8位二进制数字组成。在传输一个字节之前,主设备必须向从设备发送一个起始信号(Start Bit),表示一个新的传输过程开始了。然后主设备会先发送从设备的地址(包括读/写位),然后等待从设备的应答信号。如果从设备存在,并且它的地址与主设备发送的地址匹配,那么它会发送一个应答信号。接下来主设备会开始发送数据,每发送一个字节就等待从设备的应答信号。当主设备发送完最后一个字节后,它会发送一个停止信号(Stop Bit),表示这次传输已经结束了。 4. 发送命令 在I2C总线上发送命令时,主设备首先向从设备发送命令,并等待从设备的应答信号。如果从设备存在,并且它的地址与主设备发送的地址匹配,那么它会发送一个应答信号。接下来主设备可以向从设备发送一个或多个字节的数据,然后等待从设备的应答信号。当主设备完成数据传输后,它会向从设备发送停止信号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值