编写使用恩智浦的i.MX RT系列单片机进行读写EEPROM的代码
时间: 2023-06-17 14:03:37 浏览: 56
以下是一个使用i.MX RT系列单片机进行读写EEPROM的示例代码:
```c
#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "fsl_lpi2c.h"
#define I2C_MASTER_BASEADDR LPI2C1
#define I2C_MASTER_CLOCK_FREQUENCY CLOCK_GetIpFreq(kCLOCK_Lpi2c1)
#define EEPROM_I2C_ADDR 0x50 // EEPROM的I2C地址
#define EEPROM_PAGE_SIZE 64 // EEPROM页面大小
/* 初始化LPI2C */
void i2c_init(void)
{
lpi2c_master_config_t masterConfig;
uint32_t sourceClock;
/* 初始化LPI2C */
LPI2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Hz = 100000; // 设置I2C总线速率为100kHz
masterConfig.enableMaster = true;
sourceClock = I2C_MASTER_CLOCK_FREQUENCY;
LPI2C_MasterInit(I2C_MASTER_BASEADDR, &masterConfig, sourceClock);
}
/* 写入EEPROM */
status_t eeprom_write(uint16_t addr, uint8_t *data, uint32_t len)
{
uint8_t txData[EEPROM_PAGE_SIZE + 2];
uint8_t pageOffset;
status_t status;
/* 分页写入数据 */
while (len > 0)
{
pageOffset = addr % EEPROM_PAGE_SIZE;
txData[0] = (addr >> 8) & 0xFF; // MSB地址
txData[1] = addr & 0xFF; // LSB地址
/* 如果当前数据跨越了页面边界,则需要分为两次写入 */
if ((pageOffset + len) > EEPROM_PAGE_SIZE)
{
memcpy(&txData[2], data, EEPROM_PAGE_SIZE - pageOffset);
len -= (EEPROM_PAGE_SIZE - pageOffset);
data += (EEPROM_PAGE_SIZE - pageOffset);
}
else
{
memcpy(&txData[2], data, len);
len = 0;
}
/* 发送写入命令及数据 */
lpi2c_master_transfer_t masterXfer;
masterXfer.slaveAddress = EEPROM_I2C_ADDR;
masterXfer.direction = kLPI2C_Write;
masterXfer.subaddress = txData;
masterXfer.subaddressSize = 2;
masterXfer.subaddressSize = 2 + (len > EEPROM_PAGE_SIZE ? EEPROM_PAGE_SIZE : len);
masterXfer.flags = kLPI2C_TransferDefaultFlag;
status = LPI2C_MasterTransferBlocking(I2C_MASTER_BASEADDR, &masterXfer);
if (status != kStatus_Success)
{
return status;
}
/* 等待EEPROM内部写操作完成 */
while (LPI2C_MasterGetStatusFlags(I2C_MASTER_BASEADDR) & kLPI2C_MasterTransmitActiveFlag)
{
}
addr += (EEPROM_PAGE_SIZE - pageOffset);
}
return kStatus_Success;
}
/* 读取EEPROM */
status_t eeprom_read(uint16_t addr, uint8_t *data, uint32_t len)
{
uint8_t txData[2];
status_t status;
/* 发送读取命令 */
txData[0] = (addr >> 8) & 0xFF; // MSB地址
txData[1] = addr & 0xFF; // LSB地址
lpi2c_master_transfer_t masterXfer;
masterXfer.slaveAddress = EEPROM_I2C_ADDR;
masterXfer.direction = kLPI2C_Write;
masterXfer.subaddress = txData;
masterXfer.subaddressSize = 2;
masterXfer.data = data;
masterXfer.dataSize = len;
masterXfer.flags = kLPI2C_TransferDefaultFlag;
status = LPI2C_MasterTransferBlocking(I2C_MASTER_BASEADDR, &masterXfer);
if (status != kStatus_Success)
{
return status;
}
/* 等待EEPROM内部读操作完成 */
while (LPI2C_MasterGetStatusFlags(I2C_MASTER_BASEADDR) & kLPI2C_MasterTransmitActiveFlag)
{
}
return kStatus_Success;
}
```
使用时,先要调用 `i2c_init()` 函数初始化LPI2C,然后就可以使用 `eeprom_write()` 和 `eeprom_read()` 函数进行EEPROM的读写操作。请注意,由于EEPROM是一种串行存储器,因此必须按照其规定的页大小进行写入操作,否则可能会导致数据丢失。