我目前正在开发基本例程,以便与 IMU 或惯性测量单元进行通信,TDK 的 ICM20948 - InvenSense 通过我自己开发的 PCB 使用 I2C 协议,我目前具有与之通信的功能,例如:
int writeRegister(uint8 slaveAdress, uint8 registerAdress, uint8 data);
uint8 readRegisters(uint8 slaveAdress, uint8_t subAddress, uint8 count, uint8 dest);
int selectAutoClockSource(uint8 slaveAdress)
还有一些工作正常(我读过告诉我这是工作的寄存器)关键是ICM20948数据表设备没有指定我配置它以读取加速度数据的顺序,我找到了一个代码在 GitHub 上,更具体地说是https://github.com/dtornqvist/icm-20948-arduino-library,它是用 Arduino 编写的,我试图将它移植到我目前使用的语言 c,得到当前配置功能
int begin(uint8 slaveAdress){
if (changeUserBank_force(slaveAdress, USER_BANK_0) < 0) {
return -1;
}
if (selectAutoClockSource(slaveAdress) < 0) {
return -2;
}
// enable I2C master mode
if(enableI2cMaster(slaveAdress) < 0){
return -3;
}
if (powerDownMag(slaveAdress) < 0) {
return -4;
}
reset(slaveAdress);
CyDelay(10);
if (selectAutoClockSource(slaveAdress) < 0) {
return -6;
}
whoAreU(slaveAdress);
if(enableAccelGyro(slaveAdress, UB0_PWR_MGMNT_2, UB0_PWR_MGMNT_2_SEN_ENABLE) == 1){
} else {
UART_DEBUG_PutString("\r\n Error al habilitar el giroscopio y acelerometro");
return -7;
}
if(configAccel(slaveAdress, ACCEL_RANGE_2G, ACCEL_DLPF_BANDWIDTH_246HZ) != 1){
return -8;
}
if (setAccelSrd(slaveAdress,0) < 0) {
return -12;
}
return 1;
}
之后我打电话给我的:
int16_t getAccelX_mss(uint8 slaveAdress){
uint8 _axcountsH, _axcountsL;
int16_t _axcounts;
if (changeUserBank_force(slaveAdress, USER_BANK_0) < 0) {
return -1;
}
_axcountsH = readRegisters(slaveAdress, 0x45u, 1, _axcountsH);
_axcountsL = readRegisters(slaveAdress, 0x46u, 1, _axcountsL);
_axcounts = (((int16_t)_axcountsH) << 8) | _axcountsL;
sprintf(Rx_aux, " 0x%d ", _axcounts);
UART_DEBUG_PutString("\r\n Acce Read: ");
UART_DEBUG_PutString(Rx_aux);
return 1;
}
函数,它应该通过 UART 向我返回 45u 和 46u(加速度)寄存器信息的混合,但我正在接收下一个输出(我正在使用 Hterm 0.8.3 来捕获 uart 输出)
UART ok...<\r><\n>
Begin.<\r><\n>
Begin with no errors.<\r><\n>
Acce Read: 0x0
我没有真正的线索,即使我移动我的 pcb,产生加速度,结果保持为 0x0。有没有人使用过这类软件并且可以给我一些关于如何继续工作的建议?或者我的代码有任何我没有看到的重要错误?