【协议】IIC通信
1、传输时,SCL为高电平时SDA须保持稳定,SCL为低电平是SDA才能变化
2、SCL为高时SDA由高变低为起始dive in
SCL为高时SDA由低变高为终止pull out
3、应答与非应答
应答:从机应答位一帧数据的第九位为0;
非应答:从机应答位一帧数据的第九位为1;
主机在发送数据时,每发送一字节数据后都会向从机读取应答位
当从机为应答时,表示从机空闲
当从机为非应答时,表示从机繁忙,主机读到非应答时应发出终止信号
因此主机可以通过应答位来判断从机是否成功接收数据;
主机在接收数据时,当收到最后一个数据后,对从机发送非应答,从机释放SDA,允许主机终止。
4、数据帧
起始信号后跟一帧地址,其中七位为ADDR,位为方向
如:
发送:主机发送起始信号 >> 主机发送七位地址及一位方向0 >>
主机读取从机应答信号 >> 主机发送首地址 >> 主机读取从机应答信号 >>
主机发送数据 >> 。。。>> 读到非应答 >> 从机繁忙 >> 主机发送终止信号;
void Send_EPR_Byte(uchar ADDR, uchar dat) { IIC_Start(); IIC_SendByte(0xa0); if(IIC_WaitAck()) ackflag = 1; else ackflag = 0; IIC_SendByte(ADDR); if(IIC_WaitAck()) ackflag = 1; else ackflag = 0; IIC_SendByte(dat); if(IIC_WaitAck()) ackflag = 1; else ackflag = 0; IIC_Stop(); }
读取:主机发送起始信号 >> 主机发送地址及方向0>>
主机读取从机应答信号 >> 主机发送首地址 >> 主机读取从机应答信号 >> 换向 >>
主机发送起始信号 >> 主机发送从机地址及方向1 >> 主机读取从机应答信号 >>
主机读取数据 >> 主机发出非应答 >> 从机释放SDA >> 主机发送终止信号
uchar Read_EPR_Byte(uchar ADDR) { uchar dat; IIC_Start(); IIC_SendByte(0xa0); if(IIC_WaitAck()) ackflag = 1; else ackflag = 0; IIC_SendByte(ADDR); if(IIC_WaitAck()) ackflag = 1; else ackflag = 0; IIC_Start(); IIC_SendByte(0xa1); if(IIC_WaitAck()) ackflag = 1; else ackflag = 0; dat = IIC_RecByte(); IIC_WaitAck(); IIC_Stop(); return dat; }
个人对IIC的概念还存在模糊,如上定义不时修改,欢迎指正