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.

[参考译文] TM4C129ENCPDT:TM4C129ENCPDT I2C AT24C256 EEPROM 读写问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/663048/tm4c129encpdt-tm4c129encpdt-i2c-at24c256-eeprom-read-write-problem

器件型号:TM4C129ENCPDT

大家好,我想读/写一些数据到外部 EEPROM (AT24C256)。 我可以读取/写入字节、但在读取和写入字时、尤其是双字时、我面临一些问题。  

1) 1)当读取一个字时、我看到第一个字节的前面为0xFFFF。 这种情况有时并非始终发生。
2) 2)我无法读取和写入双字校正。 我将写下我期望的内容和我看到的内容。

正在等待帮助。

在这里,您可以看到相关的代码段:

初始化

空 InitI2C (空)

SysCtlPeripheralEnable (SYSCTL_Periph_I2C5);
SysCtlPeripheralReset (SYSCTL_Periph_I2C5);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
GPIOPinConfigure (GPIO_PB4_I2C5SCL);
GPIOPinConfigure (GPIO_PB5_I2C5SDA);
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_4);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_5);
I2CMasterInitExpClk (I2C5_base、SysCtlClockGet ()、false);
HWREG (I2C5_base + I2C_O_FIFOCTL)= 80008000;
I2CMasterEnable (I2C5_base);
EEPROM_WRITE_PROVE_ENABLE();


void EEPROM_WRITE_PROVE_ENABLE (void)

GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_3);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、GPIO_PIN_3);

void EEPROM_WRITE_PROVE_DISABLE (void)

GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_3);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、0);


空 Write_EEPROM_Byte (UINT16地址、Int16数据)

EEPROM_WRITE_PROVE_DISABLE();

I2CMasterSlaveAddrSet (I2C5_base、slave_address、false);

I2CMasterDataPut (I2C5_base、((地址>> 8)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、(地址和0x00FF));
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、data & 0xFF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_FINISH);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

EEPROM_WRITE_PROVE_ENABLE();


Int16 READ_EEPROM_Byte (UINT16地址)

int16 temp = 0;
I2CMasterSlaveAddrSet (I2C5_base、slave_address、false);

I2CMasterDataPut (I2C5_base、((地址>> 8)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、(地址和0x00FF));
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterSlaveAddrSet (I2C5_base、slave_address、true);

I2CMasterControl (I2C5_base、I2C_MASTER_CMD_SINGLE_Receive);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));
temp =(I2CMasterDataGet (I2C5_base)& 0xFF);
return( temp );


空 Write_EEPROM_Word (UINT16地址、Int16数据)

EEPROM_WRITE_PROVE_DISABLE();

I2CMasterSlaveAddrSet (I2C5_base、slave_address、false);

I2CMasterDataPut (I2C5_base、((地址>> 8)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay (1000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、(地址和0x00FF));
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (1000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、((数据>> 8)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (1000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、(DATA & 0x00FF));
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_FINISH);
SysCtlDelay (1000);
while (I2CMasterBusy (I2C5_base));

EEPROM_WRITE_PROVE_ENABLE();

Int16 READ_EEPROM_Word (UINT16地址)

int16 temp = 0;
I2CMasterSlaveAddrSet (I2C5_base、slave_address、false);

I2CMasterDataPut (I2C5_base、((地址>> 8)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay (1000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、(地址和0x00FF));
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (1000);
while (I2CMasterBusy (I2C5_base));

I2CMasterSlaveAddrSet (I2C5_base、slave_address、true);


I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_Receive_start);
SysCtlDelay (1000);
while (I2CMasterBusy (I2C5_base));
temp =(I2CMasterDataGet (I2C5_base)<<8);

I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_Receive_CONT);
SysCtlDelay (1000);
while (I2CMasterBusy (I2C5_base));
temp +=(I2CMasterDataGet (I2C5_base));

I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_Receive_finish);
return( temp );


空 Write_EEPROM_double_Word (UINT16地址、Int32数据)

EEPROM_WRITE_PROVE_DISABLE();

I2CMasterSlaveAddrSet (I2C5_base、slave_address、false);

I2CMasterDataPut (I2C5_base、((地址>> 8)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、(地址和0x00FF));
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、((数据>> 24)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、((数据>> 16)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、((数据>> 8)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base,(data & 0x00FF));
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_FINISH);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

EEPROM_WRITE_PROVE_ENABLE();


uint32_t READ_EEPROM_DOUBLE_Word (uint16地址)

uint16_t temp2、temp3、temp4、temp5;
uint32_t temp;
I2CMasterSlaveAddrSet (I2C5_base、slave_address、false);

I2CMasterDataPut (I2C5_base、((地址>> 8)& 0x00FF);
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterDataPut (I2C5_base、(地址和0x00FF));
I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));

I2CMasterSlaveAddrSet (I2C5_base、slave_address、true);

I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_Receive_start);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));
TEMP2 =(I2CMasterDataGet (I2C5_base));

I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_Receive_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));
temp3 =(I2CMasterDataGet (I2C5_base)));

I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_Receive_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));
temp4=(I2CMasterDataGet (I2C5_base)));

I2CMasterControl (I2C5_base、I2C_MASTER_CMD_BURST_Receive_finish);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C5_base));
temp5=(I2CMasterDataGet (I2C5_base));

temp =(temp2 << 24)|(temp3 << 16)|(temp4 << 8)| temp5;
return( temp );


int main

uint16_t EEPROM_READ_array[33000]、i、j;

WRITE_EEPROM_Word (6、0x9C3A);
SysCtlDelay (100000);
WRITE_EEPROM_Word (8、0x409B);
SysCtlDelay (100000);
WRITE_EEPROM_Word (10、0x23FD);
SysCtlDelay (100000);
WRITE_EEPROM_Word (12、0x3344);
SysCtlDelay (100000);

WRITE_EEPROM_DOUBLE_Word (30、0x103080B0);

SysCtlDelay (100000);

for (i=0、j=6;i<4;i++、j+=2)
EEPROM_READ_array[i]= READ_EEPROM_Word (j);

我将视为输出 FFFF9C3A、409B、23FD、3344。 正如我之前提到的、我在第一个字节之前看到一些0xFFFF 数据、这种情况有时会发生。 有时我会正确读取它。


uint32_t temp_value_int32;


temp_value_int32 = READ_EEPROM_DOUBLE_Word (30);

我明白了      :41B03080
预期 :103080B0

我想我错过了一些关于沥青的东西。  



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="ChandlerBing ]"我认为我错过了有关位字的一些信息。  [/报价]

    即使(真实的)钱德勒也很难"咬人"。

    可能"大端与小端"会更好地描述。

    您是否无法理解"哪种方法(大多数)在 MCU 和 EEPROM 中"发挥作用"、然后设计为通用格式?

    请注意、您的大部分代码(尤其是写保护)超出了您的问题的"重点/目标"范围、并且它的存在会分散您的注意力并迫使您的无帮助者付出更多的时间/精力。   您创建的"最低限度代码列表"是否"充分说明了您的目标-和失败"最能为您本人和帮助者提供帮助?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chandler、您好!

    在讨论过程中、源代码可能很有用、但目前我建议如下:

    1) 1)使用逻辑状态分析器确认正在发送的命令和正在读取的数据
    2) 2)在函数内进行调试、以确定您是否从 I2C 调用中获得了正确的值

    这将有助于跟踪应用程序代码中的问题、或者您如何配置 EEPROM 读取/写入、从而导致 I2C 发送错误的值。 不过、如果 FFFF 被附加到第一个字节、我怀疑应用代码中存在此问题、正如您所说的那样。

    您如何输出数据值? 我看不到执行该操作的任何函数。

    FFFF 在过程中出现在何处? 在 Read_EEPROM_Word API 之后的 EEPROM_READ_array 变量中? 还是仅在输出时?

    仍然有很多缺失的信息、我们无法提供一些建设性的建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    感谢您的评论。 我会尝试更有效地解释问题。

    我意识到、当数据大于0x7FFF 时会出现 FFFF 问题。

    如果我在代码中写入0x7FFF;写入数据0x7FFF、读取数据0x7FFF。

    如果我在代码中写入0x8000或更大的数据、我会在写入和读取数据之前看到 FFFF。 0xFFFF8000

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chandler、您好!

    当然、这很有趣、很好知道、但它并不能真正帮助我诊断可能发生的错误。

    现在、问题可能出在 EEPROM 数据输出、TM4C I2C 外设、您自己的函数以及如何读取数据等方面。

    让我们从一个简单的东西开始。 您如何输出数据值? 如所示、您在哪里可以看到 FFFF? 在调试期间它是否在缓冲器中? 示波器捕获上的示波器? 在 UART 打印之后的终端上?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chandler、您好!

    您是否仍然面临这方面的问题? 如果是、您仍在寻求支持、请在2月9日帮助解决我在我的帖子中提出的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chandler、您好!

    我将关闭该线程。 如果您仍面临此问题、您可以响应我的消息以重新打开它(如果该线程由于超时而锁定、则可以重新发布并链接该线程)。