请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28P650DK 工具/软件:
大家好!
我当前正在使用 TMS320F28P65DK9 并连接到 EEPROM ( 24LC256 ) 至 I2C 。 我在写入和读取数据时遇到问题。
我已附上 .c 文件以供您参考。
我已将从器件地址配置为 0x50 。
写入序列:
-
启动
-
[0xA0]→EEPROM 7 位地址 (0x50)<< 1 +写入位 (0)= 0xA0 -
[0x00]→ControlAddr(0x0000 >> 8) 的高字节 -
[0x00]→ControlAddr(0x0000 & 0xFF) 的低字节 -
[0x46]→数据字节(值 70) -
STOP
读取序列:
-
启动
-
[0xA0]→写入模式 -
[0x00] -
[0x00] -
重复启动
-
[0xA1]→读取模式 -
读取字节
-
STOP
有的时候,上面的工作正常。但有的时候它是失败的。
请指导我解决上述问题、并告诉我出错的地方。#include <stdio.h> #include <string.h> #include <stdlib.h> #include "driverlib.h" #include "device.h" #include "libs/i2c/i2c_driver.h" #include "drivers_internal/uart/uart_driver.h" #include "libs/i2c/i2c.h" #include "i2c.h" #include "eeprom.h" #define EEPROM_I2C_ADDR 0x50 // 24LC256 default I2C address /** * @brief CLI command to write a byte to EEPROM * @param argc Number of arguments * @param argv Argument list: [mem_addr] [data] * @return 0 on success, -1 on failure */ int cli_write_eeprom(int argc, char **argv) { if (argc < 3) { uart_printf("[Error] Usage: write-eeprom <mem_addr> <data>\r\n"); return -1; } uint16_t mem_addr = (uint16_t)strtol(argv[1], NULL, 0); // Hex or decimal uint8_t data = (uint8_t)strtol(argv[2], NULL, 0); uart_printf("[EEPROM] Writing to Address: 0x%04X with Data: 0x%02X...\r\n", mem_addr, data); if (EEPROM_write(I2CB_BASE, mem_addr, data, EEPROM_I2C_ADDR) == 0) { uart_printf("[Success] EEPROM Write: Addr = 0x%04X, Data = 0x%02X\r\n", mem_addr, data); return 0; } else { uart_printf("[Failure] EEPROM Write Failed at Addr = 0x%04X\r\n", mem_addr); return -1; } } /** * @brief CLI command to read a byte from EEPROM * @param argc Number of arguments * @param argv Argument list: [mem_addr] * @return 0 on success, -1 on failure */ int cli_read_eeprom(int argc, char **argv) { if (argc < 2) { uart_printf("[Error] Usage: read-eeprom <mem_addr>\r\n"); return -1; } uint16_t mem_addr = (uint16_t)strtol(argv[1], NULL, 0); // Hex or decimal uint8_t data = 0; uart_printf("[EEPROM] Reading from Address: 0x%04X...\r\n", mem_addr); if (EEPROM_read(I2CB_BASE, mem_addr, &data, EEPROM_I2C_ADDR) == 0) { uart_printf("[Success] EEPROM Read: Addr = 0x%04X, Data = 0x%02X\r\n", mem_addr, data); return 0; } else { uart_printf("[Failure] EEPROM Read Failed at Addr = 0x%04X\r\n", mem_addr); return -1; } } int EEPROM_write(uint32_t base, uint16_t mem_addr, uint8_t data, uint8_t i2c_addr) { uint8_t buf[3]; buf[0] = (mem_addr >> 8) & 0xFF; buf[1] = mem_addr & 0xFF; buf[2] = data; uart_printf("[EEPROM] Writing data...\r\n ? I2C Address: 0x%02X\r\n ? Memory Address: 0x%04X\r\n ? Data: 0x%02X\r\n", i2c_addr, mem_addr, data); return i2c_write(base, i2c_addr, buf, 3); } int EEPROM_read(uint32_t base, uint16_t mem_addr, uint8_t *data, uint8_t i2c_addr) { uint8_t addr_buf[2]; addr_buf[0] = (mem_addr >> 8) & 0xFF; addr_buf[1] = mem_addr & 0xFF; uart_printf("[EEPROM] Reading data...\r\n ? I2C Address: 0x%02X\r\n ? Memory Address: 0x%04X\r\n", i2c_addr, mem_addr); if (i2c_write(base, i2c_addr, addr_buf, 2) != 0) { uart_printf("[EEPROM] Failed to set memory address 0x%04X for read\r\n", mem_addr); return -1; } return i2c_read(base, i2c_addr, data, 1); }