嵌入式c语言针对系统中有多个i2c设备和多个spi设备的面向对象编程思想

 

参考源码:先把芯片顺序定义出来

 /*
*------------------------------------------------------------------------------
* @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);



}

最后,代码只作为参考,读者可以进行更好的改造,这里只是提供一种编程思想。希望能帮助到大家。

 

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值