集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 4148|回复: 8

IIC(I2C)总线协议

[复制链接]
admin 发表于 2010-4-27 09:26:33 | 显示全部楼层 |阅读模式
关于IIC协议的实现,不同的芯片的实现方式可能不同(MCU内部),但是输出到数据线和时钟线上的信号肯定是符合标准IIC协议的。我以前做过瑞萨公司的M16c与R32芯片的IIC通信驱动程序。以此为例:IIC上的主控器(产生时钟的MCU)在发送1BYTE数据时,都是9bit送信,也就是说SCL线产生9个时钟信号。软件方面做得就是将要发送的一个字节放入Uart串口(该Uart串口需要初始化为IIC通信模式)。Uart串口为两个字节长,我们在第九个bit位赋值为1,这样就相当于释放了SDA线,从器件判定数据有效可以接受时会在第九个时钟周期上将SDA线设置为0(SDA线为线与的模式,原理和0/1与是一样的),这样就产生了一个ACK应答,反之,则是一个NACK应答。这是主控器的情况。如果是从设备,那么应答应该可以由硬件产生。
关于接受ACK和NACK是否在可以在发送下一个数据的问题。如果你想继续发送,那么肯定是可以的。毕竟程序的逻辑是人来定的,但是这样做没有什么意义,通常的作法是进行Retry处理。如果多次NG,只能给上层返回Error等容错处理。
 楼主| admin 发表于 2010-4-27 09:26:49 | 显示全部楼层
请问IIC的应答信号是怎样产生的?
SDA为0就应答,SDA为1就非应答,那SDA的值是怎样赋值的?
还有,是不是应答或非应答都可以传输下一帧数据?如果是的话那两者有什么意义?
 楼主| admin 发表于 2010-4-27 09:27:03 | 显示全部楼层
SCL,SDA这两根线上都有上拉电阻, 所以默认是高电平的(即1)。
主机向设备发送设备地址时, 如果设备不存在或不响应, 第9位将保持默认电平(1)。如果设备应答, 则把信号驱动为低电平(即0)。
 楼主| admin 发表于 2010-4-27 09:27:21 | 显示全部楼层
如果是IIC控制器的话,需要设置相关的寄存器,如果用io引脚的话,直接赋值就可
 楼主| admin 发表于 2010-4-27 09:27:33 | 显示全部楼层
是不是应答或非应答都可以传输下一帧数据?如果是的话那两者有什么意义?

如果你的系统真的可靠到连应答都不用去确认的情况下,

这么自信的话,那可以

不过从可靠性来说,还是别这么做了,老老实实
liuxiang900816 发表于 2011-11-12 22:35:00 | 显示全部楼层
在VHDL中 sda口  也就是外部器件sda连接fpga的fpga上的那个引脚 应该怎么定义  是INOUT吗??
那么输入输出数据 时  这个引脚怎么控制才会正确???
zombes 发表于 2011-11-13 12:10:50 | 显示全部楼层
回复 6# liuxiang900816
因为硬件上,sda scl两根线要上拉电阻,也就是无信号时,两根线都是高电平。同时,IIC通信是互相的,FPGA会一直检测两条线的电平变化,根据自身寄存器状态判断是输入还是输出。定义时就要定义成inout,输出时,直接发数据,输入时,为高阻
liuxiang900816 发表于 2011-11-13 19:38:23 | 显示全部楼层
是不是就是输入时  我要给这个引脚一条 inout<='z';的语句之后才能正确判断上面接收得数据??
fpgaw 发表于 2012-9-1 06:18:07 | 显示全部楼层
i2c总线规范英文版

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-26 07:41 , Processed in 0.070870 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表