本帖最后由 mftang2016 于 2017-4-22 10:55 编辑
在工程设计中,有时需要使用IO模拟多个iic接口, 而IIC接口的模拟和硬件关系很大,怎么能使用一种方法将硬件层完全抽象出来呢?这篇文章就来解决这个问题。
Step 1: 建立一个和IIC硬件相关的结构体
typedef struct _i2c {
void (*IIC_InitPort)( void ); //硬件驱动初始化
void (*IIC_SDA_H)(); //SDA置高
void (*IIC_SDA_L)(); //SDA置低
void (*IIC_SCL_H)(); //SCL置高
void (*IIC_SCL_L)(); //SCL置高
INT8U (*IIC_READ)(); //读SDA
INT8U (*IIC_READ_SCL)(); //读SCL
} I2C;
要实现的IIC 函数如下(I2C.c 中实现):
void i2c_Start( I2C *i2c );
void i2c_Stop( I2C *i2c );
void i2c_SendByte( I2C *i2c, INT8U _ucByte);
INT8U i2c_ReadByte( I2C *i2c );
INT8U i2c_WaitAck( I2C *i2c );
void i2c_Ack( I2C *i2c );
void i2c_NAck( I2C *i2c );
INT8U i2c_CheckDevice(I2C *i2c, INT8U _Address);
具体文件头如下:
[mw_shl_code=c,true]#ifndef __I2C_H
#define __I2C_H
#define I2C_WR 0 /* 写控制bit */
#define I2C_RD 1 /* 读控制bit */
typedef struct _i2c {
void (*IIC_InitPort)( void );
void (*IIC_SDA_H)();
void (*IIC_SDA_L)();
void (*IIC_SCL_H)();
void (*IIC_SCL_L)();
INT8U (*IIC_READ)();
INT8U (*IIC_READ_SCL)();
} I2C;
void i2c_Start( I2C *i2c );
void i2c_Stop( I2C *i2c );
void i2c_SendByte( I2C *i2c, INT8U _ucByte);
INT8U i2c_ReadByte( I2C *i2c );
INT8U i2c_WaitAck( I2C *i2c );
void i2c_Ack( I2C *i2c );
void i2c_NAck( I2C *i2c );
INT8U i2c_CheckDevice(I2C *i2c, INT8U _Address);
#endif /*__I2C_H */[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
设置如下模式就不用即可:
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; /* 设为开漏模式 */
一周热门 更多>