ICM20948 последовательность использования - PullRequest
0 голосов
/ 21 февраля 2020

В настоящее время я разрабатываю базовые процедуры 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. Кто-нибудь работал с этим классом программного обеспечения и может дать мне несколько советов о том, как продолжать работать? Или у меня есть какая-то важная ошибка в моем коде, которую я не видел? Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...