STM32之I2C_EEPROM读写

本文详细介绍了如何使用STM32通过I2C接口进行EEPROM的读写操作,包括数据的分页处理、页写入时序及事件检测。在写入时,首先对缓冲区进行分页处理,然后调用I2C_EE_PageWrite函数进行数据传输,并在每次写入后等待EEPROM进入待机状态。读取过程涉及到两次起始信号的发送,确保通讯正常进行。
摘要由CSDN通过智能技术生成

EEPROM的数据组织形式:
EEPROM设备把它的存储矩阵进行了分页处理:
这里写图片描述

型号是AT24C02的EEPROM分为32页,每一页可以存储8个字节的数据,若在同一页写入超过8字节,则超过的部分会被写在该页的起始地址(也就是一开始写好的部分会被覆盖).
为了把连续的缓冲区数组按页写入到 EEPROM ,就需要对缓冲区进行分页处理.I2C_EE_BufferWrite()是根据输入的缓冲区大小参数 NumByteToWrite,计算出需要写入多少页,计算写入位置。
分页处理好之后,调用 I2C_EE_PageWrite(),这个函数是与 EEPROM进行I2C通讯的最底层函数(里面都是调用STM32库函数)

EEPROM写入 I2C_EE_BufferWrite();
u8 I2c_Buf_Write[256];
//#define EEP_Firstpage 0x00(加个//免得字体放大)

void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
{
u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;

/*计算出要写的页数和分页*/
Addr = WriteAddr % I2C_PageSize; 
count = I2C_PageSize - Addr;
NumOfPage = NumByteToWrite / I2C_PageSize; 

if(Addr == 0)
{
    if(NumOfPage == 0)
    {
        I2C_EE_PageWrite(pBuffer,WriteAddr,NumOfSingle);
        I2C_EE_WaitEepromStandbyState(); //检测是否为Standby状态,才可以进行下一步操作
    }
    else
    {
        while(NumOfPage--)
        {
            I2C_EE_PageWrite(pBuffer,WriteAddr,I2C_PageSize);
            I2C_EE_WaitEepromStandbyState();
            WriteAddr += I2C_PageSize;
            pBuffer += I2C_PageSize;
        }

        if(NumOfSingle!=0)
        {
            I2C_EE_PageWrite(pBuffer,WriteAddr,NumOfSingle);
            I2C_EE_WaitEepromStandbyState();
        }
    }
}

else
{
  
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用STM32的HAL库来实现I2C读写EEPROM。首先,确保已经正确配置了I2C外设和相关引脚。然后,按照以下步骤进行操作: 1. 初始化I2C外设:使用`HAL_I2C_Init()`函数初始化I2C外设。 2. 配置EEPROM地址:在发送I2C读写请求之前,需要设置EEPROM的地址。这可以通过向I2C外设发送一个写入EEPROM地址的I2C Start信号,然后发送EEPROM地址字节来实现。 3. 发送数据:如果要向EEPROM写入数据,可以使用`HAL_I2C_Master_Transmit()`函数发送数据。如果要从EEPROM读取数据,可以使用`HAL_I2C_Master_Receive()`函数接收数据。 下面是一个示例代码,演示如何使用HAL库进行I2C读写EEPROM: ```c #include "stm32xxxx.h" // 根据具体的芯片型号选择头文件 #define EEPROM_ADDRESS 0xA0 // EEPROM的I2C地址 // 初始化I2C外设 void I2C_Init(void) { // I2C外设初始化代码 // ... } // 向EEPROM写入数据 void EEPROM_Write(uint16_t address, uint8_t* data, uint16_t size) { // 发送I2C Start信号和EEPROM地址 HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS, (uint8_t*)&address, 2, HAL_MAX_DELAY); // 发送数据到EEPROM HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS, data, size, HAL_MAX_DELAY); } // 从EEPROM读取数据 void EEPROM_Read(uint16_t address, uint8_t* data, uint16_t size) { // 发送I2C Start信号和EEPROM地址 HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDRESS, (uint8_t*)&address, 2, HAL_MAX_DELAY); // 从EEPROM接收数据 HAL_I2C_Master_Receive(&hi2c1, EEPROM_ADDRESS, data, size, HAL_MAX_DELAY); } ``` 请注意,上述代码中的`hi2c1`是I2C外设的句柄,具体根据你的芯片型号和使用的外设进行修改。此外,还需要根据EEPROM的具体规格和通信协议进行相应的配置。 希望以上信息对你有所帮助!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值