常见通信协议之IIC

IIC是一种同步串行半双工通信,有数据线和时钟线

主要的通信速率有:100k bit/s、400k bit/s、3.4M bit/s(通信速率看从机)

主机:谁控制时钟线就是主机(一般为微控制器)

时钟线:必须由主机控制,主机产生控制总线的传输方向,并产生起始条件和停止条件

数据线: 用来传输数据的线

从机从来不会主动发送数据(需要拉低时钟线控制(配置上拉电阻))

主机通过从机唯一的器件地址来选择要通信的从机。

一般总线(SCL、SDA)会接上拉电阻,默认高电平

2.硬件IIC和模拟IIC

硬件IIC:通过芯片内置的I²C硬件控制器实现

模拟IIC(软件IIC):通过任意GPIO引脚模拟I²C协议

3.数据处理

一般先处理高位,每处理完八位数据必须处理一位应答

主机给从机发送数据需要把时钟线拉低,从机给主机发送数据需要把时钟线拉高(即主机接收数据需要拉高时钟线)

一个完整的周期,先拉低时钟线,再拉高,最后拉低(防止从机产生数据)(接收的时候要先拉高数据线,防止数据线上有数据)

4.伪代码

发送数据,8位,高位在前

u8 IIC_Send_Data(u8 data)
{
    u8 i,ack=0;
    for (i = 0; i < 8; i++)
    {
        SCL=0;
        if(data & (0x80>>i))
        {
            SDA=1;
        }
        else
        {
            SDA=0;
        }
        Delay_us();
        SCL=1;
        Delay_us();
    }
    ack = IIC_Rev_ACK();//接受应答
    return ack;
}

接收数据,8位,高位在前

u8 IIC_Rev_Data(u8 ack)
{
    u8 i,data=0;
    SDA=1;//确保数据线位默认(空闲)状态

    for(i=0;i<8;i++)
    {
        SCL=0;
        Delay_us();
        SCL=1;
        if(SDA==1)
        {
            data |=(0x80>>i);
        }
        Delay_us();
    }
    IIC_Send_Ack(ack);//发送应答
    return data;
}

5.使用IIC通信过程中处理总线拥塞或数据丢失问题

(1)总线拥塞问题

1)重启机制;如果检测到总线忙,主设备可以等待一段时间

2)总线仲裁;确保主设备在发送数据前检测总线是否空闲

3)根据总线长度和设备数量,选择合适的上拉电阻值(阻值大,电平上升时间长)

4)降低通信速率

(2)数据丢失问题(信号干扰、设备响应超时、通信协议错误)

1)添加超时检测

2)信号滤波

新手小白,文章有错的地方,希望各位大佬能指正,材料知识不足也请补充,感谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值