嵌入式系统通用驱动程序接口及其实现-I2C主机设备驱动
应用场景
- EEPROM 24系列 电视频道
- 7289 按键驱动
- ADC
- DAC
- 触模板驱动
- 自定义I2C协议,设备内部系统 单元模块之间通讯(主机,从机)。
I2C数据构成:
struct _I2cData{
unsigned char Adr; //设备址
unsigned char *pCmd;
unsigned char CmdLen;
unsigned char *pData;
unsigned char DataLen;
unsigned char Flag; //相关标志
//后继处理函数,不实现此功能时为空()
void (*EndNotify)(signed char IsErr);//收发数据接结束后调用
};
#define I2C_DATA_RD 0x80 //读
#define I2C_DATA_WR 0X00 //写
#define I2C_DATA_OV_MASK 0X7F //数据超时值
I2C主机设备驱动程序
C++实现
class I2cDev{ //I2cMasterDev,从机I2cSlaveDev
public:
//构造函数
I2cDev(void *pHw,
unsigned long Baud, //当前设备通讯波特率
unsigned long Mck); //系统时钟
//基本功能:
signed char ReStart(struct _I2cData *pData);
void Reset();
signed char IsEnd();
//通讯过程控制:
enum _eState {eIdie eError}
enum _eState eGetState();
void IRQ(); //中断处理程序
//超时控制
void timeEvent(); //1ms定时器
private:
struct _I2cData *pData; //数据缓冲
void *pHw; //硬件
enum _eState eState; //状态机
unsigned char Index; //状态内部计数
ErrTimer; //内部故障计时,超过计时
};
C实现(I2cDev.h)
//I2C工作状态机:
enum _eI2cDevState{
eI2cDevIdie = 0,
.
.
. //中间态
eI2cDevFinal = n-1, //结束态
eI2cDevErr = n,
};
struct _I2cDev{
struct _I2cData *pData; //数据缓冲
void *pHw; //硬件
enum _eI2cDevState eState; //内部状态机
unsigned char Index; //状态内部计数
ErrTimer; //内部故障计时,超过计时
};
//-----------------------I2C初始化函数------------------------
I2cDev_Init(I2cDev *pDev, //未初始化的I2C设备
void *pHw,
unsigned long Baud, //当前设备通讯波特率
unsigned long Mck); //系统时钟
//------------------数据读写函数-------------------------
//返回是否成功 0成功,非0失败
signed char I2cDev_ReStart(I2cDev *pDev, //I2C设备
struct _I2cData *pData);
//------------------硬件复位函数-------------------------
void I2cDev_Reset(I2cDev *pDev);//I2C设备
//------------------是否通讯结束状态--------------------
signed char I2cDev_IsEnd(I2cDev *pDev);//I2C设备
//----------------------获得当前状态--------------------
//enum _eI2cDevState I2cDev_eGetState(const I2cDev *pDev);//I2C设备
#define I2cDev_eGetState(pdev) ((pdev)->eState)
//------------------------中断处理程序-------------------------
void I2cDev_IRQ(I2cDev *pDev);//I2C设备
//-----------------------任务函数------------------------------
//放入系统1ms进程时
void I2cDev_Task(I2cDev *pDev);//I2C设备