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.

[参考译文] TMS320F28P650DK:EEPROM 器件型号 — 24LC256

Guru**** 2442090 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1527414/tms320f28p650dk-eeprom-part-number---24lc256

器件型号: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);
    }
    
    
    

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

    尊敬的 Saravanan:

    某些时间上述操作正常、但某些时间失败。

    您能否澄清问题陈述? “你说什么? 您是否说数据线上没有活动、数据包不正确、数据线卡住等? 这是不清楚的

    您是否可以访问逻辑分析仪来探测 I2C 线路? 这将有助于可视化线路上需要了解的活动

    此致、

    彼得