工具与软件:
您好!
我将 bmm350传感器代码移植到 Tiva-C 平台。
https://github.com/boschsensortec/BMM350_SensorAPI
作者利用函数指针和巧妙设计的结构在 C++中创建可在多种平台中工作的驱动程序。
但是、使用 tm4c123gh6pm 和 CCS 时、指针存在一些问题。 下面我们举例说明:
static int8_t bmm350I2cReadData(uint8_t Reg, uint8_t *Data, uint32_t len, void *intfPtr) {
uint8_t deviceAddr = *(uint8_t*)intfPtr;
I2C3Receive(deviceAddr, Reg, Data, len);
return 0;
}
通过取消引用 void *intfPtr 获得的 deviceAddr 总是错误的、尽管"*(uint8_t*)intfPtr"似乎是正确的语法。
另一方面、这些参数(例如地址)加载如下:
uint8_t devAddr;
switch(interface) {
case eBmm350InterfaceI2C:
devAddr = BMM350_I2C_ADSEL_SET_LOW; // 0x14
bmm350Sensor.intfPtr = &devAddr;
break;
case eBmm350InterfaceI3C:
break;
}
bmm350器件的结构如下:
// brief bmm350 device structure
struct bmm350_dev {
// The interface pointer is used to enable the user
// to link their interface descriptors for reference during the
// implementation of the read and write interfaces to the hardware.
void* intfPtr; // interface pointer
uint8_t chipId; // chip Id of BMM350
pBmm350ReadFptr_t read; // Bus read function pointer
pBmm350WriteFptr_t write; // Bus write function pointer
pBmm350DelayUsFptr_t delayUs; // delay(in us) function pointer
BMM350_INTF_RET_TYPE intf_rslt; // to store interface pointer error
uint8_t axisEn; // variable to store status of axes enabled
struct bmm350_mag_compensate mag_comp; // structure for mag compensate
uint16_t otp_data[BMM350_OTP_DATA_LENGTH]; // array to store OTP data
uint8_t var_id; // variant ID
bmm350_mraw_override_t mraw_override; // magnetic reset and wait override
uint8_t powerMode; // power mode
};
基本而言、函数指针部分可正常工作、但从指针传递值时无法正常工作。
非常感谢您提出任何想法/给予帮助。
此致、
c.