资讯详情

GD32F450用I2C读写EEPROM代码移植

这里写自定义目录标题

  • 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;
}

多字节写入和页写入都是同样的逻辑

标签: 220f450v5a三极管f450光电开关传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台