GD32的硬件I2C调试记录

在测试GD32F450的硬件I2C时,碰到了I2C_FLAG_ADDSEND标志会自动清零的情况,导致一直开在while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));语句等待I2C_FLAG_ADDSEND标志位置位。

数据手册关于主机模式I2C_FLAG_ADDSEND相关内容描述如下,只在读取I2C_STAT0和I2C_STAT1时会自动清除该标志
在这里插入图片描述

查询相关资料,也发现大家有存在类似问题:
https://www.amobbs.com/thread-5564156-1-1.html

最终经过反复测试,确定,I2C的I2C_FLAG_ADDSEND在单步调试时,会被提前自动清零(也可能是jlink调试的时序问题),导致执行while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));时,I2C_FLAG_ADDSEND已经被自动清零了,则卡死。

将断点打在while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));语句之后,则无该问题。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!以下是一个简单的GD32硬件I2C的代码示例: ```c #include "gd32f10x.h" #include <stdio.h> #define I2C0_SLAVE_ADDRESS7 0x82 void i2c_config(void) { /* Enable I2C0 clock */ rcu_periph_clock_enable(RCU_I2C0); /* I2C0 GPIO ports */ gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_6 | GPIO_PIN_7); /* I2C0 parameter configuration */ i2c_clock_config(I2C0, 100000, I2C_DTCY_2); i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); i2c_ack_config(I2C0, I2C_ACK_ENABLE); i2c_enable(I2C0); } void i2c_write_data(uint8_t data) { /* Wait until I2C bus is idle */ while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); /* Send the byte to be written */ i2c_data_transmit(I2C0, data); /* Wait until the transmission finishes */ while(!i2c_flag_get(I2C0, I2C_FLAG_I2CTC)); /* Clear the transmission flag */ i2c_flag_clear(I2C0, I2C_FLAG_I2CTC); } uint8_t i2c_read_data(void) { uint8_t data; /* Wait until the I2C bus is idle */ while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); /* Enable I2C0 acknowledge */ i2c_ack_config(I2C0, I2C_ACK_ENABLE); /* Enable I2C0 receive data */ i2c_receive_config(I2C0, I2C_RECEIVE_ENABLE); /* Wait until the byte is received */ while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); /* Read the received data */ data = i2c_data_receive(I2C0); /* Clear the receive flag */ i2c_flag_clear(I2C0, I2C_FLAG_RBNE); return data; } int main(void) { /* Configure I2C0 */ i2c_config(); /* Write data to the slave device */ i2c_write_data(0xAA); /* Read data from the slave device */ uint8_t data = i2c_read_data(); /* Print the received data */ printf("Received data: 0x%02X\n", data); while(1); } ``` 这段代码使用了GD32库函数来配置和操作GD32I2C接口。它包括了初始化I2C接口、向从设备写入数据、从从设备读取数据,并通过串口打印接收到的数据。请注意,这只是一个简单的示例,实际使用中可能需要根据具体的硬件和应用进行适当的修改和调整。 希望对你有帮助!如有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值