可能是一个非常基本的问题,但这使我非常困惑。
应用
我正在编写I2C硬件接口的驱动程序。这个想法是要有一个执行实际硬件访问的模块(i2c_driver.c / .h)和一个描述设备的模块(i2c_devices.c / .h),该模块利用了i2c_driver。
该驱动程序旨在与单个函数调用一起使用,该函数将描述事务的结构传递给该函数。因此,例如,访问设备看起来像这样:
I2C_Transaction_TypeDef trans;
trans.Instance = I2C1;
trans.Operation = I2C_OPERATION_WRITE;
trans.DeviceAddress = HDC1080_I2C_ADDR;
trans.RegAddress = HDC1080_TEMP_ADDR;
trans.Count = 2;
trans.pData = (uint8_t *)txbuf;
I2C_do_transaction(&trans);
模块的用法如下:
main.c -> i2c_devices.h -> i2c_drivers.h -> (low level MCU stuff)
i2c_devices.c i2c_drivers.c
问题
上面显示的事务的 I2C_Transaction_TypeDef 描述包含成员“ Operation”,可以是固定选项集的任何选项。这些选项存储在i2c_driver.h中为
typedef enum {
I2C_OPERATION_WRITE,
I2C_OPERATION_READ,
I2C_OPERATION_READ_ADDRESS
} I2C_Operations;
,因此 I2C_Transaction_TypeDef 成员 Operation 的类型为 I2C_Operations ,以明确声明应使用这些选项/成员之一。>
这对于在i2c_driver.c(包括i2c_driver.h)中的使用非常有用,例如:
trans->Operation = I2C_OPERATION_WRITE;
与第一个代码段完全相同的行是什么。但是,在第一个代码段中,我最终遇到了一个错误。 标识符“ I2C_OPERATION_WRITE”未定义
如果我将i2c_devices.c更改为直接包含i2c_driver.h,而不是通过i2c_driver.h间接包含它,则会起作用。
不工作:
i2c_devices.c -> i2c_devices.h -> i2c_drivers.h
工作:
i2c_devices.c -> i2c_devices.h
-> i2c_drivers.h
请帮助我理解原因。
答案 0 :(得分:0)
正如你们中一些人在问题下方的评论中指出的(好家伙!),我遇到了复制/粘贴错误:当我将前一个模块拆分为设备和驱动程序时,我没有调整头文件,因此它们是相同的。