GD32F103硬件IIC主机接收程序
时间: 2023-08-15 12:03:10 浏览: 308
以下是GD32F103硬件IIC主机接收程序的示例代码:
```c
#include "gd32f10x.h"
#define I2C0_SLAVE_ADDRESS7 0x82
void rcu_config(void);
void gpio_config(void);
void i2c_config(void);
void nvic_config(void);
int main(void)
{
uint8_t i2c_receive_data[10];
rcu_config();
gpio_config();
i2c_config();
nvic_config();
i2c_enable(I2C0);
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
while(1)
{
while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); // 等待总线空闲
i2c_ackpos_config(I2C0, I2C_ACKPOS_NEXT);
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
i2c_address_config(I2C0, I2C0_SLAVE_ADDRESS7, I2C_RECEIVER);
while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); // 等待地址发送完成
i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); // 等待接收到数据
for(uint8_t i=0; i<10; i++)
{
i2c_receive_data[i] = i2c_data_receive(I2C0);
while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); // 等待接收到数据
}
i2c_stop_on_bus(I2C0);
}
}
void rcu_config(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_I2C0);
}
void gpio_config(void)
{
gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
}
void i2c_config(void)
{
i2c_clock_config(I2C0, 100000, I2C_DTCY_2);
i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_I2CMODE_DISABLE, I2C_I2CMODE_DISABLE);
}
void nvic_config(void)
{
nvic_irq_enable(I2C0_EV_IRQn, 0, 0);
nvic_irq_enable(I2C0_ER_IRQn, 0, 0);
}
```
此示例代码中使用的是I2C0接口,所以在rcu_config()和gpio_config()函数中打开了GPIOB和I2C0的时钟。在i2c_config()函数中配置了I2C0的时钟频率为100kHz,并设置了I2C的地址模式。
在主循环中,首先等待I2C总线空闲,然后发送从机地址,并等待地址发送完成。接着,等待接收到数据,并将接收到的数据存储在i2c_receive_data数组中。最后,产生停止条件。
需要注意的是,在接收数据的过程中,需要不断等待接收数据的标志位(I2C_FLAG_RBNE)被置位。如果没有及时等到数据,可能是因为从机没有准备好数据,或者数据线上存在干扰。
此外,还需要在nvic_config()函数中开启I2C0的中断。当接收到数据时,会产生I2C0_EV_IRQn中断。当出现错误时,会产生I2C0_ER_IRQn中断。可以在中断处理函数中进行相关处理,例如清除标志位、产生停止条件等。
阅读全文