通信协议--IIC协议

tech2024-07-24  36

IIC协议

两条线:双向串行数据线SDA,串行时钟线SCL;

支持多个设备的总线,每个连接到总线上的设备都有一个独立的地址,通过不同的地址访问不同的设备。主机通过SDA线发送地址查找从机,7位地址支持127个设备挂载(0号是群呼地址),第8位表示读写位(0写,1读);

数据有效性
SDA线数据在SCL高电平周期必须稳定;

起始条件和停止条件
起始条件:SCL高电平时,SDA由高定平向低电平转换;停止条件:SCL高电平时,SDA由低电平向高电平转换。

数据传输格式
传输每字节8位,总字节数不受限制,每字节后必须跟一个响应位ACK;在第九个时钟,发送端释放SDA控制权,将SDA电平拉高,由接收方控制,接收方拉低电平ACK,反之NACK;传输按照MSB大端字节序

51单片机GPIO模拟2实现IIC通信
sbit SCL=P1^0; sbit SDA=P1^1;//绑定SCL、SDA管脚 #define H 1;//高电平 #define L 0;//低电平 void i2c_start(void)//IIC启动 { SDA = H; SCL = H; delay(); SDA = L;//时钟线高电平时拉低SDA电平,IIC启动条件 delay(); SCL = L;//拉低时钟,数据传输电平改变需要在低电平时刻 } void i2c_stop(void)//IIC停止 { SDA = L;//预拉低电平 SCL = H; delay(); SDA = H;//时钟线高电平时,SDA上升沿,IIC停止条件 } void i2c_ack(void)//IIC产生应答信号 { SDA = L;//拉低SDA,ACK应答 delay(); SCL = H; delay(); SCL = L; delay(); SDA = H;//释放SDA线 } void i2c_nack(void)//IIC产生非应答信号 { SDA = H;//拉高SDA,NACK应答 delay(); SCL = H; delay(); SCL = L; delay(); } //判断设备应答信号是ACK还是NACK //返回1表示产生应答信号,返回0表示产生费应答信号 uint8_t i2c_waitAck(void) { uint8_t ret; SDA = H;//发送方释放SDA控制权 delay(); SCL = H;//产生下一个时钟信号,等待从设备返回应答 delay(); if( SDA != L) { ret = 0; }else{ ret = 1; } SCL = L; delay(); return ret; } void i2c_sendByte(uint8_t byte)//传输一个字节 { uint8_t i; for(i=0; i<8; i++)//发送8个位 { if(byte & 0x80)//判断最高位是0或1 { SDA = H; }else{ SDA = L; } delay(); SCL = H;//下一个时钟 delay(); SCL = L; if( 7==i ) { SDA = H;//拉高,释放控制权 } byte <<= 1;//左移一位 delay(); } } uint8_t i2c_readByte(void)//IIC接收字节数据 { uint8_t i,value=0; for(i=0; i<8; i++) { value <<= 1; SCL = H; delay(); if( SDA==H )//接收一位数据,高电平置1 { value++; } SCL = L; delay(); } return value; }
最新回复(0)