完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
什么是IIC协议
I2C(Inter-Integrated Circuit)通讯协议是由 Phiilps 公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。 IIC通信由两根线构成,一根为信号线(SDA),另外一根为时钟线(SCL)。故IIC通信的物理层构成如下: 注意!此处的信号线与地址线都是总线。只要有一对设备在使用,总线1便被占用,其他设备不能使用。 为了区分设备,每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。当有多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。 这里解释一下这个“地址“。这个地址是IIC设备的地址,在IIC通信中,需要指定传送设备的地址。这个应该很容易理解,最常用的IP协议也有IP地址之说,TCP协议也有端口之说。不指定地址,就无法得知数据要发送到哪里去,通信就无法构成。这个不需要过多赘述。 但笔者在刚刚开始使用时,不知道这个地址究竟是以哪一种形式存在在通信中的。在MCU中,初始化IIC接口时,就需要你定义一个IIC地址,这就是你这个IIC接口的通信地址了(一般都是0)代码如下: hi2c1.Init.OwnAddress1 = 0; 而我们一般用的IIC芯片的地址,如何得知呢?这个地址是以什么形态存在的?是连上MCU后MCU分配的吗? IIC芯片的地址,都由IIC芯片自身决定。而且一般来说,都会提供几位(多数为3位)给用户自定义。拿LM75A温度传感器芯片来说,IIC通信地址为7bit,前4位是固定的(1001)后三位提供给用户自定义,做在引脚上通过用户输入的电平来决定地址位的高低。用户输入低电平,表示该位为0,用户输入高电平,表示该位为1。若把低三位拉低,地址就为0x90。如图: 协议层 S 表示传输起始信号,此时连接到 I2C 总线上所有的从机都会接收到这个信 号。 Slave Address 表示从机地址,此地址可以是 7 位或 10 位。当主机广播的地 址与某个设备地址相同时,这个设备就被选中了。 之后就是 R/W(传输方向选择位),该位为 0 时,表示后面的数据传输方向 是主机会写信息到被选中的从机;为 1 表示主机会向从机读信息。 当从机已经和从机“匹配”好了,那么此时主机或从机会返回一个应答(ACK) 或非应答(NACK)信号,只有收到信号后,主机才会继续发送或接收数据。这里的“继续”之所以提出来是因为发送和接收,对应从机发出的应答信号和主机发出的应答信号,是重复的。 当主机向从机发送一个停止信号(P),表示不再传输数据。当主机希望停止 接收时,向从机返回一个(NACK),则从机自动停止数据传输。 这是IIC通信的数据帧。可以看出。通信由1位的起始信号,7位地址位,1位表示读写的信号位,一位ACK应答信号,一字节的数据位,1位ACK应答信号,一字节数据位……直到数据全部发送完毕,产生一位终止位。 而IIC通信还支持一种比较复杂的通信模式。通信时和设备的某一寄存器进行通信。如图下方的数据帧。数据帧内发送了两段起始信号S。在第一段数据的DATA中,常常用于表示内部的寄存器地址,在第二次传输中,则是对内部的寄存器进行访问和读写 以上是IIC通信协议层读写的基本过程。 下面我们进一步了解每一个信号在IIC协议中是如何规定的 起始信号和停止信号 起始信号和终止信号是两种特殊的状态,如图 ,当 SLC 为高电平时 SDA 由 高电平向低电平切换,表示通讯的起始;当 SCL 是高电平时 SDA 由低电平向高电平切换,表示通讯的停止。这两种信号一般由主机产生。如图: 数据的有效性 I2C 的 SDA 用来传输数据,SCL 进行数据的同步,如下图。SDA 数据线在SCL 的每个时钟周期传输一位数据。有效和无效看图即可,需要主要的是当 SCL为低电平时,SDA 数据无效,一般此时 SDA 进行电平转换,为下一次表示数据做好准备 传输方向依靠R/W位来判断 应答信号:响应包括应答(ACK)和非应答(NACK)两种。当设备(主机或从机)接收到 I2C 传输的一个字节数据后,若希望对方继续发送数据,则需要向对方发送应答(ACK)信号,发送方则会继续发送数据;若接收端希望结束数据传输,则向对方发送非应答(NACK)信号。发送方收到后会产生停止信号,结束数据发送。 以上为IIC协议层内容。STM32的IIC架构和STM32中的IIC接口如何使用,下一部分来提及。 |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2433 浏览 0 评论
3341 浏览 9 评论
3021 浏览 16 评论
3514 浏览 1 评论
9118 浏览 16 评论
1242浏览 3评论
635浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
627浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2373浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1936浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-23 08:07 , Processed in 1.158319 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号