野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 222|回复: 0

I2C读写EEPROM 写入多个字节的另一种实现方法

[复制链接]
发表于 2024-2-9 12:17:21 | 显示全部楼层 |阅读模式
已在STM32F103ZET6核心板上测试,其中调用的函数和宏与例程相同,与原多字节写入函数I2C_EE_BufferWrite()相比,省去了对齐计算

uint32_t I2C_EE_BufferWrite2(u8* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite)
{
        uint16_t i;
       
        for(i = 0; i < NumByteToWrite; i++, WriteAddr++)
        {
                if(i == 0 || WriteAddr % 8 == 0)//开始时或每页开始时产生起始信号、发送设备地址、写入地址
                {
                        I2CTimeout = I2CT_LONG_TIMEOUT;
                        while(I2C_GetFlagStatus(EEPROM_I2Cx, I2C_FLAG_BUSY))
                                if((I2CTimeout--) == 0)
                                        return I2C_TIMEOUT_UserCallback(4);
                       
                        I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
                        I2CTimeout = I2CT_FLAG_TIMEOUT;
                        while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
                                if((I2CTimeout--) == 0)
                                        return I2C_TIMEOUT_UserCallback(5);
                               
                        I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);       
                        I2CTimeout = I2CT_FLAG_TIMEOUT;
                        while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
                                if((I2CTimeout--) == 0)
                                {
                                        return I2C_TIMEOUT_UserCallback(6);
                                }
                               
                        I2C_SendData(EEPROM_I2Cx, WriteAddr);
                        I2CTimeout = I2CT_FLAG_TIMEOUT;
                        while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
                                if((I2CTimeout--) == 0)
                                        return I2C_TIMEOUT_UserCallback(7);
                }
               
                I2C_SendData(EEPROM_I2Cx, pBuffer[i]);
                I2CTimeout = I2CT_FLAG_TIMEOUT;
                while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
                        if((I2CTimeout--) == 0)
                                return I2C_TIMEOUT_UserCallback(8);
                       
                if(i == NumByteToWrite - 1 || (WriteAddr + 1) % 8 == 0)//结束时或每页结束时产生停止信号、等待响应
                {
                        I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
                       
                        I2C_EE_WaitEepromStandbyState();//页写入后必须等待响应
                }
        }
                       
        return 1;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-28 06:35 , Processed in 0.151473 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表