找回密码
 立即注册
查看: 822|回复: 6

STC8H8K64U软件I2C驱动MCP4725A0T搞定,硬件I2C没搞定

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-05-10 01:16:24

2

主题

12

回帖

148

积分

注册会员

积分
148
发表于 2024-3-24 05:28:41 | 显示全部楼层 |阅读模式
STC8H8K64U TSSOP20 软件IIC驱动mcp4725a0t不稳定

驱动代码如下,硬件IIC会直接卡住无法使用,软件IIC时而有用时而失效,
失效时无论IIC写数据什么,DAC输出都是0

软件IIC具体实现:SDA和SCL如原理图定义
  1. #define D 10
  2. void I2C_Init(void)    //初始化IIC
  3. {
  4. }
  5. void I2C_Start(void) //起始信号
  6. {
  7.         SDA = 1;
  8.         SCL = 1;
  9.         delay_us(D);       //大于4.7us
  10.         SDA = 0;           //SCL高电平期间,SDA发生负跳变
  11.         delay_us(D);       //大于4us
  12.         SCL = 0;
  13.         delay_us(D);
  14. }
  15. void I2C_SendByte(unsigned char temp)  //发送数据
  16. {
  17.         unsigned char i;
  18.         for(i=0;i<8;i++)
  19.         {
  20.                 SDA = (bit)(temp&0x80);
  21.                 temp <<= 1;
  22.                 SCL = 1;         //SCL高电平期间传送数据,并保持稳定
  23.                 delay_us(D);     //大于4us
  24.                 SCL = 0;         //SCL低电平期间数据发生改变
  25.                 delay_us(D);
  26.         }
  27. }
  28. bit I2C_ACKR(void)  //接收应答信号
  29. {
  30.         bit flag;
  31.         SCL = 1;          //SCL高电平期间接收数据
  32.         SDA = 1;          //读取数据前置一
  33.         delay_us(D);
  34.         flag = SDA;
  35.         SCL = 0;
  36.         delay_us(D);
  37.         return(flag);
  38. }
  39. void I2C_Stop(void)  //终止信号
  40. {
  41.         SCL = 1;
  42.         delay_us(D);       //大于4us
  43.         SDA = 1;           //SCL高电平期间,SDA发生正跳变
  44.         delay_us(D);       //大于4.7us
  45.         SDA = 0;
  46. }
  47. unsigned char I2C_ReceiveByte(void)  //接收数据
  48. {
  49.         unsigned char i;
  50.         unsigned char temp = 0x00;
  51.         for(i=0;i<8;i++)
  52.         {
  53.                 SCL = 1;         //SCL高电平期间接收数据
  54.                 SDA = 1;         //读取数据前置一
  55.                 delay_us(D);     //大于4us
  56.                 temp |= SDA;
  57.                 SCL = 0;         //SCL低电平期间数据发生改变
  58.                 temp <<= 1;
  59.                 delay_us(D);     //大于4us
  60.         }
  61.         return(temp);
  62. }
  63. void I2C_ACKS(bit A)        //发送应答信号
  64. {
  65.         if(A == 1)
  66.                 SDA = 1;
  67.         else
  68.                 SDA = 0;
  69.         SCL = 1;            //SCL高电平期间传送应答信号
  70.         delay_us(D);
  71.         SCL = 0;
  72.         delay_us(D);
  73. }
复制代码


mcp4275接线

mcp4275接线

引脚定义

引脚定义

mcp4275驱动带

mcp4275驱动带
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:462
  • 最近打卡:2025-06-19 00:46:02
已绑定手机

38

主题

2226

回帖

2703

积分

荣誉版主

积分
2703
发表于 2024-3-24 23:43:25 | 显示全部楼层
本帖最后由 晓飛飛 于 2024-3-24 23:47 编辑

之所以I2C卡住,有可能是发送的器件地址不正确,导致芯片无ACK响应。


你把A0引脚上的上拉电阻R2拆掉,或者传输硬件地址改为0xC2试试
因为R2使A0为高电平,使得器件地址变为了0xC2,和你的程序中写入的地址不一致。
一般来说A0直接连接VCC或者GND都可以,不要搞那么多没用的电阻。
A0接VCC时,写入地址为0xC2
A0接GND时,写入地址为0xC0

睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-05-10 01:16:24

2

主题

12

回帖

148

积分

注册会员

积分
148
发表于 2024-3-25 08:00:36 | 显示全部楼层
晓*** 发表于 2024-3-24 23:43
之所以I2C卡住,有可能是发送的器件地址不正确,导致芯片无ACK响应。

这里的电阻R2和R3仅仅只是在原理图上设计,实际焊接时仅焊接一个,我实际板子焊接的是r3也就是A0接GND,地址是0xc0,但是我在实际使用时,向0xc0写两个字节数据,不管数据是什么,DAC输出都为0,如果地址错误,那DAC输出为2.5V
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:462
  • 最近打卡:2025-06-19 00:46:02
已绑定手机

38

主题

2226

回帖

2703

积分

荣誉版主

积分
2703
发表于 2024-3-25 15:49:33 | 显示全部楼层
P1.4和P1.5是否设置成了开漏输出模式?
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-05-10 01:16:24

2

主题

12

回帖

148

积分

注册会员

积分
148
发表于 2024-3-27 22:19:50 | 显示全部楼层
目前已经找到原因了,软件iic可以使用了,硬件iic还是不能使用
回复 支持 反对

使用道具 举报 送花

1

主题

29

回帖

87

积分

注册会员

积分
87
发表于 2024-6-27 22:43:36 | 显示全部楼层
woo*** 发表于 2024-3-27 22:19
目前已经找到原因了,软件iic可以使用了,硬件iic还是不能使用

楼主能否说下什么原因?最近也在排查这方面的问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2024-07-16 16:50:24

2

主题

16

回帖

90

积分

注册会员

积分
90
发表于 2024-7-15 22:09:16 | 显示全部楼层
楼主是什么问题可以说一下嘛,我的软件iic也用不了了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-19 21:45 , Processed in 0.133441 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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