找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 233|回复: 5
收起左侧

正点原子stm32f103zet6开发板AT24C02读写有问题,求大佬指点

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次(中奖概率 30%)
ID:1115386 发表于 2024-11-10 01:05 | 显示全部楼层 |阅读模式
初学者,写这个AT24C02,应答信号一直是高电平,写入失败,读的数据一直是255,弄了很久还是出不来,求大佬指点

10.31AT24C02实验.7z

597.24 KB, 下载次数: 2

回复

使用道具 举报

ID:57657 发表于 2024-11-10 11:23 | 显示全部楼层
可能是IO口模式配置有问题,具体用逻辑分析仪检查。
此类芯片先用51单片机编写读写程序,然后再移植到STM32。
回复

使用道具 举报

ID:446156 发表于 2024-11-12 13:05 | 显示全部楼层
  1. uint8_t Receive_ACK(struct I2C_Device *IIcBus)
  2. {
  3.         uint16_t i;
  4.        
  5.         IIcBus->Set_SCL(0);//一定把时钟设为低电平再释放总线等待ACK
  6.         IIcBus->Set_SDA(1);//释放总线
  7. //        IIcBus->delayus(Delay_Time);
  8.         while(IIcBus->Get_SDA()!=0)
  9.         {
  10.                 i++;
  11.                 if(i>10000)
  12.                 {
  13.                         return 0;
  14.                 }
  15.         }
  16.         IIcBus->Set_SCL(1);
  17.         IIcBus->delayus(Delay_Time);
  18.         IIcBus->Set_SCL(0);//空闲时保证时钟线为低
  19.         return 1;
  20. }
复制代码

检测应答信号时一定要先把SCL拉低
回复

使用道具 举报

ID:1115386 发表于 2024-11-14 18:46 | 显示全部楼层
npn 发表于 2024-11-10 11:23
可能是IO口模式配置有问题,具体用逻辑分析仪检查。
此类芯片先用51单片机编写读写程序,然后再移植到STM3 ...

51到32又见面了大佬
回复

使用道具 举报

ID:1136460 发表于 2024-11-14 19:57 | 显示全部楼层
解决办法:   我的是模拟i2c ,其他读写函数都不用变,只需要改停止信号的的时序即可。  原来的停止信号:  //产生IIC停止信号    //产生IIC停止信号 void IIC_Stop(void) {         SDA_OUT();//sda线输出         IIC_SCL=0;         IIC_SDA=0;//STOP:when CLK is high DATA change form low to high          delay_us(4);         IIC_SCL=1;                                                  IIC_SDA=1;//发送I2C总线结束信号         delay_us(4);                                                                    } 修改后的停止信号时序  //产生IIC停止信号 void IIC_Stop(void) {     SDA_OUT();//sda线输出     IIC_SCL=0;     IIC_SDA=0;//STOP:when CLK is high DATA change form low to high      delay_us(4);     IIC_SCL=1;      delay_us(4);           // 添加延时              IIC_SDA=1;//发送I2C总线结束信号                               }
回复

使用道具 举报

ID:1136460 发表于 2024-11-14 20:01 | 显示全部楼层
解决办法:

代码如下

我的是模拟i2c ,其他读写函数都不用变,只需要改停止信号的的时序即可。

原来的停止信号:

//产生IIC停止信号


//产生IIC停止信号
void IIC_Stop(void)
{
        SDA_OUT();//sda线输出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;                                        
        IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);                                                                  
}
修改后的停止信号时序

//产生IIC停止信号
void IIC_Stop(void)
{
    SDA_OUT();//sda线输出
    IIC_SCL=0;
    IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
     delay_us(4);
    IIC_SCL=1;
    delay_us(4);           // 添加延时         
    IIC_SDA=1;//发送I2C总线结束信号                              
}
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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