This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28034:I2C EEPROM 随机读取问题

Guru**** 2303350 points
Other Parts Discussed in Thread: TMS320F28034
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/568411/tms320f28034-i2c-eeprom-random-read-issue

器件型号:TMS320F28034

我正在使用 TMS320F28034的 I2C 在 EEPROM AT24C08C 中读取和写入数据。

我在 ramdon 读取操作方面遇到问题。

情况1)

按照以下顺序->写入字地址->从同一字地址读取-> reg (I2CDRR)加载正确的数据。 但是变量 四字节       

未加载正确的数据。 我需要调用两   次读取函数 UINT16 Reade2Prom (UINT16 e2promaddress)来获得 四字节= I2caRegs.I2CDRR;

在     四字节= I2cRegs.I2CSTR.bit.SCD 之前检查标志是否正确;在四字节= I2cRegs.I2CDRR 之前;?

情况2)

当  调用 reas 函数 UINT16 Reade2Prom (UINT16 e2promaddress) 来读取不同 的字地址时、它不起作用 I2CDRR 不更新。

我的以下代码中有什么问题?

有人能帮我举个例子、让我正确执行这些操作吗?

for (;;) //infinite loop

{            

IF (FlagTestI2CREAD = 1)

 quadbyteTEST = Reade2Prom (e2promaddress);

 FlagTestI2CREAD=0;

 

IF (FlagTestI2CWRITE = 1)

 Write2Prom (e2promaddress、EEdata);

 FlagTestI2CWRITE = 0;

  

I2CInit ()

   I2caRegs.I2CMDR.bit.IRS = 0;

   I2caRegs.I2CPSC.all = 5;//

   I2caRegs.I2CCLKH = 21;//

   I2caRegs.I2CCLKL = 69;//

   I2caRegs.I2CIER.ALL    = 0x0000;  //

   I2caRegs.I2CFFTX.ALL   = 0x6040;

   I2caRegs.I2CFFRX.ALL   = 0x2040;//

   I2caRegs.I2CMDR.ALL    = 0x0020;

uint16 Reade2Prom (uint16 e2promaddress)

    uint16地址慢速;

   uint16地址;

 

      address slow               = e2promaddress & 0x00FF;

      addressshigh              =(e2promaddress>>8)和0x00FF;

      I2caRegs.I2CSAR   = EEPROM_ADDR;//0x0050;

 

      I2caRegs.I2CCNT          = 0x0002;

      I2caRegs.I2CDXR          =地址高;

      I2caRegs.I2CDXR          =地址慢速;

      I2caRegs.I2CMDR.ALL = 0x2620;//发送器模式-主控模式//启动      

    while (!I2cRegs.I2CSTR.bit.ARDY);

 

      I2caRegs.I2CCNT          = 0x0001;

      I2caRegs.I2CMDR.ALL = 0x2C20;//接收器模式-主控模式//启动-      

    while (!I2cRegs.I2CSTR.bit.SCD);

      Quadbyte              = I2caRegs.I2CDRR;

      return (quadbyte);

 }

 

 

Write2Prom (uint16 e2promaddress、uint16 EEdata)

      uint16地址慢速;

      uint16地址;

      address slow               = e2promaddress&0x00FF;

      address shigh              =(e2promaddress>>8)&0x00FF;

      I2caRegs.I2CSAR   = EEPROM_ADDR;//0x0050;

      I2caRegs.I2CCNT          = 3   ;

      I2caRegs.I2CDXR          =地址高;

      I2caRegs.I2CDXR          =地址慢速;

      I2caRegs.I2CDXR          = EEdata;

      I2caRegs.I2CMDR.ALL = 0x2E20;//发送器模式-主控模式//启动

      while (!I2cRegs.I2CSTR.bit.SCD);

      I2caRegs.I2CSTR.bit.SCD = 1;

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最好等待 RRDY 位变为高电平。 请不要忘记在读取数据后手动清除它。

    quadbyte 是全局变量吗? 如果是、请确保将其声明为 volatile、尤其是在打开了编译器优化时。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam、感谢您的支持!

    1 -我使 quadbyte 成为一个易失性全局变量、但它 没有解决问题。

    2 - 为了进行调试、我使 addressshigh 和 addressslow 成为一个易失性全局变量。   

    我对代码进行了一些更改、以便在没有 FIFO 的情况下工作、检查标志 RRDY 和 XRDY、请参阅下面的新代码。

    请参阅尝试解决问题但仍没有解决方案的测试。

    空 I2CInit (空)

      I2caRegs.I2CMDR.bit.IRS = 0;

      I2caRegs.I2CPSC.all = 5;//

      I2caRegs.I2CCLKH = 30;//

      I2caRegs.I2CCLKL = 60;//

      I2caRegs.I2CIER.ALL  = 0x0000; //禁用所有中断

      I2caRegs.I2CFFTX.all  = 0;//

      I2caRegs.I2CFFRX.ALL  = 0;//

      I2caRegs.I2CMDR.ALL  = 0x0020;

    空 Write2Prom (uint16 e2promaddress、uint16 EEdata)

    address shigh   =(e2promaddress & 0x0300)>> 8;

    address slow =(e2promaddress & 0x00FF);

    I2caRegs.I2CSAR = EEPROM_ADDR;//0x0050;

    I2caRegs.I2CCNT = 3;

    I2caRegs.I2CDXR =地址高;

    I2caRegs.I2CMDR.ALL = 0x2E20;//发送器模式-主控模式//开始-从器件地址- n 个数据字节(I2CCNT)-停止 //

      while (I2cRegs.I2CSTR.bit.XRDY = 0);

      I2caRegs.I2CDXR  =地址慢速;

      while (I2cRegs.I2CSTR.bit.XRDY = 0);

      I2caRegs.I2CDXR  = EEdata;

      while (I2cRegs.I2CSTR.bit.XRDY = 0);

    int16 Reade2Prom (uint16 e2promaddress)

      address shigh   =(e2promaddress & 0x0300)>> 8;

      address slow   =(e2promaddress & 0x00FF);

    I2caRegs.I2CSAR = EEPROM_ADDR;//0x0050;

    I2caRegs.I2CCNT = 0x0002;

    I2caRegs.I2CDXR =地址高;

    I2caRegs.I2CMDR.ALL = 0x2620;//发送器模式-主控模式//开始-从器件地址- n 个数据字节(I2CCNT)//

      while (I2cRegs.I2CSTR.bit.XRDY = 0);

      I2caRegs.I2CDXR  =地址慢速;

      while (I2cRegs.I2CSTR.bit.XRDY = 0);

    I2caRegs.I2CCNT = 0x0001;

    I2caRegs.I2CMDR.ALL = 0x2C20;//接收器模式-主控模式//开始-从器件地址- n 个数据字节(I2CCNT)-停止//

      while (I2cRegs.I2CSTR.bit.RRDY = 0);

    Quadbyte   = I2caRegs.I2CDRR;

    I2caRegs.I2CSTR.bit.RRDY = 1;

    return (quadbyte);

    一些具有变化行为的测试。

    1– 在“测试 A” 中执行了以下操作:

    范围(0 - 255)中的所有 EEPROM 地址返回相同的值 quadbyte = 55;

    范围(256 - 511)内的所有 EEPROM 地址都返回相同的值 quadbyte = 77;

    范围(512 - 767)中的所有 EEPROM 地址都返回相同的值四字节= 254;

    范围(768 - 1023)中的所有 EEPROM 地址返回相同的值 quadbyte = 77;

    2– 在“测试 B”中 ,在 数据值= 99的范围(768 - 1023)(即1000)内的某些地址执行写入

    3– 在“测试 C” 中执行读操作:

    范围(0 - 255)中的所有 EEPROM 地址返回相同的值 quadbyte = 55;

    范围(256 - 511)内的所有 EEPROM 地址都返回相同的值 quadbyte = 77;

    范围(512 - 767)中的所有 EEPROM 地址都返回相同的值四字节= 255;

    整个范围(512–767)意外更改;

    范围(768 - 1023)中的所有 EEPROM 地址都返回相同的值 quadbyte = 99;

    执行了一次写入操作、整个范围(768 - 1023)返回的值应仅在所选地址(例如1000)中。

    4– 在“测试 D” 中,在 数据值= 88的范围(768 - 1023)(即1000)内的某个地址执行写入

    5– 在“测试 E” 中执行了以下操作:

    范围(0 - 255)中的所有 EEPROM 地址返回相同的值 quadbyte = 55;

    范围(256 - 511)内的所有 EEPROM 地址都返回相同的值 quadbyte = 77;

    范围(512 - 767)中的所有 EEPROM 地址都返回相同的值 quadbyte = 0;

    整个范围(512–767)意外更改;

    范围(768 - 1023)中的所有 EEPROM 地址都返回相同的值 quadbyte = 88;

    执行了一次写入操作、整个范围(768 - 1023)返回的值应仅在所选地址(例如1000)中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想您已误读 AT24C08C 数据表。 字地址的高两位作为 I2C (字)地址的一部分发送。 它们不会作为数据字节发送。 只有低8字地址位作为数据字节发送。 因此、您的读取序列应为:

    Start -> Device address + 3 MSB of word address (write)-> 8 LSB of word address -> Start -> Device address + 3 MSB of word address (read)-> 8 LSB of word address -> EEPROM data -> Stop

    您的写入字节序列应为:

    Start (开始)-> Device address (设备地址)+ 3 MSB of word address (写入)-> 8 LSB of word address (字地址的8 LSB)-> Data to write (要写入的数据)-> Stop (停止)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam:

    非常感谢。

    按照您的说明、我更改了代码、现在它正在工作。

    //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

    int16 Reade2Prom (uint16 e2promaddress)

    address shigh =(e2promaddress & 0x0300)>> 8;
    address slow =(e2promaddress & 0x00FF);
    I2caRegs.I2CSAR =(EEPROM_ADDR | address shigh);
    I2caRegs.I2CCNT = 0x0001;
    I2caRegs.I2CDXR =地址慢速;
    I2caRegs.I2CMDR.ALL = 0x2620;//发送器模式-主控模式//开始-从器件地址- n 个数据字节(I2CCNT)//
    while (I2cRegs.I2CSTR.bit.XRDY = 0);

    I2caRegs.I2CCNT = 0x0001;
    I2caRegs.I2CMDR.ALL = 0x2C20;//接收器模式-主控模式//开始-从器件地址- n 个数据字节(I2CCNT)-停止//
    while (I2cRegs.I2CSTR.bit.RRDY = 0);
    Quadbyte = I2caRegs.I2CDRR;
    I2caRegs.I2CSTR.bit.RRDY = 1;
    return (quadbyte);

    //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

    空 Write2Prom (uint16 e2promaddress、uint16 EEdata)

    address shigh =(e2promaddress & 0x0300)>> 8;
    address slow =(e2promaddress & 0x00FF);
    I2caRegs.I2CSAR =(EEPROM_ADDR | address shigh);
    I2caRegs.I2CCNT = 2;
    I2caRegs.I2CDXR =地址慢速;
    I2caRegs.I2CMDR.ALL = 0x2E20;//发送器模式-主控模式//开始-从器件地址- n 个数据字节(I2CCNT)-停止//
    while (I2cRegs.I2CSTR.bit.XRDY = 0);
    I2caRegs.I2CDXR = EEdata;
    while (I2cRegs.I2CSTR.bit.XRDY = 0);