IC读写EEPROM问题总结502.pdf

上传人:深夜****等你... 文档编号:75099481 上传时间:2023-03-01 格式:PDF 页数:10 大小:456.56KB
返回 下载 相关 举报
IC读写EEPROM问题总结502.pdf_第1页
第1页 / 共10页
IC读写EEPROM问题总结502.pdf_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《IC读写EEPROM问题总结502.pdf》由会员分享,可在线阅读,更多相关《IC读写EEPROM问题总结502.pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 IC 读写 EEPROM 问题总结 Revised by Liu Jing on January 12,2021 2017年6月30日星期五 目的:利用 TMS320F2801 芯片上外设 I2C(2 线串口)读写 EEPROM 数据(24LC128)关键点 1:24LC 时钟频率 400KHz,寄存器设置如下:I2caRegs.I2CPSC.all=9;/Prescaler-need 7-12 Mhz on module clk I2caRegs.I2CCLKL=10;/NOTE:must be non zero I2caRegs.I2CCLKH=5;/NOTE:must be non z

2、ero 时钟频率也可设为 200KHz,三个参数分别为 9、20、20(CPU 时钟频率为100MHz)(未测试)关键点 2:波形分析 问题:I2C 模块是不是只有 I2CCNT 减到 0 才会发出停止信号?I2C 模块是硬件的,当检测到发送完了就会发结束自动发信号,不需要人为干预 问题 1:字节写操作正常,但是字节读函数出错 原因:写 EEPROM 是在七位器件地址后添加写标志,而读 EEPROM 需要在七位器件地址后添加写标志。关键点:读 EEPROM 数据需要发送两次命令。第一次为写地址(此地址会被赋值给 EEPROM 内的地址指针),因此需要添加写标志;第二次为读数据,将写标志改为读标

3、志。问题 2:主机接收时,SDA 数据线上有数据传输,且 I2CDRR 接收数据寄存器有数据更新,但寄存器显示不可读,即 CPU 认为一直没接收到数据,一直停在下面语句 while 关键点:初始化设置时采用的是 FIFO 接收方式,因此无效,应查询 FIFO接收中断位 while 方式查询位。此位只有在非 FIFO 中断接收方式时才有效。问题 3:断续单字节读写正常,但是采用连续的单字节读写出错。原因:EEPROM 写过程的结束并不是 I2C 总线写结束就结束,实际上 I2C总线的写入数据先被保存到了 EEPROM 内部的缓冲区,当遇到 I2C 结束条件后,EEPROM 才启动内部写过程,这个

4、过程才是保存数据的过程。非常悲哀的是这个过程比较长,官方文档标注为 5ms。如果在这 5ms 以内对EEPROM 芯片访问将被忽略。关键点:读写 EEPROM 应延时至少 5ms,软件延时 10ms dowhile(EEPROM_Timer=10);/10ms 问题 4:查询 EEPROM 写过程是否结束造成死机,只能查询 EEPROM 读过程。官方文档说 EEPROM 内部写周期最长为 5ms,在很多情况下是远远低于5ms 的,为了节约时间,官方给出一个解决办法。当写周期完毕后就开始进行应答查询,来确定 EEPROM 写周期何时结束。所谓应答查询官方解释为:就是向 EEPROM 发送一个 I

5、2C 起始条件后发送器件地址和一个读写标志位,当 EEPROM 完成内部写周期会回应一个 ACK,这时 MCU 就可以进行正常的其他读写过程了。官方原文如下:杯具就是始于我画红线的那句话,它说可以在器件地址后任意填写读写标志。我就填了读标志,事实证明在 EEPROM 写入过程采用读查询将导致系统死机,I2C 总线不能被正常拉高,可能是 EEPROM 内部已经把总线拉到了地!不管怎样,反正就是死机了。经过多次尝试最终发现应答查询只能采用写应答查询可以正常确定 EEPROM 内部写周期的结束。by 数据传输过程:从机发送数据 SDA 总线 I2CRSR 缓冲寄存器 I2CDRR 接收数据寄存器中间

6、变量内存。问题 5:CPU 以字(双字节)为单位读写 EEPROM 数据有误;原因:CPU 中的内存单元以字(word-16bit)为单位,而 EEPROM 中的内存单元是字节(byte-8bit)为单位,因此将 CPU 内存地址转化为 EEPROM指针地址时,因乘以 2(左移一位)问题 6:使用读数据函数式,收到的数据都是 1。原因:EEPROM 初次读取未写过的内存单元时,默认为高电平,即收到的字节为 0 xFF。如果已经写过内存单元,则代表数据未成功写入;写入与读数据的内存地址不一样。问题 7:写入 EEPROM 的数据与随后读出来的数据不一致,但读出来的数据又没有规律性。可能原因:数据

7、未成功写入;数据读写字节数超过 EEPROM 的页内字节数(跨页);读写地址不一致;读写 EEPROM 之间应有一定的延时时间。解决办法:若连续读多字节数据,则读取数据之间应加延时,因为数据从 I2CRSR 数据接收缓冲寄存器(多字节)复制到 I2CCDRR 数据接收寄存器(一字节)需要时间。单字节延时 25us,双字节(字)延时 50us测试通过 问题 8:使用示波器观测 SDA 数据线上的波形时,发现每次应答信号之前都有一个毛刺(尖峰),是什么原因导致的?(不影响数据的正常读写)类似问题:使用 F28335 模拟 I2C 时序读取惯导器件的数据时,发现在更改 SDA 的传输方向时,Gpio

8、 中数据寄存器会发生变化,导致 SDA 上有毛刺产生。问题 9:I2C 在跟 EEPROM 通讯的时候,第一次写入数据,一个一个读取的话,能知道写入 EEPROM 的值是没有错的,但是在连续读取数据的时候,就会出现,上电第一次读取数据串的时候,是全部读取正确,然后再读取一遍数据串的时候,只有第一个读取的数据是正确的,后面的数据会全部变成 FF FF 这是怎么回事?办法 1:大家都说 STM32 的 IIC 有点 bug,所以很少人用其自带的 IIC,一般都是用 IO 口模拟 IIC,模拟很简单而且不会出错。逻辑分析仪抓取 I2C 总线数据,改为转接板抓取数据,即 I2C 转 USB 通讯。问题

9、 10:I2C 给 EEPROM 写数据时,两字节地址需不需要算进去吗 答案:需要,且地址字节数与 EEPROM 的型号(容量)相关,有些为 1 字节地址,有些为 2 字节地址。24LC128 需要两字节地址来区分内存单元,其内存最小单元为 1 字节,地址从 0 x00 开始,一页 64 字节,因此地址指针范围为:0 x000 x3F。I2caRegs.I2CCNT=(n1)+2;问题 11:一次读写数据字节数最好不超过 16 字节。原因:其一 I2C 深度寄存器范围限定,其二,读写数据字节太多会导致I2C 总线出错的概率加大。ST_5bit(0 x00000 x10000)I2caRegs.

10、I2CFFTX.bit.TXFFIL_5bit I2caRegs.I2CFFRX.bit.RXFFST_5bit(0 x00000 x10000)I2caRegs.I2CFFRX.bit.RXFFIL_5bit I2caRegs.I2CCNT_32bit 问题 12:总是提示总线繁忙=1 总线繁忙,BB=0 总线空闲 关键:总线繁忙这个位只读。猜想解决办法:如果是上电第一次读写就出现总线繁忙,就对 I2C 模块进行复位;如果不是第一次,且 I2C 总线上只有一主,则等待一定时间(5ms);如果是多主,则返回,等待总线空闲吧。问题 13:CPU 写数据给 EEPROM 时,如果设置断点,就能成功

11、写入数据,但没有断点,数据写不成功。什么原因呀?原因:写保护 WP 引脚的电平应在接收到停止信号后,应保持低电平一段时间才使能写保护,即加延时语句。已测试通过/所有字节(地址字节+数据字节)都是添加写标志,即低电平,2n+2=64/写EEPROM地址从0开始/void EEPROM_Write_call(Uint16 address,Uint16 n,Uint16 s)Uint16 i,data_temp;dowhile(EEPROM_Timer=20);/20ms /Check if bus busy if(I2caRegs.I2CSTR.bit.BB!=0)/总线忙位,不能手动清除 ret

12、urn;if(WP!=0)WP=0;/清除从机EEPROM写保护模式 /Setup slave address-7bit I2caRegs.I2CSAR=0 x50;I2caRegs.I2CCNT=(n8);if(I2caRegs.I2CSTR.bit.NACK!=0)return;while(I2caRegs.I2CSTR.bit.XRDY!=1);I2caRegs.I2CDXR=(address&0 x00FF);if(I2caRegs.I2CSTR.bit.NACK!=0)return;/Setup data to send for(i=0;i 8;if(I2caRegs.I2CSTR.

13、bit.NACK!=0)return;dowhile(I2caRegs.I2CSTR.bit.SCD!=1);/是否有停止信号 WP=1;/保护EEPROM,使其只读 EEPROM_Timer=0;问题 14:波形错误用 I2C 接口,SCK 和 SDA 都接有 4.7K 的上拉电阻,用示波器抓 SCK 和 SDA 的波形,发现 SCK 时序正常,SDA 异常,见附图(黄为 SCK,紫为 SDA),请问这个锯齿波形大概是什么原因造成的呢?by 猜测原因:可能是 I2C 模块时钟频率设置不合理;未验证 IIC 中断作用:IIC 中断和 UART 中断一样,你可以立刻得到数据,而不需要总是查询。I

14、IC 接收数据只是存到指定的寄存器中,如果你不取走,下次再接收数据就直接冲掉了,所以 IIC 接收到数据之后给 CPU 中断,去处理这些收到的数据!查找中断源是一种保险的做法,要是由于其他的哪几种原因产生了中断,但是此时数据并没有接收完,中断服务子程序去处理数据了,结果就不对了!如果你自己敢保证不会出现哪几种情况就可以完全不用写!by /I2C(接收)interrupt void i2c_int1a_isr(void)/I2C-A Uint16 IntSource;/Read interrupt source switch(IntSource)case I2C_NO_ISRC:break;/=

15、0 case I2C_ARB_ISRC:break;/=1 case I2C_NACK_ISRC:break;/=2 case I2C_ARDY_ISRC:break;/=3 case I2C_RX_ISRC:/=4 InDataI2cIndex+=I2caRegs.I2CDRR;break;case I2C_TX_ISRC:break;/=5 case I2C_SCD_ISRC:break;/=6 case I2C_AAS_ISRC:break;/=7 default:/asm(ESTOP0);/Halt on invalid number.asm(RPT#5|NOP);/Enable future I2C(PIE Group 8)interrupts

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁