【问题标题】:Create own Register for device driver为设备驱动程序创建自己的寄存器
【发布时间】:2018-04-20 12:45:31
【问题描述】:

我正在用 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 可以访问 a 的 i2c 寄存器地址。

创建一个结构?

最后,我需要将设备地址 (0x12) 和寄存器地址 (0xAF) 传递给函数。这个函数应该能够处理所有 3 个不同的 i2c 设备。 我认为像继承之类的东西可能在 c++ 中起作用,但我如何在 c 中简单、干净地做到这一点?

【问题讨论】:

  • @Lundin 它们是 I2C 设备中的寄存器。
  • @unwind Aah 当然,它们不在芯片上。我应该更仔细地阅读,别管我:)
  • 设备 A 和设备 B 是否相似(即它们是否有许多共同的寄存器、提供相似的功能或行为相似)?还是设备 A 和设备 B 不同(即很少有共同的寄存器、提供不同的功能或行为不同)?

标签: c embedded i2c


【解决方案1】:

我将如何做到,只有设备 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多