参考源码:先把芯片顺序定义出来
/*
*------------------------------------------------------------------------------
* @file : demo.c
* @author : joy.huang
* @date : 2019-11-14
* @brief :
* @attention : 假设有4个i2c设备 和 2个spi设备
*/
enum CHIPIDNUM
{
NO_CHIP = 0,
XXX_VENDOR_CHIP_I2C_XXX_1,
XXX_VENDOR_CHIP_I2C_XXX_2,
XXX_VENDOR_CHIP_I2C_XXX_3,
XXX_VENDOR_CHIP_I2C_XXX_4,
XXX_VENDOR_CHIP_SPI_XXX_1,
XXX_VENDOR_CHIP_SPI_XXX_2,
};
二、定义指针函数和设备操作数据结构
typedef int (*Init)(uint8_t CHIPID);
typedef int (*Read)(uint8_t CHIPID,uint8_t reg,uint8_t len,uint8_t *buf);
typedef int (*Write)(uint8_t CHIPID,uint8_t reg,uint8_t len,uint8_t *buf);
typedef int (*Check)(uint8_t CHIPID);
typedef struct XXXCOMMONCHIP
{
const char *name;
uint8_t chipId;
uint16_t chipSlaveAddr;
Init xxxChipInit;
Read xxxChipRead;
Write xxxChipWrite;
Check xxxChipCheck;
}XXXCOMMONCHIP_T;
三、定义设备注册函数
static XXXCOMMONCHIP_T *usr_common_chip_arr[256];
static XXXCOMMONCHIP_T XXXCHIP[4];
int COMMONCHIP_REGISTER(XXXCOMMONCHIP_T *pChip)
{
if(pChip->chipId == 0 || pChip->name == NULL || pChip == NULL)
return -1;
if(usr_common_chip_arr[pChip->chipId] != NULL)
return -2;
usr_common_chip_arr[pChip->chipId] = pChip;
return 0;
}
四、注册设备以及使用参考
int xxxxxxxxChipI2cInit(uint8_t CHIPID)
{
}
int xxxxxxxxxxxxxChipi2cRead(uint8_t CHIPID,uint8_t reg,uint8_t len,uint8_t *buf)
{
}
//.....
//.....
init xxxChip_init()
{
int i=0;
for(i =0 ;i<4;i++)
{
XXXCHIP[i].name = "XXXchipName";
XXXCHIP[i].chipId = XXX_VENDOR_CHIP_I2C_XXX_1++; // ensuer XXX_VENDOR_CHIP_I2C_XXX_1 in enum to continuous (保证在enum中连续,方便后面操作)
XXXCHIP[i].xxxChipInit = xxxxxxxxChipI2cInit;
XXXCHIP[i].xxxChipRead = xxxxxxxxxxxxxChipi2cRead;
}
//....
//....
//....
for(i =0 ;i<4;i++)
{
COMMONCHIP_REGISTER(&XXXCHIP[i]);
}
}
int main()
{
uint8_t buf[128];
int i=0;
//初始化所有芯片数据
xxxChip_init();
xxxxxxxxChip_init();
xxxxxxxxChip_init();
//初始化所有芯片
for(i=NO_CHIP;i<XXX_VENDOR_CHIP_SPI_XXX_2;i++)
{
if(usr_common_chip_arr[i] ==NULL ||usr_common_chip_arr[i]->name ==NULL \
||usr_common_chip_arr[i]->xxxChipInit ==NULL)
{
continue;
}
if(usr_common_chip_arr[i]->xxxChipInit != NULL)
usr_common_chip_arr[i]->xxxChipInit();
}
//读某个芯片
usr_common_chip_arr[XXX_VENDOR_CHIP_SPI_XXX_1]->xxxChipRead(0X11,128,buf);
}
最后,代码只作为参考,读者可以进行更好的改造,这里只是提供一种编程思想。希望能帮助到大家。