找回密码
 立即注册
查看: 348|回复: 4

模拟IIC

[复制链接]

30

主题

77

回帖

383

积分

中级会员

积分
383
发表于 2024-12-10 17:22:08 | 显示全部楼层 |阅读模式

8MZ_CLC42QT<span class=我想请问,为啥我的IIC时钟信号波形和标准的有这么大的区别,我是开漏输出加4.7K的上拉电阻,IIC的速度大概再300K左右。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-06-17 09:09:48
已绑定手机

79

主题

5137

回帖

9134

积分

超级版主

DebugLab

积分
9134
发表于 2024-12-10 17:36:25 | 显示全部楼层
  1. void        I2C_Delay(void)
  2. {
  3.         u16        dly;
  4.         dly = 8;                //取1对应SCL H为0.5us,L为1.5us,读写仍正常.为了可靠,取8
  5.         while(--dly)        ;
  6. }
  7. void I2C_Start(void)               //start the I2C, SDA High-to-low when SCL is high
  8. {
  9.         P_I2C_SDA = 1;        //SDA = 1;
  10.         I2C_Delay();
  11.         P_I2C_SCL = 1;        //SCL = 1;
  12.         I2C_Delay();
  13.         I2C_Delay();
  14.         I2C_Delay();
  15.         I2C_Delay();
  16.         P_I2C_SDA = 0;        //SDA = 0;
  17.         I2C_Delay();
  18.         I2C_Delay();
  19.         I2C_Delay();
  20.         P_I2C_SCL = 0;        //SCL = 0;
  21.         I2C_Delay();
  22. }
  23. void I2C_Stop(void)                                        //STOP the I2C, SDA Low-to-high when SCL is high
  24. {
  25.         P_I2C_SCL = 0;        //SCL = 0;
  26.         I2C_Delay();
  27.         P_I2C_SDA = 0;        //SDA = 0;
  28.         I2C_Delay();
  29.         P_I2C_SCL = 1;        //SCL = 1;
  30.         I2C_Delay();
  31.         I2C_Delay();
  32.         I2C_Delay();
  33.         P_I2C_SDA = 1;        //SDA = 1;
  34.         I2C_Delay();
  35. }
  36. u8 I2C_Check_ACK(void)         //Check ACK, If status=0: right, if status=1:  error
  37. {
  38.         u8        status;
  39.         P_I2C_SDA = 1;        //SDA = 1;
  40.         I2C_Delay();
  41.         P_I2C_SCL = 1;        //SCL = 1;
  42.         I2C_Delay();
  43.         status = 0;
  44.         if(P_I2C_SDA)
  45.                 status = 1;
  46.         P_I2C_SCL = 0;        //SCL = 0;
  47.         I2C_Delay();
  48.         return        status;
  49. }
  50. /****************************/
  51. void I2C_WriteAbyte(u8 dat)                //write a byte to I2C
  52. {
  53.         u8 i;
  54.         for(i=0; i<8; i++)
  55.         {
  56.                 if(dat & 0x80)
  57.                         P_I2C_SDA = 1;        //SDA = 1;
  58.                 else
  59.                         P_I2C_SDA = 0;        //SDA = 0;
  60.                 I2C_Delay();
  61.                 P_I2C_SCL = 1;        //SCL = 1;
  62.                 dat <<= 1;
  63.                 I2C_Delay();
  64.                 P_I2C_SCL = 0;        //SCL = 0;
  65.                 I2C_Delay();
  66.         }
  67. }
  68. u8        I2C_RegWrite(u8 RegAddr, u8 dat)        //返回0: 正确, >0: 错误
  69. {
  70.         u8        status;
  71.         status = 1;
  72.         I2C_Start();
  73.         I2C_WriteAbyte(I2C_WR);                //device address + WR
  74.         if(I2C_Check_ACK() == 0)
  75.         {
  76.                 I2C_WriteAbyte(RegAddr);        //register address
  77.                 if(I2C_Check_ACK() == 0)
  78.                 {
  79.                         I2C_WriteAbyte(dat);        //data
  80.                         if(I2C_Check_ACK() == 0)        //data
  81.                                         status = 0;
  82.                 }
  83.         }
  84.         I2C_Stop();
  85.         return        status;
  86. }
  87. u8        I2C_WriteCmd(u16 RegAddr, u16 dat)
  88. {
  89.         u8        status;
  90.         status = 1;
  91.         I2C_Start();
  92.         I2C_WriteAbyte(I2C_WR);                //device address + WR
  93.         if(I2C_Check_ACK() == 0)
  94.         {
  95.                 dat = (RegAddr << 8) | dat;
  96.                 I2C_WriteAbyte((u8)(dat >> 8));
  97.                 if(I2C_Check_ACK() == 0)
  98.                 {
  99.                         I2C_WriteAbyte((u8)dat);
  100.                         if(I2C_Check_ACK() == 0)        status = 0;
  101.                 }
  102.         }
  103.         I2C_Stop();
  104.         return        status;
  105. }
复制代码


点评

软件模拟I2C程序  详情 回复 发表于 2024-12-10 17:36
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-06-17 09:09:48
已绑定手机

79

主题

5137

回帖

9134

积分

超级版主

DebugLab

积分
9134
发表于 2024-12-10 17:36:53 | 显示全部楼层

软件模拟I2C程序
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:500
  • 最近打卡:2025-06-18 01:56:03
已绑定手机

14

主题

1312

回帖

3356

积分

论坛元老

积分
3356
发表于 2024-12-10 22:48:04 | 显示全部楼层
CH1通道应该是CLK信号,怎么电压会怎么高?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:442
  • 最近打卡:2025-06-18 07:12:58
已绑定手机

17

主题

714

回帖

1249

积分

金牌会员

积分
1249
发表于 2024-12-11 20:37:43 | 显示全部楼层

把4.7K的电阻改成1K试试

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 08:02 , Processed in 0.125854 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表