一种通用性IIC接口的实现

2019-07-20 02:36发布

本帖最后由 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]




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。