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 ofControlAddr(0x0000 >> 8) -
[0x00]→ Low byte ofControlAddr(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); }