gd的软件iic c语言实现
时间: 2023-11-12 12:35:48 浏览: 157
以下是使用GD32F1x0系列微控制器的软件I2C的C语言代码示例:
```c
#include "gd32f1x0.h"
#define I2C_SCL_PIN GPIO_PIN_6
#define I2C_SDA_PIN GPIO_PIN_7
#define I2C_GPIO GPIOB
#define I2C_ADDR 0xA0
void i2c_init(void)
{
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOB);
/* enable I2C clock */
rcu_periph_clock_enable(RCU_I2C0);
/* configure GPIO */
gpio_mode_set(I2C_GPIO, GPIO_MODE_AF_OD, GPIO_PUPD_NONE, I2C_SCL_PIN | I2C_SDA_PIN);
gpio_output_options_set(I2C_GPIO, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN | I2C_SDA_PIN);
gpio_af_set(I2C_GPIO, GPIO_AF_1, I2C_SCL_PIN | I2C_SDA_PIN);
/* configure I2C */
i2c_deinit(I2C0);
i2c_clock_config(I2C0, 400000, I2C_DTCY_2); // 400kHz clock
i2c_mode_config(I2C0, I2C_MODE_I2C);
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
i2c_own_address_config(I2C0, I2C_ADDR);
i2c_enable(I2C0);
}
void i2c_start(void)
{
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
i2c_start_on_bus(I2C0);
while(i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == RESET);
}
void i2c_stop(void)
{
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
i2c_stop_on_bus(I2C0);
while(i2c_flag_get(I2C0, I2C_FLAG_STPDET) == RESET);
}
void i2c_send_byte(uint8_t byte)
{
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
i2c_transmit_data(I2C0, byte);
while(i2c_flag_get(I2C0, I2C_FLAG_TBE) == RESET);
}
uint8_t i2c_read_byte(uint8_t ack)
{
if(ack)
i2c_ack_config(I2C0, I2C_ACK_ENABLE);
else
i2c_ack_config(I2C0, I2C_ACK_DISABLE);
while(i2c_flag_get(I2C0, I2C_FLAG_RBNE) == RESET);
return i2c_receive_data(I2C0);
}
uint8_t i2c_write_byte(uint8_t addr, uint8_t reg, uint8_t data)
{
i2c_start();
i2c_send_byte(addr << 1);
i2c_send_byte(reg);
i2c_send_byte(data);
i2c_stop();
return 0;
}
uint8_t i2c_read_byte16(uint8_t addr, uint16_t reg)
{
uint8_t data;
i2c_start();
i2c_send_byte(addr << 1);
i2c_send_byte(reg >> 8);
i2c_send_byte(reg);
i2c_start();
i2c_send_byte((addr << 1) | 1);
data = i2c_read_byte(0);
i2c_stop();
return data;
}
```
在这个代码示例中,I2C_SCL_PIN和I2C_SDA_PIN变量定义了I2C总线的时钟和数据线的GPIO引脚。I2C_GPIO变量定义了这些引脚所在的GPIO端口。 I2C_ADDR变量定义了I2C设备的地址。 i2c_init()函数初始化了I2C总线和GPIO引脚。i2c_start()函数开始一个I2C传输,i2c_stop()函数结束一个I2C传输。i2c_send_byte()函数发送一个字节到I2C总线上,i2c_read_byte()函数从I2C总线上读取一个字节。i2c_write_byte()函数写入一个字节到一个I2C设备的寄存器中,i2c_read_byte16()函数从一个I2C设备的16位寄存器中读取一个字节。
阅读全文