gd32f103读写eeprom程序
时间: 2023-05-12 12:00:35 浏览: 207
GD32F103是一款32位微控制器芯片,它具有EEPROM存储器的读写功能。EEPROM是一种电可擦可编程只读存储器,它的数据可以在不使用电脑的情况下,保存在内部电路中。
首先,需要在GD32F103中配置I2C总线和EEPROM的物理接口。然后,可以使用GD32F103提供的库来实现EEPROM数据的读写。下面是一个简单的例子,说明如何在GD32F103上读写EEPROM数据。
1. 导入I2C库
#include "gd32f10x_i2c.h"
2. 定义EEPROM物理地址和数据缓冲区
#define EEPROM_ADDRESS 0xA0
uint8_t eeprom_data[10] = {0};
3. 初始化I2C总线和EEPROM
void I2C_EEPROM_Init(void)
{
/* Enable I2C clock */
rcu_periph_clock_enable(RCU_I2C0);
/* Configure I2C peripheral */
i2c_clock_config(I2C0, 400000, I2C_DTCY_2);
i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, EEPROM_ADDRESS<<1);
i2c_enable(I2C0);
}
4. 写入EEPROM数据
void I2C_EEPROM_Write(uint16_t addr, uint8_t* data, uint8_t len)
{
uint8_t i;
/* Ensure EEPROM is not busy */
while(i2c_flag_get(I2C0, I2C_STAT1_EEPROMBUSY));
i2c_start_on_bus(I2C0);
i2c_flag_clear(I2C0, I2C_STAT0_SBSEND);
/* Send EEPROM device address and write command */
i2c_master_addressing(I2C0, EEPROM_ADDRESS, I2C_TRANSMITTER);
while(!i2c_flag_get(I2C0, I2C_STAT0_ADDSEND));
/* Send EEPROM data address */
i2c_master_data_send(I2C0, addr >> 8);
while(!i2c_flag_get(I2C0, I2C_STAT0_TBE));
i2c_master_data_send(I2C0, addr & 0xFF);
while(!i2c_flag_get(I2C0, I2C_STAT0_TBE));
/* Send EEPROM data */
for(i=0; i<len; i++)
{
i2c_master_data_send(I2C0, *data++);
while(!i2c_flag_get(I2C0, I2C_STAT0_TBE));
}
/* Generate a stop condition */
i2c_stop_on_bus(I2C0);
}
5. 读取EEPROM数据
void I2C_EEPROM_Read(uint16_t addr, uint8_t* data, uint8_t len)
{
uint8_t i;
/* Ensure EEPROM is not busy */
while(i2c_flag_get(I2C0, I2C_STAT1_EEPROMBUSY));
i2c_start_on_bus(I2C0);
i2c_flag_clear(I2C0, I2C_STAT0_SBSEND);
/* Send EEPROM device address and write command */
i2c_master_addressing(I2C0, EEPROM_ADDRESS, I2C_TRANSMITTER);
while(!i2c_flag_get(I2C0, I2C_STAT0_ADDSEND));
/* Send EEPROM data address */
i2c_master_data_send(I2C0, addr >> 8);
while(!i2c_flag_get(I2C0, I2C_STAT0_TBE));
i2c_master_data_send(I2C0, addr & 0xFF);
while(!i2c_flag_get(I2C0, I2C_STAT0_TBE));
/* Generate a start condition */
i2c_start_on_bus(I2C0);
i2c_flag_clear(I2C0, I2C_STAT0_SBSEND);
/* Send EEPROM device address and read command */
i2c_master_addressing(I2C0, EEPROM_ADDRESS, I2C_RECEIVER);
while(!i2c_flag_get(I2C0, I2C_STAT0_ADDSEND));
/* Receive EEPROM data */
for(i=0; i<len; i++)
{
/* Disable ACK for last byte */
if(i == (len-1))
{
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
}
while(!i2c_flag_get(I2C0, I2C_STAT0_RBNE));
*data++ = i2c_master_data_receive(I2C0);
}
/* Enable ACK for next transaction */
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
/* Generate a stop condition */
i2c_stop_on_bus(I2C0);
}
通过以上所述的程序,我们就可以在GD32F103上实现EEPROM数据的读写。这样可以使得GD32F103更加灵活地控制外围设备,并且让我们更加方便地设计基于GD32F103的应用。