GD32F103硬件IIC主机写一个字节给从机
时间: 2023-12-30 22:04:09 浏览: 29
好的,以下是基于GD32F103的硬件IIC主机写一个字节给从机的示例代码:
```c
#include "gd32f10x.h"
/* IIC GPIO定义 */
#define IIC_SCL_PIN GPIO_PIN_6
#define IIC_SDA_PIN GPIO_PIN_7
#define IIC_GPIO_GROUP GPIOB
/* IIC地址 */
#define IIC_SLAVE_ADDRESS 0x2A
/* IIC时钟频率 */
#define IIC_CLOCK_FREQ 100000
/* IIC读写方向 */
#define IIC_DIRECTION_WR 0
#define IIC_DIRECTION_RD 1
/* IIC总线应答状态 */
typedef enum {
IIC_ACK = 0,
IIC_NACK = 1
} iic_ack_e;
/* IIC总线状态 */
typedef enum {
IIC_READY = 0,
IIC_BUSY = 1
} iic_status_e;
/* IIC初始化 */
void iic_init(void)
{
/* 使能GPIO时钟 */
rcu_periph_clock_enable(RCU_GPIOB);
/* 配置SCL和SDA为开漏输出 */
gpio_init(IIC_GPIO_GROUP, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, IIC_SCL_PIN | IIC_SDA_PIN);
/* 设置IIC时钟频率 */
i2c_clock_config(I2C0, IIC_CLOCK_FREQ, I2C_DTCY_2);
/* 使能IIC接口 */
i2c_enable(I2C0);
}
/* 等待IIC总线空闲 */
static void iic_wait(void)
{
while(i2c_flag_get(I2C0,I2C_FLAG_I2CBSY)==SET);
}
/* IIC发送一个字节 */
static iic_ack_e iic_send_byte(uint8_t data)
{
/* 发送数据 */
i2c_data_transmit(I2C0, data);
/* 等待数据发送完成 */
while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
/* 检查是否收到从机的应答信号 */
if(i2c_flag_get(I2C0, I2C_FLAG_I2CERR) == SET) {
return IIC_NACK;
} else {
return IIC_ACK;
}
}
/* 向从机写入一个字节 */
void iic_write_byte(uint8_t data)
{
/* 等待IIC总线空闲 */
iic_wait();
/* 发送起始信号 */
i2c_start_on_bus(I2C0);
/* 等待起始信号发送完成 */
while(!i2c_flag_get(I2C0, I2C_FLAG_SB));
/* 发送从机地址和读写方向 */
i2c_master_addressing(I2C0, IIC_SLAVE_ADDRESS, IIC_DIRECTION_WR);
/* 等待从机地址发送完成 */
while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
/* 发送数据 */
iic_send_byte(data);
/* 发送停止信号 */
i2c_stop_on_bus(I2C0);
}
```
在上述代码中,`iic_init`函数用于初始化IIC接口,`iic_write_byte`函数用于向从机写入一个字节。其中,`iic_send_byte`函数用于发送一个字节,其返回值为从机的应答状态。
使用时,只需要调用`iic_init`函数初始化IIC接口,然后调用`iic_write_byte`函数即可向从机写入一个字节。例如:
```c
iic_init(); // 初始化IIC接口
iic_write_byte(0x01); // 向从机写入0x01
```
需要注意的是,上述代码仅供参考,具体实现方式可能因硬件平台不同而有所不同。