由于有时候出现硬件iic总线挂死的情况,所以记录一下软件iic的方法,代码来源网上资料整合
以下是.h文件
#ifndef _M_IIC_SOFT_H
#define _M_IIC_SOFT_H
#include "stdint.h" //基本数据结构
// #include "M_io.h"
#include "gd32f30x.h" //io 控制
/*******************************************
*Soft I2C
********************************************/
/* connect PB6 to I2C_SCL */
/* connect PB7 to I2C_SDA */
#define IIC_Soft 1 //是否启用软件
#define WP_EE_GPIO_PORT GPIOB
#define WP_EE_PIN GPIO_PIN_5
//#define IIC_SCL I2C0_SCL_PIN
//#define IIC_SDA I2C0_SDA_PIN
#define SDA_IN() gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_7)//输入模式
#define SDA_OUT() gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7)//输出模式
#define SCL_OUT() gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6)//输出模式
#define I2C_WAIT_TIMEOUT (uint8_t)250 //等待时间
#define I2C_DELAY (uint8_t)5 //延时时间
#define I2C_N_ACK (0U) //不发ACK
#define I2C_ACK (1U) //发送ACK
#define SW_I2C_SCL_LOW gpio_bit_reset(GPIOB, GPIO_PIN_6);
#define SW_I2C_SCL_HIGH gpio_bit_set(GPIOB, GPIO_PIN_6);
#define SW_I2C_SDA_LOW gpio_bit_reset(GPIOB, GPIO_PIN_7);
#define SW_I2C_SDA_HIGH gpio_bit_set(GPIOB, GPIO_PIN_7);
#define I2C_SDA_STATUS gpio_input_bit_get (GPIOB,GPIO_PIN_7) //读取SDA状态
#define I2C_SCL_STATUS gpio_input_bit_get (GPIOB,GPIO_PIN_6) //读取SCL状态
//#define SW_I2C_SDA_INPUT sw_i2c_set_sda_input() //设置SDA为输入模式
//#define SW_I2C_SDA_OUTPUT sw_i2c_set_sda_output() //设置SDA为输出模式
//#define SW_I2C_SDA_STATUS sw_i2c_sda_status() //设置SDA状态
//#define SW_I2C_BusInit sw_i2c_busInit() //总线初始化
//#define i2c_delay_us(a) SysCtlDelayus(a) //延时函数us
void Init_IIC(void);
void i2c_delay(void);
extern void sw_i2c_start(void);
extern void sw_i2c_stop(void);
extern

最低0.47元/天 解锁文章
9294

被折叠的 条评论
为什么被折叠?



