[其他ST产品] iiC通信协议详解以及STM32iic代码理解

[复制链接]
 楼主| yellow555 发表于 2023-8-27 00:42 | 显示全部楼层
应答和非应答信号
  1. //产生ACK应答
  2. void IIC_Ack(void)
  3. {
  4.         IIC_SCL=0;
  5.         SDA_OUT();
  6.         IIC_SDA=0;     //数据位拉低
  7.         delay_us(2);
  8.         IIC_SCL=1;
  9.         delay_us(2);
  10.         IIC_SCL=0;
  11. }
  12. //不产生ACK应答                    
  13. void IIC_NAck(void)
  14. {
  15.         IIC_SCL=0;
  16.         SDA_OUT();
  17.         IIC_SDA=1;   //数据位拉高
  18.         delay_us(2);
  19.         IIC_SCL=1;
  20.         delay_us(2);
  21.         IIC_SCL=0;
  22. }       
 楼主| yellow555 发表于 2023-8-27 00:42 | 显示全部楼层
主机等待应答信号的接收,当数据线被拉低的时候就代表接收了应答信号,让时钟线拉低继续进行传输,当SDA == 1,证明接收到了非应答信号,就会让主机发送停止信号,结束传输。


  1. u8 IIC_Wait_Ack(void)
  2. {
  3.         u8 ucErrTime=0;
  4.         SDA_IN();      //SDA设置为输入  
  5.         IIC_SDA=1;delay_us(1);          
  6.         IIC_SCL=1;delay_us(1);         
  7.         while(READ_SDA)
  8.         {
  9.                 ucErrTime++;
  10.                 if(ucErrTime>250)
  11.                 {
  12.                         IIC_Stop();
  13.                         return 1;
  14.                 }
  15.         }
  16.         IIC_SCL=0;//时钟输出0           
  17.         return 0;  
  18. }
 楼主| yellow555 发表于 2023-8-27 00:43 | 显示全部楼层
主机等待应答信号的接收,当数据线被拉低的时候就代表接收了应答信号,让时钟线拉低继续进行传输,当SDA == 1,证明接收到了非应答信号,就会让主机发送停止信号,结束传输。


  1. u8 IIC_Wait_Ack(void)
  2. {
  3.         u8 ucErrTime=0;
  4.         SDA_IN();      //SDA设置为输入  
  5.         IIC_SDA=1;delay_us(1);          
  6.         IIC_SCL=1;delay_us(1);         
  7.         while(READ_SDA)
  8.         {
  9.                 ucErrTime++;
  10.                 if(ucErrTime>250)
  11.                 {
  12.                         IIC_Stop();
  13.                         return 1;
  14.                 }
  15.         }
  16.         IIC_SCL=0;//时钟输出0           
  17.         return 0;  
  18. }
 楼主| yellow555 发表于 2023-8-27 00:43 | 显示全部楼层
读取字节和传输字节

传入的数据txd会和0X80(1000000)进行与运算,然后结果右移七位,换句话说就是把传进来的字节的最高位单拿出来,赋值给SDA,以便于传输,然后将字节左移一位,就会把第二位变为最高位,以此类推,将每一位都传入SDA。
 楼主| yellow555 发表于 2023-8-27 00:43 | 显示全部楼层
  1. void IIC_Send_Byte(u8 txd)
  2. {                        
  3.     u8 t;   
  4.         SDA_OUT();             
  5.     IIC_SCL=0;//拉低时钟开始数据传输
  6.     for(t=0;t<8;t++)
  7.     {              
  8.         IIC_SDA=(txd&0x80)>>7;
  9.         txd<<=1;           
  10.                 delay_us(2);   //对TEA5767这三个延时都是必须的
  11.                 IIC_SCL=1;
  12.                 delay_us(2);
  13.                 IIC_SCL=0;       
  14.                 delay_us(2);
  15.     }         
  16. }             
  17. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  18. u8 IIC_Read_Byte(unsigned char ack)
  19. {
  20.         unsigned char i,receive=0;
  21.         SDA_IN();//SDA设置为输入
  22.     for(i=0;i<8;i++ )
  23.         {
  24.         IIC_SCL=0;
  25.         delay_us(2);
  26.                 IIC_SCL=1;
  27.         receive<<=1;
  28.         if(READ_SDA)receive++;   
  29.                 delay_us(1);
  30.     }                                         
  31.     if (!ack)
  32.         IIC_NAck();//发送nACK
  33.     else
  34.         IIC_Ack(); //发送ACK   
  35.     return receive;
  36. }
chenjunt 发表于 2023-8-27 10:43 | 显示全部楼层
注意上拉电阻会把总线也拉成高电平模式
belindagraham 发表于 2023-9-5 10:11 | 显示全部楼层
I2C通信协议使用时序控制,包括启动信号、结束信号、应答信号、复位信号等。
loutin 发表于 2023-9-5 11:56 | 显示全部楼层
IIC通信协议广泛应用于微控制器、传感器、存储器和其他电子设备中。
jtracy3 发表于 2023-9-5 12:35 | 显示全部楼层
如何使用STM32的IIC接口进行通信
eefas 发表于 2023-9-5 14:08 | 显示全部楼层
常用的串行通信协议,用于在多个设备之间进行数据传输。
tifmill 发表于 2023-9-5 14:21 | 显示全部楼层
I2C通信协议支持多种数据传输模式,包括数据传输、读取、写入等。其中,数据传输模式是最常用的模式,用于在主从器件之间传输数据。
wangdezhi 发表于 2023-9-5 15:05 | 显示全部楼层
IIC通信协议支持双向通信,即可以在同一方向上进行收发数据。
minzisc 发表于 2023-9-5 16:43 | 显示全部楼层
IIC通信协议的基本原理是,它使用了两根线,一根是数据线(SDA),另一根是时钟线(SCL)。这两个线在所有参与通信的设备之间是共享的。
abotomson 发表于 2023-9-5 17:57 | 显示全部楼层
IIC通信协议可达100kbps的通信速率。
pl202 发表于 2023-9-5 21:04 | 显示全部楼层
可以使用STM32 HAL库提供的函数来实现I2C通信。
LLGTR 发表于 2023-9-6 12:10 | 显示全部楼层
i2c通信协议可达100kbps的通讯速度。
天天向善 发表于 2023-9-6 12:54 | 显示全部楼层
iic通信协议利用时序节制,包含启动旌旗灯号、竣事旌旗灯号、应对旌旗灯号、复位旌旗灯号等。
AIsignel 发表于 2023-9-6 13:40 | 显示全部楼层
iic通信协议支持双向通信,这意味着数据可以在同一方向上发送和接收。
理想阳 发表于 2023-9-6 14:06 | 显示全部楼层
可以利用stm,hal库供给的函数来实现iic通讯。
minzisc 发表于 2023-9-7 10:50 | 显示全部楼层
IIC通信协议具有较长的传输距离,可以达到125m的距离。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部