【学习记录】GD32 IIC读写BL24C256A 256Kbits(EEPROM)

文章详细描述了如何使用GD32F303CG微控制器通过I2C接口与BL24C256AEEPROM进行通信,包括起始信号、从机地址发送、数据读写以及停止信号的生成。提供了单字节和随机读写的函数实现,强调了在长字节操作中需注意页限制的问题。

主控平台使用gd32f303cg,eeprom使用BL24C256A 大小32kb
使用iic主要有以下的几种信号
起始信号:

//在iic总线上发送起始位
uint8_t iic_start(void){
   
   
    uint16_t timeout=0;
		while(i2c_flag_get(I2CX, I2C_FLAG_I2CBSY) && (timeout < I2C_TIME_OUT)) {
   
   
				timeout++;
		}
		if(timeout < I2C_TIME_OUT) {
   
   
				i2c_start_on_bus(I2CX);
				return 1;
		} else {
   
   
				return 0;
		}
}

在总线上发送从机设备地址:
这里trandirection参数表示读取还是写入,如果是读取在i2c_master_addressing函数内部会自动在最低位置1,如果是写入那么会自动将最低为清零

//在iic总线上发送从机地址并清除ADDSEND
uint8_t iic_slave_address(uint8_t addr,uint32_t trandirection){
   
   
	 uint16_t timeout=0;
	 while((!i2c_flag_get(I2CX, I2C_FLAG_SBSEND)) && (timeout < I2C_TIME_OUT)) {
   
   
       timeout++;
   }
		if(timeout < I2C_TIME_OUT) {
   
   
			i2c_master_addressing(I2CX,addr, trandirection);
			timeout=0;
			while((!i2c_flag_get(I2CX, I2C_FLAG_ADDSEND)) && (timeout < I2C_TIME_OUT)) {
   
   
					timeout++;
			}
			if(timeout < I2C_TIME_OUT) {
   
   
					i2c_flag_clear(I2CX, I2C_FLAG_ADDSEND);//根据要求清除ADDSEND位
        return 1;
			} else {
   
   
				return 0;
			}
		} else {
   
   
			return 0;
		}
}

读出iic总线上的数据:
根据gd32官方文档在读取最后一个字节之前要将ACKEN位清0,并将STOP位置1,以确保NACK发送给最后一个字节。

//查询TBE的方式写入数据,适用与前n-2个数据
uint8_t iic_datasendTBE(uint8_t iic_data){
   
   
	  uint16_t timeout=0;
		while((! i2c_flag_get(I2CX, I2C_FLAG_TBE)) && (timeout < I2C_TIME_OUT)) {
   
   
				timeout++;
		}
		if(timeout < I2C_TIME_OUT) {
   
   
				i2c_data_transmit(I2CX, iic_data);
			return 1;
		} else {
   
   
      return 0;
		}
}
//最后一位数据读取时调用
uint8_t iic_dataread_N_2(uint8_t* p_buffer){
   
   
	  uint16_t timeout=0;
		/* wait until BTC bit is set */
	//	while(!i2c_flag_get(I2CX, I2C_FLAG_BTC));
		/* disable acknowledge */
		i2c_ack_config(I2CX, I2C_ACK_DISABLE);

		/* wait until BTC bit is set */
	//	while(!i2c_flag_get(I2CX, I2C_FLAG_BTC));
		/* send a stop condition to I2C bus */
		i2c_stop_on_bus(I2CX);
		while(timeout<I2C_TIME_OUT) {
   
   
			timeout++;
						/* wait until RBNE bit is set */
			if(i2c_flag_get(I2CX, I2C_FLAG_RBNE)) {
   
   
					/* read a byte from the EEPROM */
					*p_buffer = i2c_data_receive(I2CX);
				  return 1;
					/* point to the next location where the byte read will be saved */
			}
		
		}

		return 0;
}

在总线上生成停止位

uint8_t iic_stop(void){
   
   
	  uint16_t timeout=0;
		while((!i2c_flag_get(I2CX, I2C_FLAG_BTC)) && (timeout < I2C_TIME_OUT)) {
   
   //等待最后一个字节发送完成,随后产生停止信号
				timeout++;
		}
		if(timeout < I2C_TIME_OUT) {
   
   
		 i2c_stop_on_bus(I2CX);
			timeout=0;
		  while((I2C_CTL0(I2CX) & I2C_CTL0_STOP) && (timeout < I2C_TIME_OUT)) {
   
   //等待停止信号发送完成
                timeout++;
            }
            if(timeout < I2C_TIME_OUT) {
   
   
              return 1;
           
            } else {
   
   
			  return 0;
            }
		} else {
   
   
			return 0;
	
		}
}

然后是读写的函数,这里给出单字节写入,单字节读取,随机不定长写入和随机不定长数据读取。最常用还是最后两个,单字节读取只能读取上一次写入的地址不能指定地址

//eepron单字节写入
uint8_t eeprom_writeonebyte(uint16_t addr
### 三级标题:硬件I2C接口读写EEPROM 24C256芯片的方法 在使用硬件I2C接口读写EEPROM 24C256芯片时,需要首先配置器件地址并初始化I2C通信。AT24C256的器件地址通常为0xA0(写)和0xA1(读),与AT24C02类似,但其存储容量更大,达到256 Kbit[^2]。 #### 初始化I2C通信 在STM32系列单片机中,可以使用STM32CubeMX工具配置I2C接口。初始化代码如下: ```c // 定义器件地址和缓冲区 #define ADDR_AT24C256_Write 0xA0 #define ADDR_AT24C256_Read 0xA1 uint8_t I2C_Buffer_Write[256]; uint8_t I2C_Buffer_Read[256]; uint16_t i; // 初始化I2C void init_i2c() { // STM32CubeMX生成的I2C初始化代码 } ``` #### 写入数据到EEPROM 向AT24C256写入数据时,需要注意页写入模式(PAGE WRITE),每次最多写入64字节,并且需要等待写入完成。以下是一个简单的写入函数示例: ```c HAL_StatusTypeDef write_to_eeprom(uint16_t address, uint8_t *data, uint16_t size) { return HAL_I2C_Mem_Write(&hi2c1, ADDR_AT24C256_Write, address, I2C_MEMADD_SIZE_16BIT, data, size, HAL_MAX_DELAY); } ``` #### 从EEPROM读取数据 从AT24C256读取数据时,可以选择随机读或顺序读模式。以下是一个顺序读取的示例函数: ```c HAL_StatusTypeDef read_from_eeprom(uint16_t address, uint8_t *data, uint16_t size) { return HAL_I2C_Mem_Read(&hi2c1, ADDR_AT24C256_Read, address, I2C_MEMADD_SIZE_16BIT, data, size, HAL_MAX_DELAY); } ``` #### 注意事项 - **地址管理**:AT24C256支持16位地址,因此在调用I2C读写函数时,需指定`I2C_MEMADD_SIZE_16BIT`。 - **写入延迟**:由于EEPROM写入操作需要一定时间,建议在每次写入后加入适当的延迟或轮询确认写入完成[^3]。 - **硬件兼容性**:确保使用的I2C接口支持400 kHz协议速度,以提高数据传输效率[^3]。 --- ### 三级标题:相关问题解答 如何配置树莓派Pico通过I2C接口驱动AT24C256? 树莓派Pico可以通过RP2040芯片的硬件I2C模块实现对AT24C256的驱动。具体步骤包括初始化I2C外设、定义器件地址以及编写读写函数。此外,还需参考已有的驱动示例进行调试[^2]。 Linux系统下如何实现I2C接口的EEPROM读写? 在Linux环境下,可以通过I2C子系统实现对AT24C256读写操作。首先,在设备树中添加EEPROM节点,然后通过`i2c-dev`接口进行访问。用户还可以使用`i2c-tools`提供的命令行工具进行调试[^5]。 如何在没有硬件I2C接口的情况下模拟I2C通信? 如果目标平台不支持硬件I2C,可以使用GPIO引脚模拟I2C时序。例如,在STM32F103RC上,可以通过软件延时和高低电平控制SCL和SDA信号,实现完整的I2C起始条件、停止条件、ACK/NACK应答等机制[^4]。 --- ### 三级标题:相关问题
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值