[N32G430] 用IO模拟I2C的基础信号

[复制链接]
2009|15
 楼主| wahahaheihei 发表于 2023-5-26 23:04 | 显示全部楼层 |阅读模式
接下来通过MCU的IO控制OLED模块的I2C接口来演示
  1. /*
  2. I2C Start
  3. 起始信号:时钟信号在高电平状态时候,数据线产生一个下降沿表示开始信号
  4. */
  5. void I2C_Start()
  6. {
  7.         IO_SCL_SET_H();
  8.        
  9.         IO_SDA_SET_H();
  10.         IO_SDA_SET_L();       
  11. }

  12. /*
  13. I2C Stop
  14. 停止信号:时钟信号在高电平状态时候,数据线产生一个上升沿表示停止
  15. */
  16. void I2C_Stop()
  17. {
  18.         IO_SCL_SET_H();
  19.        
  20.         IO_SDA_SET_L();
  21.         IO_SDA_SET_H();       
  22. }

  23. /*
  24. I2C ACK/NACK
  25. 应答信号:第九个时钟周期的时钟高电平时候读取SDA数据,如果SDA此时为0,则表示应答,如果为1则表示非应答。
  26. */
  27. void I2C_ACK()
  28. {
  29.         IO_SDA_SET_H();
  30.        
  31.         IO_SCL_SET_H();
  32.         if(Get_IO_SDA()==0)
  33.         IO_SCL_SET_L();
  34.         else
  35.         while(Get_IO_SDA()==1);
  36.         IO_SCL_SET_L();
  37. }

  38. /*
  39. I2C 上发送一个字节数据
  40. 发送字节:发送字节是时钟信号的低电平时候修改数据,发送完要让时钟总线保持在低电平。
  41. */
  42. void Write_I2C_Byte(unsigned char I2C_Byte)
  43. {
  44.         unsigned char i;
  45.        
  46.         for(i=0;i<8;i++)
  47.         {
  48.                 IO_SCL_SET_L();
  49.                
  50.                 if((I2C_Byte<<i)&0x80)
  51.                         IO_SDA_SET_H();
  52.                 else
  53.                         IO_SDA_SET_L();
  54.                
  55.                 IO_SCL_SET_H();               
  56.         }
  57.         IO_SCL_SET_L();
  58. }


gaoyang9992006 发表于 2023-5-26 23:10 | 显示全部楼层
这是从我那复制的啊,可以。欢迎大家去科学家板块。
tpgf 发表于 2023-6-6 15:25 | 显示全部楼层
感觉如果用io模拟的话 对时序的要求还是非常严格的
qcliu 发表于 2023-6-6 15:37 | 显示全部楼层
还得注意时钟的配置以及延时函数的精准
drer 发表于 2023-6-6 16:10 | 显示全部楼层
其实我感觉用引脚模拟iic 配置起来应该更加简单
coshi 发表于 2023-6-6 16:25 | 显示全部楼层
只不过相关功能的函数需要自己编写 然后调用就可以了
kxsi 发表于 2023-6-6 16:50 | 显示全部楼层
iic其实本质上还是非常简单的  基本上所有io模拟的都是一个样子
wiba 发表于 2023-6-6 17:09 | 显示全部楼层
kxsi 发表于 2023-6-6 16:50
iic其实本质上还是非常简单的  基本上所有io模拟的都是一个样子

是的 因为这个是一个标准的 通讯协议 所以无论是什么型号的单片机 都要遵守
earlmax 发表于 2023-7-5 13:41 | 显示全部楼层
如何用IO口模拟I2C来实现              
biechedan 发表于 2023-7-5 14:47 | 显示全部楼层
在模拟I2C时, 需要根据所需的速度选择适当的延时或频率控制来满足通信需求。
hearstnorman323 发表于 2023-7-5 15:31 | 显示全部楼层
需要有相应的错误处理和容错机制来保证通信的可靠性,例如重新初始化I2C总线或中断传输等。
robertesth 发表于 2023-7-5 16:44 | 显示全部楼层
最好参考相应的I2C通信协议规范和文档
olivem55arlowe 发表于 2023-7-5 22:11 | 显示全部楼层
在模拟I2C时,你需要实现适当的冲突检测机制,并采取相应的处理措施,例如延时并重新尝试、发送NACK信号等。
macpherson 发表于 2023-7-6 11:17 | 显示全部楼层
SCL和SDA线通常会使用外部上拉电阻将其拉到高电平。
robincotton 发表于 2023-7-6 11:50 | 显示全部楼层
在SCL和SDA线上的时钟和数据信号都遵循I2C协议的时序要求
sheflynn 发表于 2023-7-6 12:30 | 显示全部楼层
I2C通信中,IO口需要支持正确的电平(高电平和低电平)以及驱动能力,以满足I2C总线的电气特性要求。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

232

主题

3223

帖子

12

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