一种通用性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]




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
mftang2016
1楼-- · 2019-07-20 02:45
 精彩回答 2  元偷偷看……
mftang2016
2楼-- · 2019-07-20 03:46
函数文件如下:
IIC.zip (1.75 KB, 下载次数: 353) 2017-4-22 10:53 上传 点击文件名下载附件
I2C 驱动

mftang2016
3楼-- · 2019-07-20 05:22
 精彩回答 2  元偷偷看……
mftang2016
4楼-- · 2019-07-20 07:02
 精彩回答 2  元偷偷看……
八度空间
5楼-- · 2019-07-20 10:35
大神,膜拜
专注STM32
6楼-- · 2019-07-20 12:29
谢谢大神啦,我正好要用到,爱死你了

一周热门 更多>