这里写自定义目录标题
- GD32F450用I2C读写EEPROM代码移植
-
- 单字节写入
- 多字节写入和页面写入逻辑相同
GD32F450用I2C读写EEPROM代码移植
最近在学习GD32F450芯片的一些基本驱动功能。本文基于《STM基于野火挑战者开发板的32库开发实战指南《GD32F4xx_User_Manual_CN_V2.2》,以及【GD32F4xx_Demo_Suites_V2.3.0码移植等相关资料,网上有相关资料。
单字节写入
/** * @brief write one byte data to I2C EEPROM * @param pBuffer: pointer of buffer * @param WriteAddr: addr of EEPROM to be written * @retval success return 1, failure return 0 */ uint8_t I2C_EE_ByteWrite(uint8_t* pBuffer, uint8_t WriteAddr) {
I2CTimeout = I2CT_FLAG_TIMEOUT; /* wait until I2C bus is idle */ while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY)) {
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0); } /* send a start condition to I2C bus */ i2c_start_on_bus(I2C1); I2CTimeout = I2CT_FLAG_TIMEOUT; /* wait until SBSEND bit is set */ while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND)) {
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0); } /* send slave(EEPROM) address to I2C bus */ i2c_master_addressing(I2C1, EEPROM_ADDRESS_WRITE, I2C_TRANSMITTER); I2CTimeout = I2CT_FLAG_TIMEOUT; /* wait until ADDSEND bit is set */ while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND))
{
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0);
}
/* clear ADDSEND bit */
i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* wait until the transmit data buffer is empty */
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE))
{
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0);
}
/* WriteAddr transmission */
i2c_data_transmit(I2C1, WriteAddr);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* wait until the TBE bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE))
{
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0);
}
/* data transmission */
i2c_data_transmit(I2C1, *pBuffer);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* wait until the TBE bit is set */
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE))
{
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0);
}
/* send a stop condition to I2C bus */
i2c_stop_on_bus(I2C1);
while(I2C_CTL0(I2C1)&0x0200);
return 1;
}