GD32F103硬件IIC主机接收到从机发送过来的一个字节数据
时间: 2023-08-04 10:02:39 浏览: 120
STM32F103硬件I2C主机收发数据,亲测可用
在GD32F103上,硬件IIC主机接收从机发送过来的一个字节数据的步骤如下:
1. 等待接收数据完成。在主机发送完读请求并等待从机回复后,主机会向从机发送一个时钟信号,以便从机开始发送数据。主机需要等待从机发送完数据并释放SDA线路上的总线控制权,然后才能开始接收数据。
2. 读取接收数据。主机通过读取I2C数据寄存器中的数据来获取从机发送过来的字节。
3. 发送应答信号。如果主机希望继续接收数据,它需要向从机发送一个应答信号。否则,主机可以发送一个非应答信号,告诉从机它不再需要接收数据。
下面是一个简单的代码示例,演示如何在GD32F103上使用硬件IIC主机接收从机发送过来的一个字节数据:
```c
#include "gd32f10x.h"
#define I2C0_SLAVE_ADDRESS7 0x82
#define I2C0_OWN_ADDRESS7 0x72
/* 初始化I2C0 */
void i2c_init(void)
{
/* 使能I2C0时钟和复位I2C0 */
rcu_periph_reset_enable(RCU_I2C0RST);
rcu_periph_reset_disable(RCU_I2C0RST);
rcu_periph_clock_enable(RCU_I2C0);
/* 配置I2C0时钟 */
i2c_clock_config(I2C0, 100000, I2C_DTCY_2);
/* 配置I2C0的工作模式和地址 */
i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_I2CMODE_ADDR_7BIT);
i2c_own_address7_config(I2C0, I2C0_OWN_ADDRESS7);
/* 使能I2C0 */
i2c_enable(I2C0);
}
/* 从I2C0接收一个字节 */
uint8_t i2c_receive_byte(I2C_TypeDef* I2Cx)
{
uint32_t timeout = 0;
while(!i2c_flag_get(I2Cx, I2C_FLAG_I2CEN));
while(!i2c_flag_get(I2Cx, I2C_FLAG_RBNE))
{
timeout++;
if(timeout > 1000000) return 0xFF; /* 超时退出 */
}
return i2c_data_receive(I2Cx);
}
/* 主函数 */
int main(void)
{
uint8_t data;
i2c_init();
/* 发送读请求 */
i2c_start_on_bus(I2C0, I2C0_SLAVE_ADDRESS7, I2C_TRANSMITTER);
while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
i2c_data_transmit(I2C0, 0x00);
while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
i2c_stop_on_bus(I2C0);
/* 接收数据 */
i2c_start_on_bus(I2C0, I2C0_SLAVE_ADDRESS7, I2C_RECEIVER);
while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
data = i2c_receive_byte(I2C0);
i2c_stop_on_bus(I2C0);
/* 打印接收到的数据 */
printf("Received data: 0x%x\n", data);
while(1);
return 0;
}
```
注意,在代码中需要根据实际情况修改从机地址和发送的读请求数据等参数。同时,为了方便调试,可以使用printf函数将接收到的数据打印出来。
阅读全文