我正在c。
中编写嵌入式设备驱动程序我的设备有3个不同的I²C地址。 每个I²C地址都有不同的寄存器,可以与寄存器地址一起使用(例如0xAB)
某些寄存器地址重叠但名称不同。
设备a:0x12有0x00(状态寄存器)
设备b:0x23有0x00(设置中断屏蔽)
目前我已将这些不同的0x00定义为 但设备b也有不同的其他寄存器
#define DEVICE_A_STATUS (0x00)
#define DEVICE_B_INTMASK (0x00)
#define DEVICE_B_MEH (0xAF)
如何制作,只有设备A才能访问i2c寄存器地址。
创建一个结构?
最后我需要将设备地址(0x12)和寄存器地址(0xAF)传递给一个函数。此功能应该能够处理所有3种不同的i2c设备。 我认为某些继承可能会在c ++中起作用,但我怎样才能轻松,干净,并且在c?
答案 0 :(得分:0)
我怎么做,只有设备A可以访问i2c寄存器 地址为?
使用封装。设备A寄存器定义应限制在设备A驱动程序的范围内。
创建结构?
除非你需要在RAM中保存设备寄存器值的副本,否则我真的不知道结构如何帮助你。结构对于存储器映射寄存器很有用,但这些I2C器件不是存储器映射的(它们是通过I2C总线访问的)。
最后我需要传递设备地址(0x12)和寄存器 地址(0xAF),一个函数。这个功能应该能够处理 所有3种不同的i2c设备。我认为继承会像是一样 也许用c ++工作,但我怎样才能轻松,干净,并且在c?
是的,你想要你描述的功能但是没有,我不认为它是继承。相反,将其视为彼此分层的不同抽象层次。在较低级别,您有一个I2C驱动程序,可以实现您描述的功能。低级I2C驱动器对可能连接到总线的任何特定I2C器件一无所知。然后在I2C驱动程序上方的一层,您可以为连接到I2C总线的每种设备类型提供设备驱动程序。这些设备驱动程序知道并封装其设备寄存器的详细信息。并且这些设备驱动程序调用较低级别的I2C驱动程序功能。较高级别的设备驱动程序使用较低级别的I2C驱动程序(它们不继承较低级别的I2C驱动程序)。
文件i2c.h
包含低级I2C驱动程序接口的声明,包括您描述的函数:
void I2CSetDeviceRegister(uint8_t device_address, uint8_t register_address, uint8_t register_value);
uint8_t I2CGetDeviceRegister(uint8_t device_address, uint8_t register_address);
文件device_a.c
包括i2c.h
并定义封装的寄存器定义:
#include "i2c.h" // This device uses the lower level I2C driver
#define REGISTER_STATUS 0 // The scope of this register definition is encapsulated within device_a.c
文件device_b.c
包括i2c.h
并定义封装的寄存器定义:
#include "i2c.h" // This device uses the lower level I2C driver
#define REGISTER_INT_MASK 0 // The scope of this register definition is encapsulated within device_b.c