В настоящее время я разрабатываю базовые процедуры c для связи с IMU или инерциальным измерительным блоком, ICM20948 от TDK - InvenSense с использованием протокола I2 C через печатную плату, которую я разработал сам, в настоящее время у меня есть функции для связи с ним, как:
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
Я понятия не имею, даже когда я двигаю свою печатную плату, генерируя ускорение, результат которого сохраняется равным 0x0. Кто-нибудь работал с этим классом программного обеспечения и может дать мне несколько советов о том, как продолжать работать? Или у меня есть какая-то важная ошибка в моем коде, которую я не видел? Заранее спасибо.