IIC(I2C)总线协议
关于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等容错处理。 请问IIC的应答信号是怎样产生的?
SDA为0就应答,SDA为1就非应答,那SDA的值是怎样赋值的?
还有,是不是应答或非应答都可以传输下一帧数据?如果是的话那两者有什么意义? SCL,SDA这两根线上都有上拉电阻, 所以默认是高电平的(即1)。
主机向设备发送设备地址时, 如果设备不存在或不响应, 第9位将保持默认电平(1)。如果设备应答, 则把信号驱动为低电平(即0)。 如果是IIC控制器的话,需要设置相关的寄存器,如果用io引脚的话,直接赋值就可 是不是应答或非应答都可以传输下一帧数据?如果是的话那两者有什么意义?
如果你的系统真的可靠到连应答都不用去确认的情况下,
这么自信的话,那可以
不过从可靠性来说,还是别这么做了,老老实实 在VHDL中 sda口也就是外部器件sda连接fpga的fpga上的那个引脚 应该怎么定义是INOUT吗??
那么输入输出数据 时这个引脚怎么控制才会正确??? 回复 6# liuxiang900816
因为硬件上,sda scl两根线要上拉电阻,也就是无信号时,两根线都是高电平。同时,IIC通信是互相的,FPGA会一直检测两条线的电平变化,根据自身寄存器状态判断是输入还是输出。定义时就要定义成inout,输出时,直接发数据,输入时,为高阻 是不是就是输入时我要给这个引脚一条 inout<='z';的语句之后才能正确判断上面接收得数据?? i2c总线规范英文版
页:
[1]