20150716看到这里有点奇怪,i2c write是以ack+stop结束通信,而i2c read是以nack+stop结束通信的,原因如下: i2c write的时候,master在写完最后一个字节之后slave会回ACK,然后master发送stop信号结束通信 i2c read的时候,master在接收完slave发送的最后一个字节之后会回NAK,因为这个时候master已经接收到足够的字节,NAK告诉s...
WriteI2cAddr, WaitACK, WriteRegAddr, WaitAck, Start, WriteI2cAddr, WaitAck Read, Ack Read, Ack ... Read, NAck Stop
RA为Read Ack(发送字节后出现)、SA为Send Ack(读到字节后出现),”0“为应答、”1“为非应答。 这个时序为什么可以指定读的寄存器地址呢?把指定地址写的时序前面指定地址的部分,加到当前地址读的前面,就得到了指定地址读的时序,也叫做复合格式。前面写入的寄存器地址会存在地址指针里面,不会随着时序的变化而消失,...
I2CDelay(); I2C_SCL = 0; //再拉低SCL完成应答位,并保持住总线 return (~ack); //应答值取反以符合通常的逻辑: //0=不存在或忙或写入失败,1=存在且空闲或写入成功 } /* I2C总线读操作,并发送非应答信号,返回值-读到的字节 */ unsigned char I2CReadNAK() { unsigned char mask; unsigned char ...
unsigned char I2CReadACK() { unsigned char mask; unsigned char dat; I2C_SDA = 1; //首先确保主机释放SDA for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行 { I2CDelay(); I2C_SCL = 1; //拉高SCL if(I2C_SDA == 0) //读取SDA的值 ...
③ i2c读多个字节:start + { slv_addr + wait_ack } + { reg_addr + wait_ack } + { (slv_addr+1) + wait_ack } + read_byte + ... + stop 这里的(slv_addr+1)指的是地址最后一位置1表示读。 注意SCCB与I2C的规则几乎完全一样,除了读字节,SCCB是在写完从机地址和寄存器地址之后,要stop并...
大家仔细观察一下,这个程序,我们读取EEPROM的时候,只读了一个字节我们就要告诉EEPROM不需要再读数据了,因此我们读完后直接回复一个“NAK”,因此我们只调用了I2CReadNAK()这个函数,而并没有调用I2CReadACK()这个函数。我们今后很可能读数据的时候要连续读几个字节,因此这个函数写在了I2C。c文件中,作为I2C功能模块的一...
② 老师提醒某个学生要发球,表示发送地址和方向(address/read/write); ③ 该学生回应老师(ack); ④ 老师发球/接球,表示数据的传输; ⑤ 收到球要回应:回应信号(ACK); ⑥ 老师说结束,表示IIC传输结束。 以上就是I2C的传输协议,如果是使用IO口来模拟I2C协议,那么就得需要依次实现上述每个步骤。
case I2C_MASTER_ERR_ADDR_ACK:XX7299A_I2CRead(I2C_BASE,REG_ADDR,ID);break; case I2C_MASTER_ERR_DATA_ACK:XX7299A_I2CRead(I2C_BASE,REG_ADDR,ID);break; case I2C_MASTER_ERR_ARB_LOST:XX7299A_I2CRead(I2C_BASE,REG_ADDR,ID);break; ...
一、I2C ACK error 在应该收到 ACK 信号的时候没有收到 ACK 信号,i2c controller 就会产生一个 ACK error 的中断,告诉 i2c driver 发生了 ACK error。通常情况是 slave 本身的问题。 1、检查 device 是否存在,i2c bus number 和 device address 是否正确。示例如下:i2c number 为 6,addr 为 0x28: ...