[PIC®/AVR®/dsPIC®产品] IO实现I2C的优点

[复制链接]
968|10
 楼主| xinxianshi 发表于 2023-6-25 22:06 | 显示全部楼层 |阅读模式
方便移植,不用考虑不同的单片机下不同的配置方法。
一般I2C只需要实现5种时序:开始、停止、应答与非应答、写字节、读字节
  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. }


 楼主| xinxianshi 发表于 2023-6-25 22:07 | 显示全部楼层
以上从论坛别人帖子复制的,大家可以试着完善缺少的基础操作读。
 楼主| xinxianshi 发表于 2023-6-25 22:08 | 显示全部楼层
确实比很多寄存器操作的方便,主要函数不统一,做起来很费劲。
CoolSilicon 发表于 2023-6-26 13:58 | 显示全部楼层
如果用习惯MCC生成代码, 也很方便的.
tpgf 发表于 2023-7-7 16:11 | 显示全部楼层
其实基本上都不用改代码 因为基本都是用了宏定义
xiaoqizi 发表于 2023-7-7 16:38 | 显示全部楼层
通过这种方式我们只需要对io引脚进行配置就行
木木guainv 发表于 2023-7-7 20:54 | 显示全部楼层
但是这样一来就会绕过对iic寄存器的配置学习
wowu 发表于 2023-7-7 21:38 | 显示全部楼层
因为是用io模拟的 所以移植的时候是不是还得考虑时钟的配置
 楼主| xinxianshi 发表于 2023-7-19 15:51 | 显示全部楼层
wowu 发表于 2023-7-7 21:38
因为是用io模拟的 所以移植的时候是不是还得考虑时钟的配置

不需要,因为I2C其实没有明显的时钟和波特率,那个标准硬件的只是为了方便计算速度设置的,而I2C采用的是差分信号,因此不需要时钟同步。
 楼主| xinxianshi 发表于 2023-7-19 15:53 | 显示全部楼层
木木guainv 发表于 2023-7-7 20:54
但是这样一来就会绕过对iic寄存器的配置学习

是的,会绕过那个寄存器学习,而且没法使用I2C的中断功能。这是一个弊端,不过大量的嵌入式基础应用中,用不到那些功能还是很适合这个的。
nevermore008 发表于 2023-7-19 18:41 | 显示全部楼层
可以使用任意引脚呗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1019

帖子

1

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