Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Работа с ИК-матрицей MLX90640 STM32

Ср фев 28, 2024 09:43:45

Начал работать с матрицей MLX90640 на STM32F407VET6 при помощи библиотеки от производителя (https://github.com/melexis/mlx90640-library/tree/master). При запуске считываются данные из EEPROM. Затем, при попытки их обработки функцией MLX90640_ExtractParameters происходит hardfault_handler. Обнаружил, с какого места появляется ошибка:
Код:
static int ExtractDeviatingPixels(uint16_t *eeData, paramsMLX90640 *mlx90640)
{
    uint16_t pixCnt = 0;
    uint16_t brokenPixCnt = 0;
    uint16_t outlierPixCnt = 0;
    int warn = 0;
    int i;
   
    for(pixCnt = 0; pixCnt<5; pixCnt++)
    {
        mlx90640->brokenPixels[pixCnt] = 0xFFFF; // ТУТ
        mlx90640->outlierPixels[pixCnt] = 0xFFFF;
    }
       
    pixCnt = 0;
...
}

Заметил, что если добавить рядом в цикл mlx90640->brokenPixels[0] = 0xFFFF;, то ошибка больше не выдается, но после этого I2C имеет флаг BUSY и дальнейшая работа с камерой невозможна

Re: Работа с ИК-матрицей MLX90640 STM32

Чт фев 29, 2024 09:20:44

Возможно проблема в I2C драйвере для библиотеки в преобразовании указателей, но я не уверен.
Код:
int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data)
{

   uint8_t* p = (uint8_t*) data; // <--

   int ack = 0;                               
   int cnt = 0;
   
   ack = HAL_I2C_Mem_Read(&hi2c1, (slaveAddr<<1), startAddress, I2C_MEMADD_SIZE_16BIT, p, nMemAddressRead*2, 500);

   if (ack != HAL_OK)
   {
         return -1;
   }
   

   for(cnt=0; cnt < nMemAddressRead*2; cnt+=2) {
      uint8_t tempBuffer = p[cnt+1];
      p[cnt+1] = p[cnt];
      p[cnt] = tempBuffer;
   }

   return 0;   
}

Re: Работа с ИК-матрицей MLX90640 STM32

Чт фев 29, 2024 14:25:46

У ХАЛа были какие-то проблемы именно с И2Ц. То есть именно ошибки библиотек, пользователь никак повлиять не мог. Может, это оно?

Re: Работа с ИК-матрицей MLX90640 STM32

Вс мар 10, 2024 21:59:50

Посмотри как я баловался с этим датчиком.
Там две ветки - одна с бесконечным циклом, другая с FreeRTOS.
Я немного переработал библиотеку и засунул во флеш массив коррекции пикселей. Это сэкономило 10кБ ОЗУ.
Ответить