完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
概述IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。I²C的正确读法为“I平方C”("I-squared-C"),而“I二C”("I-two-C")则是另一种错误但被广泛使用的读法。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取I²C从属设备地址。 接口I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。设备上的串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。而串行时钟线也应是双向的,作为控制总线数据传送的主机,一方面要通过SCL输出电路发送时钟信号,另一方面还要检测总线上的SCL电平,以决定什么时候发送下一个时钟脉冲电平;作为接受主机命令的从机,要按总线上的SCL信号发出或接收SDA上的信号,也可以向SCL线发出低电平信号以延长总线时钟信号周期。总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系。 因此SDA和SCL 可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平。 IIC 总线上数据的传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s 在高速模式下可达 3.4Mbit/s。 通信协议SDA 线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。 空闲状态SDA为高电平,SCL为高电平。 起始状态其中一种情况是在 SCL 线是高电平时 SDA 线从高电平向低电平切换,产生一个 下降沿 ,这个情况表示起始条件。 结束状态当 SCL 是高电平时 SDA 线由低电平向高电平切换,产生一个 上升沿 ,这个情况表示停止条件。 传输数据器件地址位由于IIC总线上可能挂载着多台设备,所以主设备在传输有效数据之前要先指定从设备的地址, 大多数从设备的地址是7位的,还有部分设备支持10位寻址 ,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址。将数据发送至SDA数据线上即可。 读写位紧接着的第 8 位是数据方向位(R/ W) ----'0'表示发送(写),'1'表示请求数据(读)。 应答信号位主设备每发送完8bit数据后等待从设备的ACK。 即在第9个clock,若从设备发ACK,SDA会被拉低。 若没有ACK,SDA会被置高,这会引起主设备发生RESTART或STOP流程,当ACK=0时为有效应答位,说明从机已经成功接收到该字节,若为1则说明接受不成功。 数据地址位当找到往哪个设备写数据之后,就开始寻址往这个设备的特定地址写数据,和上述的发送器件地址一样,直接将地址数据发送至SDA线即可。 数据位发送到 SDA 线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制,每个字节后必须跟一个响应位,首先传输的是数据的最高位 (MSB) 。 示例设置器件地址为0x78(0111 1000),数据地址为0x40(0100 0000),写入数据0xAA(1010 1010)。
查看HAL_I2C_Mem_Write说明可以得知,目标设备地址在调用接口之前,数据表中设备的7位地址值必须左移;即发送到从设备的数据已经右移了一位,所以0x78(0111 1000)右移一位变成0x3c(011 1100)。
通过示波器抓取的波形如下所示。
上述为成功传输的例子,若不成功传输,设置器件地址为0x77(0111 0111),数据地址为0x40(0100 0000),写入数据0xAA(1010 1010)。
由于地址位0x77(0111 0111)右移一位,故发送出去的为0x3B(011 1011),通过示波器抓取的波形如下所示。
|
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
878 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
936 浏览 2 评论
2044 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1145 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1568 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 17:11 , Processed in 0.574999 second(s), Total 42, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号