查看: 8082|回复: 11

[求助] I2C读写EEPROM失败,附时序图

[复制链接]

该用户从未签到

16

主题

61

帖子

0

中级会员

Rank: 3Rank: 3

积分
404
最后登录
2022-6-10
发表于 2019-7-6 09:26:55 | 显示全部楼层 |阅读模式
本帖最后由 yaomeng0725 于 2019-7-10 16:32 编辑

大神们,我使用KEA128的硬件I2C读写AT24C04EEPROM失败,具体表现如下:
微信图片_20190706090713.jpg
前八位传输的是1010 0000,到了第九位没有得到EEPROM的ACK回复,红圈部分,应该是低电平,现在是高电平。我的总线时钟是20MHz,按照手册上面描述:波特率=总线时钟/(mul*SCL),我这个寄存器赋值0x1e,mul=1 scl=192  波特率=104K    其实想调整到100K,但是SCL没有合适的值。请各位看看这是为什么。

I2CX_F寄存器

I2CX_F寄存器
捕获.PNG

  1. void AT24CXX_WriteOneByte(unsigned  int  WriteAddr,unsigned char DataToWrite)
  2. {                                                                                                                                                                                          
  3.   I2C_Start(I2C0);  
  4.   I2C_WriteOneByte(I2C0,0XA0);//发送器件地址0XA0,写数据
  5.   I2C_IsReceivedAck(I2C0);
  6.   I2C_WriteOneByte(I2C0,WriteAddr);
  7.   I2C_IsReceivedAck(I2C0);                                                                                                                        
  8.   I2C_WriteOneByte(I2C0,DataToWrite);     //发送字节                                                           
  9.   I2C_IsReceivedAck(I2C0);                                 
  10.   I2C_Stop(I2C0);//产生一个停止条件
  11. // systick_delay_ms(10);         
  12. }

  13. AT24CXX_WriteOneByte(0X3F,0X3E);
复制代码
__________________________________________________________________________________________________________________________从立创商城上买了5个AT24C04,终于可以收到ACK了,但是接受到的是0xFF。请各位看图。

  1. AT24CXX_WriteOneByte(0x37,0x37);
  2.             AT24CXX_WriteOneByte(0x38,0x38);
  3.             ReadBuffer=AT24CXX_ReadOneByte(0x37);
  4.             delay_ms(10);       
复制代码
我先写了两个数据,然后又读了其中的一个。结果是0XFF

写2.PNG


写1.PNG
读数据.PNG
  1. unsigned char AT24CXX_ReadOneByte(unsigned  int  ReadAddr)
  2. {                                  
  3.   unsigned char temp;                                                                                                                                                               
  4.   I2C_Start(I2C0);  
  5.   I2C_WriteOneByte(I2C0,0XA0); //发送器件地址0XA0,写数据
  6.   I2C_IsReceivedAck(I2C0);
  7.   I2C_WriteOneByte(I2C0,ReadAddr);            
  8.   I2C_IsReceivedAck(I2C0);            
  9.   I2C_Start(I2C0);  
  10.   I2C_WriteOneByte(I2C0,0XA1);    //进入接收模式                          
  11.   I2C_IsReceivedAck(I2C0);         
  12.   I2C_ReadOneByte(I2C0,&temp,I2C_SEND_NACK);                  
  13.   I2C_Stop(I2C0);//产生一个停止条件            
  14.   return temp;
  15. }
复制代码
上面是读数据的代码,用的KEA128的I2C库。请各位帮忙看看。


最佳答案

给你发个我的代码 //****************************************************************************** //****************************************************************************** void  Init ...
回复

使用道具 举报

该用户从未签到

14

主题

61

帖子

0

高级会员

Rank: 4

积分
569
最后登录
2022-2-11
发表于 2019-7-13 11:10:43 | 显示全部楼层
给你发个我的代码

//******************************************************************************
//******************************************************************************
void  Init_I2C(void)
{
  SIM->SCGC |= SIM_SCGC_I2C0_MASK;
  I2C0->C1 |= 1<<7;                 //使能IIC。
  I2C0->F = 0x1f;                //设置IIC的波特率为100Khz   
  
}
//******************************************************************************
//******************************************************************************
void WirteByte_I2C(unsigned char addr, unsigned char data)
{
  I2C_Start(I2C0);
  
  I2C0->D = 0xA0;                //单个24C01做为从设备的地址                        
  while(!(I2C0->S&0x02));       //判断是否产生中断     
  I2C0->S |=1<<1;               //清除中断标志
  
  while(I2C0->S&0x01);          //判断应答信号  0  收到        1 未收到
  
  I2C0->D = addr;               //发送地址
  
  while(!(I2C0->S&0x02));       //判断是否产生中断  
  
  I2C0->S |=1<<1;               //清除中断标志
  while(I2C0->S&0x01);          //判断应答信号  0  收到        1 未收到
  
  I2C0->D = data;               //发送数据   
  while(!(I2C0->S&0x02));       //判断是否产生中断   
  
  I2C0->S |=1<<1;               //清除中断标志
  while(I2C0->S&0x01);          //判断应答信号  0  收到        1 未收到   
  
  I2C0->S |=1<<1;              //清除中断标志
  I2C0->C1 &= ~I2C_C1_MST_MASK;        //产生一个停止条件
                     
  delay_ms(15);
  
}
//******************************************************************************
//******************************************************************************
unsigned char ReadByte_I2C(unsigned char addr)
{
  unsigned char temp;
  
  I2C_Start(I2C0);
  
  I2C0->D = 0xA0;                //单个24C01做为从设备的地址       
  
  while(!(I2C0->S&0x02));       //判断是否产生中断   
  
  I2C0->S |=1<<1;               //清除中断标志
  
  
  while(I2C0->S&0x01);          //判断应答信号  0  收到        1 未收到
  
  I2C0->D = addr;               
  while(!(I2C0->S&0x02));       //判断是否产生中断  
  
  I2C0->S |=1<<1;               //清除中断标志
  while(I2C0->S&0x01);          //判断应答信号  0  收到        1 未收到  
  
  I2C0->C1 |= 1<<2;              //重启IIC
  
  I2C0->D = (0xA1);               
  while(!(I2C0->S&0x02));       //判断是否产生中断     
   
  I2C0->S |=1<<1;               //清除中断标志
  while(I2C0->S&0x01);          //判断应答信号  0  收到        1 未收到  
  
  I2C0->C1 &= ~I2C_C1_TX_MASK;  //更改为接收模式   
  
  I2C0->C1 |= 1<<3;             //发送应答使能
  
  temp = I2C0->D;               
  while(!(I2C0->S&0x02));
  
  I2C0->S |=1<<1;
  I2C0->C1 &= ~I2C_C1_MST_MASK;
  
  temp = I2C0->D;
   
  return(temp);             
}
//******************************************************************************
//******************************************************************************

主程序:
Init_I2C();
  WirteByte_I2C(1,0X34);
  tcc[0]=ReadByte_I2C(1);

测试过没有问题。
  



回复 支持 1 反对 0

使用道具 举报

该用户从未签到

16

主题

61

帖子

0

中级会员

Rank: 3Rank: 3

积分
404
最后登录
2022-6-10
 楼主| 发表于 2019-7-6 09:31:21 | 显示全部楼层
在网上买了三个EEPROM模块,测试后结果一样。
回复 支持 反对

使用道具 举报

该用户从未签到

717

主题

6376

帖子

0

超级版主

Rank: 8Rank: 8

积分
25275
最后登录
2025-8-22
发表于 2019-7-9 17:29:38 | 显示全部楼层
yaomeng0725 发表于 2019-7-6 09:31
在网上买了三个EEPROM模块,测试后结果一样。

我分享KEA128的例程,你用例程在测试一下。
附件.zip (17.55 MB, 下载次数: 124)
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

61

帖子

0

中级会员

Rank: 3Rank: 3

积分
404
最后登录
2022-6-10
 楼主| 发表于 2019-7-9 19:31:26 | 显示全部楼层
小恩GG 发表于 2019-7-9 17:29
我分享KEA128的例程,你用例程在测试一下。

淘宝上的芯片不能买昂,我的天昂。我又从其他商城上买了几个芯片,是可以收到ACK的。写入没问题,但是读出来的全是0xFF,我正在下您的例程。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

61

帖子

0

中级会员

Rank: 3Rank: 3

积分
404
最后登录
2022-6-10
 楼主| 发表于 2019-7-9 21:52:48 | 显示全部楼层
小恩GG 发表于 2019-7-9 17:29
我分享KEA128的例程,你用例程在测试一下。

我的程序就是基于I2C库写出来的。
回复 支持 反对

使用道具 举报

该用户从未签到

717

主题

6376

帖子

0

超级版主

Rank: 8Rank: 8

积分
25275
最后登录
2025-8-22
发表于 2019-7-10 14:00:59 | 显示全部楼层
yaomeng0725 发表于 2019-7-9 21:52
我的程序就是基于I2C库写出来的。

你手上有确认的正常可工作的EEPROM芯片吗?你现在的情况无法肯定问题是出现在硬件还是软件上
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

61

帖子

0

中级会员

Rank: 3Rank: 3

积分
404
最后登录
2022-6-10
 楼主| 发表于 2019-7-10 16:33:25 | 显示全部楼层
小恩GG 发表于 2019-7-10 14:00
你手上有确认的正常可工作的EEPROM芯片吗?你现在的情况无法肯定问题是出现在硬件还是软件上 ...

已更新贴子。请查收。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

61

帖子

0

中级会员

Rank: 3Rank: 3

积分
404
最后登录
2022-6-10
 楼主| 发表于 2019-7-13 22:38:32 | 显示全部楼层
anxb 发表于 2019-7-13 11:10
给你发个我的代码

//******************************************************************************

没问题了
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

82

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1239
最后登录
2022-1-7
发表于 2019-7-18 16:35:36 | 显示全部楼层
请问是什么原因呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-8-25 03:47 , Processed in 0.119542 second(s), 33 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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