我目前正在编写代码来配置I2C上的特定外设并与之交互。当然,配置设备上的所有所需功能需要将多个寄存器设置为特定值。我已经使用#define DEVICE_REG_NAME0 0xEE
形式的宏来组织我对设备内存的访问,但是要写入的字节当前只是幻数。如何描述/记录每个存储器位置中的位或向量,以使设备的配置可理解?
答案 0 :(得分:2)
您可以使用宏来定义寄存器设置以及寄存器地址。例如,假设寄存器NAME0的值是一个包含两个单独位的位字段,用于启用THIS和THAT。它还包含一个两位字段,用于选择四个MODE中的一个。
#define DEVICE_REG_NAME0_ADDR 0xEE
#define DEVICE_REG_NAME0_ENABLE_THIS 0x01
#define DEVICE_REG_NAME0_ENABLE_THAT 0x02
#define DEVICE_REG_NAME0_MODE0 0x00
#define DEVICE_REG_NAME0_MODE1 0x04
#define DEVICE_REG_NAME0_MODE2 0x08
#define DEVICE_REG_NAME0_MODE3 0x0C
然后通过对寄存器中每个字段的宏进行按位或运算来构建要分配给寄存器的值。
// This value enables THIS, disables THAT, and selects MODE1
(DEVICE_REG_NAME0_ENABLE_THIS | DEVICE_REG_NAME0_MODE1)
// This value disables THIS, enables THAT, and selects MODE2
(DEVICE_REG_NAME0_ENABLE_THAT | DEVICE_REG_NAME0_MODE2)
如果你想用禁用位更加明确,那么你可以定义这些额外的宏。
#define DEVICE_REG_NAME0_DISABLE_THIS 0x00
#define DEVICE_REG_NAME0_DISABLE_THAT 0x00
寄存器值的各个位和字段的名称应反映数据表中使用的名称。
更新:如果您有一个表示整数值的多位字段,并且您不想为每个可能的值定义宏,那么您可以使用单个宏来定义移位量。例如,让我们在位4到6中添加另一个DEBOUNCE字段,表示一个整数周期,其值介于0和7之间。
#define DEVICE_REG_NAME0_DEBOUNCE_SHIFT 4
给定一个表示所需值(未移位)的整数变量debounce
,您可以像这样创建相应的寄存器值
(debounce << DEVICE_REG_NAME0_DEBOUNCE_SHIFT)
并且您可以使用其他寄存器字段的宏对该数量进行按位运算。