GD32E230K8U6 I2C外设代码移植到GD32E230C8T6
对于GD32E230K8U6和GD32E230C8T6这两种芯片,它们的I2C外设是相同的,因此移植I2C外设代码的过程相对简单。
以下是GD32E230K8U6的I2C外设代码示例:
/* I2C1初始化函数 */
void i2c1_init(void)
{
rcu_periph_clock_enable(RCU_I2C1);
rcu_periph_clock_enable(RCU_GPIOB);
gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_6 | GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_AF_OD, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
i2c_clock_config(I2C1, 100000, I2C_DTCY_2);
i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, ADDRESS);
i2c_ack_config(I2C1, I2C_ACK_ENABLE);
i2c_interrupt_enable(I2C1, I2C_INT_ERR);
i2c_enable(I2C1);
}
/* I2C1读取数据函数 */
uint8_t i2c1_read(uint8_t addr, uint8_t reg)
{
uint8_t data = 0;
i2c_start_on_bus(I2C1);
while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));
i2c_master_addressing(I2C1, addr, I2C_TRANSMITTER);
while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
i2c_send_data(I2C1, reg);
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
i2c_start_on_bus(I2C1);
while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));
i2c_master_addressing(I2C1, addr, I2C_RECEIVER);
while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
i2c_ack_config(I2C1, I2C_ACK_DISABLE);
i2c_stop_on_bus(I2C1);
while(!i2c_flag_get(I2C1, I2C_FLAG_RBNE));
data = i2c_receive_data(I2C1);
return data;
}
/* I2C1写入数据函数 */
void i2c1_write(uint8_t addr, uint8_t reg, uint8_t data)
{
i2c_start_on_bus(I2C1);
while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));
i2c_master_addressing(I2C1, addr, I2C_TRANSMITTER);
while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
i2c_send_data(I2C1, reg);
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
i2c_send_data(I2C1, data);
while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
i2c_stop_on_bus(I2C1);
}
如果要将这段代码移植到GD32E230C8T6上,只需要修改以下两个部分:
- 修改引脚配置
GD32E230K8U6和GD32E230C8T6的I2C引脚定义不同,需要修改gpio_af_set和gpio_mode_set函数中的引脚定义,例如:
gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_10 | GPIO_PIN_11);
gpio_mode_set(GPIOB, GPIO_MODE_AF_OD, GPIO_PUPD_NONE, GPIO_PIN_10 | GPIO_PIN_11);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11);
- 修改RCU时钟使能
GD32E230K8U6和GD32E230C8T6的RCU时钟使能宏定义不同,需要修改rcu_periph_clock_enable宏定义,例如:
rcu_periph_clock_enable(RCU_I2C0);
rcu_periph_clock_enable(RCU_GPIOB);
修改完以上两个部分后,将代码移植到GD32E230C8T6上即可。
原文地址: https://www.cveoy.top/t/topic/nhCx 著作权归作者所有。请勿转载和采集!