学习STM32有一段时间了
进度有点慢,到I2C通信这里的发现例有有个小BUG
问题会出现在:当写入地址不在页首地址,字节量小于一页,写入页剩余小于写入字节量时。
就是出现回到当前页起始地址写入的错误。
从例程序上作了一些修改,请大神看一下有没有不足之处
/**
* @brief 将缓冲区中的数据写到I2C EEPROM中
* @param
* @arg pBuffer:缓冲区指针
* @arg WriteAddr:写地址
* @arg NumByteToWrite:写的字节数
* @retval 无
*/
void I2C_EEPROM_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
{
u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
Addr = WriteAddr % I2C_PageSize; //判断写入地址与页起始地址距离
if(Addr != 0) //写入起始地址不在页起始位置
{
count = I2C_PageSize - Addr; //写入起始页最多还能写入字节数
}
if(NumByteToWrite > count) //如果写入数量大于起始页还能写入的数量,先把起始页写完(count != 0,等于0无所谓)
{
NumByteToWrite -= count; //减去起始页写入的字节数
}
else count = 0;
NumOfPage = NumByteToWrite / I2C_PageSize; //剩余要写入的整页数
NumOfSingle = NumByteToWrite % I2C_PageSize; //不足一页的写入数量
//写入不在页起始地址,写完当前页剩余能写的量
if(count != 0)
{
I2C_EEPROM_PageWrite(pBuffer, WriteAddr, count);
I2C_EEPROM_WaitEepromStandbyState();
WriteAddr += count;
pBuffer += count;
}
//写入一页
while(NumOfPage--)
{
I2C_EEPROM_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
I2C_EEPROM_WaitEepromStandbyState();
WriteAddr += I2C_PageSize;
pBuffer += I2C_PageSize;
}
//写入不足一页
if(NumOfSingle != 0)
{
I2C_EEPROM_PageWrite(pBuffer, WriteAddr, NumOfSingle);
I2C_EEPROM_WaitEepromStandbyState();
}
} |