打印
[牛人杂谈]

新唐51系列的I2C收发器

[复制链接]
1986|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
对于双向传输操作,SDA 及SCL 引脚必须配置成开漏模式,形成逻辑线与功能:总线上当有一个器件输出0,总线上就是0电平,所有器件全输出1,总线上才是高电平,需要通过外接上拉电阻把电平拉高。ML51 在设置I2CEN使能I2C功能之前,必须把SCL,SDA的输出锁存在逻辑1的状态。


I2C 空闲时,两条线都为高。这时任一设备都可以做为主机发个起始位 START 开始数据传输,在停止位 STOP 出现之前,总线被认为处于忙状态。主机产生串行时钟脉冲以及起始位和停止位。如果总线上没有START起始信号,则所有总线设备被认为未被寻址从机,硬件自动匹配自己的从机地址或广播呼叫地址,(广播地址可由 GC (I2CnADDRx.0)使能或禁止.)。若地址匹配,就产生中断。
I2C总线上传输的每个字节都包含8个数据位(MSB优先)和一个应答位,共9位。但每次传输的字节个数没有明确界定(起始位 START 和停止位 STOP之间的字节个数) ,但每个字节都应有一个应答位。主机产生8个时钟脉冲,以传输8位数据。在第8个时钟SCL下沿后,由SDA脚输出数据后,SDA转为输入模式在第9个时钟脉冲以读取第9位应答位。在第9个时钟脉冲后,数据接收端若没准备好接收下一个字节,可以拉住时钟线保持低,让传输挂起。接收端释放时钟线SCL以后,传输继续。



使用特权

评论回复
沙发
xinxianshi|  楼主 | 2020-11-17 22:27 | 只看该作者
开始和停止条件
I2C 总线时序定义了起始START (S)和结束STOP (P)的条件。时钟SCL为高时,数据线SDA由高电平至低电平的跳变被认为是起始START标志。时钟SCL为高时,数据线SDA由低电平至高电平的跳变被认为
是结束STOP标志。起始和结束都由主机产生,起始和结束之间被认为是总线忙状态。当成功判定结束条件以后,主机释放总线,所有设备都回到监听总线起始位状态,之前被呼叫从机也转为未寻址从机。
I2C总线进入空闲状态等待下一个起始START信号,开始下一次传输。
主机若发出停止位STOP,传输就停止了。然而,主机也可以不发停止位,而是再次发出起始START信号(Sr)继续和上个地址通信,或者换个地址继续通信。各种读/写组合格式操作可能存在一个传输中。


使用特权

评论回复
板凳
xinxianshi|  楼主 | 2020-11-17 22:30 | 只看该作者
7位地址数据格式
起始位 START 之后, 第一个字节必须是“7位地址SLA+第8位读写方向位(读/写)”,用以定义目标从机地址以及从机写入或读出数据。若第8位是0,即SLA+W,表示下个字节开始主机向从机写数据;若是1,
即SLA+R,就表示下字节开始,主机向从机读数据。一个地址包包含一个从机地址和一个读或写位叫SLA+R 或 SLA+W。所以,一个典型数据包含起始位 START,SLA+W/R,一个或多个字节数据,最后
是停止位 STOP。当一个从机已被定址及读写方向通过字节SLA+W/R,随后的8位数据就跟随之前的读写设定进行传输。

使用特权

评论回复
地板
xinxianshi|  楼主 | 2020-11-17 22:33 | 只看该作者
主机发送数据给一个7位地址从机。主机定址一个7位地址从机和1位写方向来表明主机想发送数据给从机。在从机返回一个应答信号后,主机将发送数据。

使用特权

评论回复
5
xinxianshi|  楼主 | 2020-11-17 22:40 | 只看该作者


使用特权

评论回复
6
xinxianshi|  楼主 | 2020-11-17 22:45 | 只看该作者
应答Ack
每字节传输SCL第9个脉冲用于传输应答位 (ACK)。通过将SDA拉低,来允许接收端(可以是主机或是从机)回应发送端(可以是主机或从机)。应答位时钟由主机产生。发送端设备在应答位时钟高电平周期内,需释放对SDA的控制。ACK 为一个低电平信号。在应答位时钟周期的高电平时,SDA保持低电平用以表示接收端已成功接收到发送端的数据。通常被寻址的从机在整个传输过程中每字节都需要回复应答位。当该从机接收无法应答(NACK)从机地址时,从机将SDA线保持高以便主机产生停止(STOP)或发送重复开始(START)信号。
若从机接收没有应答从机地址后,将自身切换到未定址从机模式,从而无法接收更多数据字节。这时从机将SDA线拉高,此时主机应发送停止STOP信号或重复起始(repeated START)信号。
若是主机接收,主机控制着收发字节个数,主机在最后一个字节收发结束后不发应答位信号,从机端将切换为未定址从机模式,并释放SDA线,以便主机直接发停止位STOP 或重开始位START。


使用特权

评论回复
7
xinxianshi|  楼主 | 2020-11-17 22:54 | 只看该作者
仲裁
主机仅可在总线空闲时发起传输。可能有多个器件同时发开始位START试图发起数据传输,这时就会出现总线仲裁。在该状态下,当SCL为高时,SDA上呈现仲裁信号。在仲裁过程中,第一个发起主机对
SDA线置1(高电平)而另一个主机发送0(低电平),发送后主机会对SDA线上信号与自己发出的信号进行比较,由于“线与”的原因,时钟SCL为高时,发送0的主机会成功,而发送1的主机会失败。发送
失败的主机立刻切换自身到未被寻址的从机状态,以确保自身能被仲裁胜利的主机寻址到。同时也释放数据线,并回到地址侦测状态,仲载失败的主机,仍会发送时钟,直到当前字节结束。
仲裁机制让每个主机发送数据时,都会同时比较总线上的数据是否与自己发送的一致。注:如果其它主机发送0,发送1的主机会在仲裁中失败,仲裁会持续到总线上只有一个主机。如两个主机同时向一个从
机发数据时,地址相同,仲裁会持续比较数据位或应答位。

使用特权

评论回复
8
xinxianshi|  楼主 | 2020-11-17 22:56 | 只看该作者

使用特权

评论回复
9
xinxianshi|  楼主 | 2020-11-17 22:57 | 只看该作者

使用特权

评论回复
10
xinxianshi|  楼主 | 2020-11-17 23:19 | 只看该作者

使用特权

评论回复
11
xinxianshi|  楼主 | 2020-11-17 23:21 | 只看该作者

使用特权

评论回复
12
xinxianshi|  楼主 | 2020-11-17 23:22 | 只看该作者

使用特权

评论回复
13
xinxianshi|  楼主 | 2020-11-17 23:22 | 只看该作者

使用特权

评论回复
14
xinxianshi|  楼主 | 2020-11-17 23:23 | 只看该作者


所以可以看出,I2C功能虽然很强,但是很复杂,很多人更喜欢用SPI接口。

使用特权

评论回复
15
答案很长吧| | 2020-11-18 09:40 | 只看该作者
这个I2C讲述的特别的透彻,能够学到一些东西。

使用特权

评论回复
16
qewnja| | 2020-11-18 15:09 | 只看该作者
我是用io模拟的,官方代码有问题,唉

使用特权

评论回复
17
paotangsan| | 2020-12-4 09:52 | 只看该作者
新唐的iic运行起来稳定吗

使用特权

评论回复
18
renzheshengui| | 2020-12-4 09:53 | 只看该作者
无论什么芯片 其实这个通讯的原理都是一样的

使用特权

评论回复
19
wakayi| | 2020-12-4 09:55 | 只看该作者
为什么iic不如spi受欢迎呢

使用特权

评论回复
20
wowu| | 2020-12-4 10:00 | 只看该作者
用iic模拟的话 调试起来比较慢啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

879

帖子

1

粉丝