IIc通信协议
bit ReadACK()
{
SCL = 0;//拉低时钟总线,允许从机控制SDA
SCL = 1;//拉高,读SDA
delay5us();
if(SDA)//NOACK
{
SCL = 0;//这里SCL为什么要拉低?
return(1);//返回1
}
else//ACK
{
SCL = 0;//这里SCL为什么要拉低?
return(0);//返回0
}
}
确保在下一次信号到来之前,SCL线是低电平,不影响下一次信号。
在标准的IIC普通模式下,数据的传输速率为100kbit/s,高速模式下可以达到400kbit/s。
IIC所接的外围器件的数量并不是无穷多的,总线上的扩展的期间数量是由限制的。总线上的扩展的期间数量并不是由电流负载决定的,而是由电容负载决定的。IIC总线上的每个器件的接口都有一定的等效电容,器件越多(扩展外围器件可以看作是并联在主器件的总线上的),电容值就越大,就会造成信号传输的延迟。
总线上允许接的器件数量以器件的电容量不能超过400pF(可以通过其他的方法增加总线的电容量),据此可以算出总线的长度和扩展外围器件的数量。
IIC(Inter-Integrated Circuit)是一种串行总线协议,用于在多个器件之间进行通信。下面是关于IIC通信协议的详细信息:
IIC总线的物理拓扑结构: 当IIC总线空闲时,SDA和SCL两条线均为高电平。各器件的SDA和SCL都是"线与"的关系。为了保证SDA和SCL在空闲状态保持高电平,需要通过上拉电阻将其接到正电源。
IIC总线引脚与函数定义: IIC总线使用的引脚为PB6和PB7,分别对应时钟线(SCL)和数据线(SDA)。根据需要进行输入和输出的切换。
```c //IO方向设置 #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
//IO操作函数 #define IIC_SCL PBout(6) //SCL #define IIC_SDA PBout(7) //SDA #define READ_SDA PBin(7) //输入SDA
//IIC所有操作函数 void IIC_Init(void); //初始化IIC的IO口 void IIC_Start(void); //发送IIC开始信号 void IIC_Stop(void); //发送IIC停止信号 void IIC_Send_Byte(u8 txd); //IIC发送一个字节 u8 IIC_Read_Byte(unsigned char ack); //IIC读取一个字节 u8 IIC_Wait_Ack(void); //IIC等待ACK信号 void IIC_Ack(void); //IIC发送ACK信号 void IIC_NAck(void); //IIC不发送ACK信号 ```
IIC总线上数据传送的应答信号: IIC总线数据传送的每个字节都需要有一个应答位。应答信号为低电平表示有效应答位(ACK),表示接收器已经成功接收了该字节; 应答信号为高电平表示非应答位(NACK),表示接收器接收该字节没有成功。
IIC总线的起始信号与终止信号: IIC总线的开始信号用S代表,结束信号用P代表。开始信号是SCL为高电平期间,SDA由高电平变为低电平;结束信号是SCL为高电平期间,SDA由低电平变为高电平。
IIC总线上数据传送格式: IIC总线传送的每一帧数据都是一个字节,每传送一个字节后需要接收方回应一个应答位。 数据传输的格式包括起始信号、寻址字节、数据字节和应答位。寻址字节表明传输方向,数据字节表示具体的数据。每个字节传输都必须有应答位相随。
以上是关于IIC通信协议的详细信息。希望对你学习51单片机的IIC通信协议有所帮助。如果还有其他问题,请随时提问。