51单片机IIC通信协议

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线是低电平,不影响下一次信号。

  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:51单片机IIC通信协议
  • 除此之外, 这篇博客: 【通信协议】IIC通信协议详解中的 IIC总线的缺点: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •         在标准的IIC普通模式下,数据的传输速率为100kbit/s,高速模式下可以达到400kbit/s。

            IIC所接的外围器件的数量并不是无穷多的,总线上的扩展的期间数量是由限制的。总线上的扩展的期间数量并不是由电流负载决定的,而是由电容负载决定的。IIC总线上的每个器件的接口都有一定的等效电容,器件越多(扩展外围器件可以看作是并联在主器件的总线上的),电容值就越大,就会造成信号传输的延迟。

            总线上允许接的器件数量以器件的电容量不能超过400pF(可以通过其他的方法增加总线的电容量),据此可以算出总线的长度扩展外围器件的数量

  • 以下回答由chatgpt基于相关博客总结生成:

    IIC(Inter-Integrated Circuit)是一种串行总线协议,用于在多个器件之间进行通信。下面是关于IIC通信协议的详细信息:

    1. IIC总线的物理拓扑结构: 当IIC总线空闲时,SDA和SCL两条线均为高电平。各器件的SDA和SCL都是"线与"的关系。为了保证SDA和SCL在空闲状态保持高电平,需要通过上拉电阻将其接到正电源。

    2. 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信号 ```

    1. IIC总线上数据传送的应答信号: IIC总线数据传送的每个字节都需要有一个应答位。应答信号为低电平表示有效应答位(ACK),表示接收器已经成功接收了该字节; 应答信号为高电平表示非应答位(NACK),表示接收器接收该字节没有成功。

    2. IIC总线的起始信号与终止信号: IIC总线的开始信号用S代表,结束信号用P代表。开始信号是SCL为高电平期间,SDA由高电平变为低电平;结束信号是SCL为高电平期间,SDA由低电平变为高电平。

    3. IIC总线上数据传送格式: IIC总线传送的每一帧数据都是一个字节,每传送一个字节后需要接收方回应一个应答位。 数据传输的格式包括起始信号、寻址字节、数据字节和应答位。寻址字节表明传输方向,数据字节表示具体的数据。每个字节传输都必须有应答位相随。

    以上是关于IIC通信协议的详细信息。希望对你学习51单片机的IIC通信协议有所帮助。如果还有其他问题,请随时提问。