求助IIC总线协议!

lizhonglei201   2009-5-6 22:08 楼主
请问IIC的应答信号是怎样产生的?
SDA为0就应答,SDA为1就非应答,那SDA的值是怎样赋值的?
还有,是不是应答或非应答都可以传输下一帧数据?如果是的话那两者有什么意义?

回复评论 (9)

SCL,SDA这两根线上都有上拉电阻, 所以默认是高电平的(即1)。
主机向设备发送设备地址时, 如果设备不存在或不响应, 第9位将保持默认电平(1)。如果设备应答, 则把信号驱动为低电平(即0)。
点赞  2009-5-6 23:09
如果单片机的话 直接对SDA管脚赋值
如果是外接的IIC器件 它自己会遵守IIC协议
如果不应答的话就是不遵守协议 必然不能传输下一帧数据
点赞  2009-5-6 23:11
我的是单片机,那是不是要我自己给SDA赋值啊?

引用: 引用 2 楼 qzf368 的回复:
如果单片机的话 直接对SDA管脚赋值
如果是外接的IIC器件 它自己会遵守IIC协议
如果不应答的话就是不遵守协议 必然不能传输下一帧数据
点赞  2009-5-6 23:27
如果是IIC控制器的话,需要设置相关的寄存器,如果用io引脚的话,直接赋值就可
点赞  2009-5-7 02:06
是不是应答或非应答都可以传输下一帧数据?如果是的话那两者有什么意义?

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

这么自信的话,那可以

不过从可靠性来说,还是别这么做了,老老实实
点赞  2009-5-7 08:42
引用: 引用 3 楼 efenwu 的回复:
我的是单片机,那是不是要我自己给SDA赋值啊?

引用 2 楼 qzf368 的回复:
如果单片机的话 直接对SDA管脚赋值
如果是外接的IIC器件 它自己会遵守IIC协议
如果不应答的话就是不遵守协议 必然不能传输下一帧数据

你用的单片机肯定有I2C控制器吧~
把它设为从设备~
人家会自己发的~

你只要配置配置寄存器,看看有没有连通,然后在中断里面干事就成了~
点赞  2009-5-7 10:34
关于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等容错处理。
点赞  2009-5-7 15:36
引用: 引用 6 楼 lmlmlmnew 的回复:
引用 3 楼 efenwu 的回复:
我的是单片机,那是不是要我自己给SDA赋值啊?

引用 2 楼 qzf368 的回复:
如果单片机的话 直接对SDA管脚赋值
如果是外接的IIC器件 它自己会遵守IIC协议
如果不应答的话就是不遵守协议 必然不能传输下一帧数据


你用的单片机肯定有I2C控制器吧~
把它设为从设备~
人家会自己发的~

你只要配置配置寄存器,看看有没有连通,然后在中断里面干事就成了~

很明显楼主是模拟IIC协议
估计单片机是主控芯片 时钟由单片机给出 到时候检测SDA的电平就行了
要是集成的话就不用管了
点赞  2009-5-7 23:55
不就是用单片机产生IIC需要的SDA,SCI脉冲,从而能够写你要扩展的器件。
那个赋值SDA=0这样的,当然你要为SDA分配I/O口
点赞  2009-5-12 22:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复