GD32硬件I2C的热插拔功能实现

        I2C通信是我们在工作中会经常使用到的一种低速通信协议,实现方式上可以分为软件I2C和硬件I2C两类。其中软件I2C通过拉高和拉低IO口来模拟SCL及SDA的时序,速率较低,但基本所有单片机都可以使用;硬件I2C的速率更高,通过配置几个寄存器即可,使用较为简单,但不是所有的单片机都支持。

        使用I2C时一般情况下,单片机会与I2C设备在同一块单板上,但也有通过连接线连接的情况,通过连接线连接时,难免会出现连接线连接不牢固或者断开的情况,发生这种情况时,一方面我们需要保证程序不受设备断开的影响,其他功能可以正常运行;另一方面,我们希望如果把设备重新连接好后可以恢复正常运行。这种需求若在使用软件I2C时很容易实现,但在使用硬件I2C时,由于在发生断连的情况时,会某寄存器的个别只读位置位,如GD32,在硬件I2C异常时,会有一个只读的错误位被置位,导致SCL和SDA被强制拉低,拉低后无法通过设置IO电平置位,因此在使用时需要先将I2C去使能等操作使那个只读错误位复位,然后通过写IO的方式拉高SCL和SDA,最后重新配置I2C寄存器即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值