设置GD32F103软件iic程序
时间: 2024-02-03 21:15:36 浏览: 75
基于STM32F103系列单片机,通过拨码开关,外部硬件设置PCB ID,带程序源码及原理图,C,C++源码.zip
5星 · 资源好评率100%
GD32F103是一款基于ARM Cortex-M3内核的微控制器,要实现软件IIC通信需要编写相应的程序。以下是一个简单的示例:
```c
#include "gd32f10x.h"
#define I2C_SCL_PIN GPIO_PIN_6
#define I2C_SDA_PIN GPIO_PIN_7
#define I2C_GPIO_PORT GPIOB
#define I2C_SCL_HIGH() gpio_bit_set(I2C_GPIO_PORT, I2C_SCL_PIN)
#define I2C_SCL_LOW() gpio_bit_reset(I2C_GPIO_PORT, I2C_SCL_PIN)
#define I2C_SDA_HIGH() gpio_bit_set(I2C_GPIO_PORT, I2C_SDA_PIN)
#define I2C_SDA_LOW() gpio_bit_reset(I2C_GPIO_PORT, I2C_SDA_PIN)
#define I2C_SDA_READ() gpio_input_bit_get(I2C_GPIO_PORT, I2C_SDA_PIN)
static void delay_us(uint32_t us)
{
uint32_t i = 0;
while (us--) {
i = 10;
while (i--) {
__NOP();
}
}
}
static void iic_start(void)
{
I2C_SDA_HIGH();
I2C_SCL_HIGH();
delay_us(4);
I2C_SDA_LOW();
delay_us(4);
I2C_SCL_LOW();
delay_us(4);
}
static void iic_stop(void)
{
I2C_SDA_LOW();
I2C_SCL_HIGH();
delay_us(4);
I2C_SDA_HIGH();
delay_us(4);
}
static uint8_t iic_send_byte(uint8_t byte)
{
uint8_t i;
for (i = 0; i < 8; i++) {
if (byte & 0x80) {
I2C_SDA_HIGH();
} else {
I2C_SDA_LOW();
}
byte <<= 1;
delay_us(2);
I2C_SCL_HIGH();
delay_us(2);
I2C_SCL_LOW();
delay_us(2);
}
I2C_SDA_HIGH();
delay_us(2);
I2C_SCL_HIGH();
delay_us(2);
uint8_t ack = !I2C_SDA_READ();
I2C_SCL_LOW();
delay_us(2);
return ack;
}
static uint8_t iic_recv_byte(uint8_t ack)
{
uint8_t byte = 0;
uint8_t i;
I2C_SDA_HIGH();
for (i = 0; i < 8; i++) {
byte <<= 1;
I2C_SCL_HIGH();
delay_us(2);
if (I2C_SDA_READ()) {
byte |= 0x01;
}
I2C_SCL_LOW();
delay_us(2);
}
if (ack) {
I2C_SDA_LOW();
} else {
I2C_SDA_HIGH();
}
delay_us(2);
I2C_SCL_HIGH();
delay_us(2);
I2C_SCL_LOW();
delay_us(2);
I2C_SDA_HIGH();
return byte;
}
void iic_init(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
gpio_mode_set(I2C_GPIO_PORT, GPIO_MODE_OUTPUT_OD, GPIO_PUPD_PULLUP, I2C_SCL_PIN);
gpio_output_options_set(I2C_GPIO_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN);
gpio_mode_set(I2C_GPIO_PORT, GPIO_MODE_OUTPUT_OD, GPIO_PUPD_PULLUP, I2C_SDA_PIN);
gpio_output_options_set(I2C_GPIO_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SDA_PIN);
I2C_SDA_HIGH();
I2C_SCL_HIGH();
}
uint8_t iic_write_byte(uint8_t dev_addr, uint8_t reg_addr, uint8_t data)
{
iic_start();
if (!iic_send_byte(dev_addr << 1)) {
iic_stop();
return 0;
}
if (!iic_send_byte(reg_addr)) {
iic_stop();
return 0;
}
if (!iic_send_byte(data)) {
iic_stop();
return 0;
}
iic_stop();
return 1;
}
uint8_t iic_read_byte(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data)
{
iic_start();
if (!iic_send_byte(dev_addr << 1)) {
iic_stop();
return 0;
}
if (!iic_send_byte(reg_addr)) {
iic_stop();
return 0;
}
iic_start();
if (!iic_send_byte((dev_addr << 1) | 0x01)) {
iic_stop();
return 0;
}
*data = iic_recv_byte(0);
iic_stop();
return 1;
}
```
这个程序中包含了IIC总线的起始、停止、发送和接收数据的函数,同时也包含了初始化函数和写/读数据的函数。其中,`iic_init()`函数是初始化IIC总线的GPIO口,`iic_write_byte()`函数用于写数据到指定的设备和寄存器地址中,`iic_read_byte()`函数用于从指定设备和寄存器地址中读取数据。
你可以根据自己的需求进行修改和扩展。注意,在使用这个程序时,你需要将`I2C_SCL_PIN`和`I2C_SDA_PIN`分别设置为你实际使用的GPIO引脚。
阅读全文