3203|11

1万

帖子

26

TA的资源

裸片初长成(高级)

楼主
 

完全抄ltbytyn的I2C程序,怎么会不正常工作? [复制链接]

手里有几片24C02的EEPROM, 随使用F28027对它作读写试验,看了两遍TI的文档,也没完全领会掌握,就使用了ltbytyn的程序,@ltbytyn对EEPROM读写的F28027的I2C程序https://bbs.eeworld.com.cn/thread-427777-1-23.html

开始时不工作,就完全照搬了他的程序,数组也是一样的,读写的数据块也一样,…… 总之,完全一样,出现的现象为:

数组的前两个字节为255、255,中间五个字节可以读写(可以按指定的数据写入并正确读出),后三个字节一直为255、255、255。

电路上,检查没发现问题,就用另一块实验板做实验,结果现象完全一样。

纳闷中!

最新回复

我在采用该程序的时候发现这样的问题:    采用先写,延时,在读出。发现这样的问题:   写入数据函数->延时->断点-->读函数->延时,程序运行正常,结果正确; 如采用这样的步骤:     写入数据函数->延时-->读函数->延时,程序不正确:程序停留在:   while(I2caRegs.I2CSTR.bit.XRDY == 0){}; 处。           I2caRegs.I2CSAR = I2C_SLAVE_ADDR;               //Set slave address            I2caRegs.I2CCNT = 2;                            //Set count to 2 address bytes            I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;            I2caRegs.I2CMDR.bit.TRX = 1;                    //Set to Transmit mode            I2caRegs.I2CMDR.bit.MST = 1;                    //Set to Master mode            I2caRegs.I2CMDR.bit.FREE = 1;                   //Run in FREE mode            I2caRegs.I2CMDR.bit.STP = 0;                    //Dont release the bus after Tx            I2caRegs.I2CMDR.bit.STT = 1;                    //Send the start bit, transmission will follow            while(I2caRegs.I2CSTR.bit.XRDY == 0){};         //Do nothing till data is shifted out            I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;   详情 回复 发表于 2016-4-15 16:29
 
点赞 关注

回复
举报

1万

帖子

26

TA的资源

裸片初长成(高级)

沙发
 
注:以上说的255、255、…… 为读出时的显示。
究竟是没有写入还是读出不正确?--- 没有验证
 
 

回复

9717

帖子

24

TA的资源

版主

板凳
 
4.7K上接电阻接了吗?

点评

接电阻了,接的是5.1K的,但我把高、低电平的时间都增加一倍,还是那个现象  详情 回复 发表于 2016-3-28 14:11
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

2856

帖子

260

TA的资源

五彩晶圆(高级)

4
 
我的程序都是验证过的,问题可能还是在配置上面。我晚上回去找找以前对工程

点评

谢谢你。我现在正在看TI的文档,也找找问题所在。  详情 回复 发表于 2016-3-28 14:12
 
 
 

回复

5979

帖子

8

TA的资源

版主

5
 
好高端的样子
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

1万

帖子

26

TA的资源

裸片初长成(高级)

6
 
littleshrimp 发表于 2016-3-28 12:45
4.7K上接电阻接了吗?

接电阻了,接的是5.1K的,但我把高、低电平的时间都增加一倍,还是那个现象
 
 
 

回复

1万

帖子

26

TA的资源

裸片初长成(高级)

7
 
ltbytyn 发表于 2016-3-28 12:49
我的程序都是验证过的,问题可能还是在配置上面。我晚上回去找找以前对工程

谢谢你。我现在正在看TI的文档,也找找问题所在。
 
 
 

回复

6069

帖子

4

TA的资源

版主

8
 
程序的基本设置应该没问题,估计是程序操作部分有问题,比如读写时哪里循环掉了几个字节什么的,看你引用的例子不是标准的读写程序,多写多少个都是函数里写进去的。仔细看下应该就没问题了。

上拉电阻5.1K肯定是没问题了。
 
 
 

回复

1万

帖子

26

TA的资源

裸片初长成(高级)

9
 
本帖最后由 dontium 于 2016-3-29 22:28 编辑

现在找到了一个问题,@ltbytyn



程序中使用的数组是10个,在看24C02手册时,突然想着要看看它“页写”的页大小,发现了问题:

The data word address lower three bits are internally incremented following the receipt of each data word. The
higher data word address bits are not incremented, retaining the memory page row location. When the word
address, internally generated, reaches the page boundary, the following byte
is placed at the beginning of the  same page。


而它的页大小为:
AT24C02C, 2K Serial EEPROM: Internally organized with 32 pages of eight bytes each, the 2K requires an
8-bit data word address for random word addressing



在上图中,数组的第8项为什么没有正确写入,不知道是什么原因。正在寻找中。。。。。。。

点评

老式的EEPROM有页写限制,如24Cxx系列。我调试I2C的时候用的是铁电FRAM,写的时候没有页写限制。  详情 回复 发表于 2016-3-30 09:04
 
 
 

回复

2856

帖子

260

TA的资源

五彩晶圆(高级)

10
 
dontium 发表于 2016-3-29 22:26
现在找到了一个问题,@ltbytyn



程序中使用的数组是10个,在看24C02手册时,突然想着要看看它“页写 ...

老式的EEPROM有页写限制,如24Cxx系列。我调试I2C的时候用的是铁电FRAM,写的时候没有页写限制。
 
 
 

回复

2856

帖子

260

TA的资源

五彩晶圆(高级)

11
 
其实我在https://bbs.eeworld.com.cn/thread-427610-1-1.html 帖子里面已经提到过。没有页写可能是FRAM对我而言能看到对唯一亮点。至于写入时间什么的,我关注不是太多
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

12
 
我在采用该程序的时候发现这样的问题:
   采用先写,延时,在读出。发现这样的问题:
  写入数据函数->延时->断点-->读函数->延时,程序运行正常,结果正确;
如采用这样的步骤:
    写入数据函数->延时-->读函数->延时,程序不正确:程序停留在:
  while(I2caRegs.I2CSTR.bit.XRDY == 0){}; 处。

          I2caRegs.I2CSAR = I2C_SLAVE_ADDR;               //Set slave address
           I2caRegs.I2CCNT = 2;                            //Set count to 2 address bytes
           I2caRegs.I2CDXR = I2C_EEPROM_HIGH_ADDR;

           I2caRegs.I2CMDR.bit.TRX = 1;                    //Set to Transmit mode
           I2caRegs.I2CMDR.bit.MST = 1;                    //Set to Master mode
           I2caRegs.I2CMDR.bit.FREE = 1;                   //Run in FREE mode
           I2caRegs.I2CMDR.bit.STP = 0;                    //Dont release the bus after Tx
           I2caRegs.I2CMDR.bit.STT = 1;                    //Send the start bit, transmission will follow

           while(I2caRegs.I2CSTR.bit.XRDY == 0){};         //Do nothing till data is shifted out
           I2caRegs.I2CDXR = I2C_EEPROM_LOW_ADDR;


 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表