stm32-IIC 通信协议

原理

由数据线 SDA 和时钟 SCL 构成的串行总线,采用半双工通信。可挂多个设备,每个设备模块都既可做主设备也可做从设备。适合近距离,低速之间的通信。
在这里插入图片描述
协议规定:输出由起始信号开始,停止信号结束,均由主设备产生。
空闲状态:SCL,SDA都保持着高电平。
起始信号:SCL为高电平时,SDA由高电平变为低电平。
停止信号:SCL为高电平时,SDA由低电平变为高电平。

过程

1.主机发送信号开启总线。<1>
2.主机发送一个字节指明发送对象从机的地址以及传输方向。<2>
3.从机发送应答信号。<3>
4.发送器发送一个字节数据。<4>
5.接收器发送一个应答型号。<5>
6. 重复步骤4,5直到要发的数据发完。
7.主机发送停止信号,释放总线。<7>
(可简记为,老师提问单词:(老师说)提问-(老师说)小明-(小明回答)到-(老师说)abandon–(小明回答)写好了–(老师说)aboard-(小明回答)写好了-直到老师提问完-(老师说)结束。)

过程细节

<2> 主机发送的一个字节 8bit,高七位为从机的地址,最后一位为传输方向。
在这里插入图片描述
<3> 从机将高7位提出来与自身地址,接着提最后一位,确定收发。
<1> 起始信号:SCL为高电平时,SDA由高电平变为低电平。
<7> 停止信号:SCL为高电平时,SDA由低电平变为高电平。
在这里插入图片描述
<4> <5> 数据传输时,先传输最高位,后传输低位。发送器发送完一个字节数据后接收器必须发送一位应答位来回应发送器(高电平为非应答,低电平为应答)。
SCL为低电平时,发送器向数据线SDA发送一位数据,此间允许数据线上信号发生变化。
SCL为高电平时,接收器向数据线SDA上读取一位数据,此间不允许数据线上信号发生变化。

经典IIC时序

红色为主机发送,黑色为从机发送。
S:起始信号 A/-A:应答信号和非应答信号
P:停止信号

主机向从机发送

在这里插入图片描述

从机向主机发送

在这里插入图片描述

主机向从机发送,从机再向主机发送

在这里插入图片描述

详细代码

1.iic初始化

void IIC_init()       //IIC初始化
{
    SCL=1; //首先把时钟线拉高
    delay_us(4);
    SDA=1; //SCL为高的把SDA拉高
    delay_us(4); 
}
  1. 起始信号 。。。。。。。。。。。。<1>
    SCL为高,SDA由高变低。
    在这里插入图片描述

void IIC_Start()         

{
       SDA=1;
       delay_us(5);
       SCL=1;  //   保证SCL和SDA都为高电平
       delay_us(5);
       SDA=0; //拉低SDA,为起始信号
       delay_us(5);
       SCL=0;   //再拉低SCL准备发送或接收。
    
}

3.发送一个字节。。。。。。。。。。。。<2><4>

当SCL为高,此时数据已经确定不可更改,根据此时SDA高低判别1或0。当SCL为低,此时可以改变SDA的高低电平来判别是发送1或0;
当一个字节(8位)按数据位从高位到低位的顺序传输完后,紧接着 从设备将拉低SDA线,回传给主设备一个应答位ACK
发地址时 前七位为从设备的地址,后一位为数据传输方向,0发1收。

void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
    SDA_OUT();         
    IIC_SCL=0;	//拉低SCL开始数据传输
    for(t=0;t<8;t++)	//一个字节 重复8次
    {              

        if(txd&0x80)
            IIC_SDA=1;
        else
            IIC_SDA=0;  //从高位开始传输数据,并判断数据是1还是0,拉高或拉低SDA
            
        txd<<=1;       //向高位移位
        
        delay_us(2);   
        IIC_SCL=1; 
        delay_us(2); 
        IIC_SCL=0;    
        delay_us(2);
    }     
}       

3.应答信号。。。。。。。。。。。。<3>


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值