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 Part Number - 24LC256

Part Number: TMS320F28P650DK

Tool/software:

Hi All,

I am currently using the TMS320F28P65DK9 and connecting to an EEPROM (24LC256) through I2C. I am facing an issue with writing and reading data.

I have attached the  .c file for your reference.

I have configured the slave address as 0x50.

Write Sequence:

  • START

  • [0xA0] → EEPROM 7-bit address (0x50) << 1 + Write bit (0) = 0xA0

  • [0x00] → High byte of ControlAddr (0x0000 >> 8)

  • [0x00] → Low byte of ControlAddr (0x0000 & 0xFF)

  • [0x46] → Data byte (value 70)

  • STOP

Read Sequence:

  • START

  • [0xA0] → Write mode

  • [0x00]

  • [0x00]

  • REPEATED START

  • [0xA1] → Read mode

  • READ BYTE

  • STOP

    Some time the above is working fine.But some time it is fails.
    Please guide me to resolve the above issue and tell me where I made the mistake.

    #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);
    }
    
    
    

  • Hi Saravanan,

    Some time the above is working fine.But some time it is fails.

    Can you clarify the problem statement? What do you mean it fails? Are you saying that there is no activity on the data line, the packet is incorrect, data line is stuck, etc? This is not clear

    Do you have access to logic analyzer to probe the I2C lines? That will help to visualize the activity on the line which is needed to know

    Regards,

    Peter