STM32 HAL I2C DMA не запускает функцию обратного вызоваC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 STM32 HAL I2C DMA не запускает функцию обратного вызова

Сообщение Anonymous »

Я пытаюсь прочитать и записать данные на датчик через i2c с помощью DMA1 на плате STM32 Nucleo F401, на которой работает FreeRTOS.
Мой проект написан на C++ и использует библиотеки HAL stm32 в качестве extern «C».
Я могу читать данные датчика методом опроса, а рядом с I2C работает UART с DMA2 правильно. Я проверил, и MX_DMA_Init выполняется до MX_I2C1_Init.
Когда я пытаюсь выполнить запись на датчик в качестве ведущего устройства с помощью DMA(HAL_I2C_Master_Transmit_DMA) с отключенными во FreeRTOS «прерыванием события i2c1» и «прерыванием ошибки i2c1», параллельные задачи выполняются нормально, только обратный вызов HAL_I2C_MasterTxCpltCallback не запускается.
И когда я включаю «прерывание события i2c1» и «прерывание ошибки i2c1» из CubeMX, две параллельные задачи во FreeRTOS выполняются одновременно, тогда параллельное планирование больше не происходит, и периодически вызывается функция HAL_I2C_EV_IRQHandler и оставляем функцию в последней ветке else, где закомментировано /* Ничего не делать */.
Изображение

Изображение
Изображение

Не могли бы вы подсказать, с чем я могу попробовать использовать i2c? DMA?
Я пытался включить и отключить прерывание события i2c1 от CubeMX и ожидал, что произойдет обратный вызов HAL_I2C_MasterTxCpltCallback. Но периодически запускался только HAL_I2C_EV_IRQHandler.
  • Я пытался использовать I2C с методом опроса, и он работал правильно.
  • Я пытался использовать UART с DMA, и он тоже работал правильно.
  • Я пытался проверить порядок MX_DMA_Init и MX_I2C1_Init, и это было правильно.
  • Я пытался проверить, запускается ли какой-либо другой обратный вызов I2C, но никакой другой обратный вызов I2C не запускается.
  • Я пытался обновить версию CubeMX с F4 V1.26.2 до F4 V27.1, но я не видел ни одного улучшение.
  • Я пытался внедрить всю реализацию HAL и функции обратного вызова во внешний «C», но никаких изменений не произошло.
Я перешел на плату STM32 H723ZG, где по крайней мере первая передача данных I2C происходила с помощью DMA
Изображение
Но это происходит только в течение 1 цикла, и DMA выходит из строя с кодом ошибки 1. Что такое ошибка передачи

Код: Выделить всё

#define HAL_DMA_ERROR_TE              (0x00000001U)    /*!< Transfer error                          */
Изображение

Я видел, что в серии h= мне нужно выровнять данные, передаваемые в DMA, чтобы иметь возможность отправлять, и я попытался применить исправление для этого.
Мой код теперь выглядит так это:

Код: Выделить всё

#define TX_LENGTH (16)
uint8_t i2cData[TX_LENGTH];

void I2C_Write8(uint8_t ADDR, uint8_t data)
{
i2cData[0] = ADDR;
i2cData[1] = data;
uint8_t MPUADDR = (MPU_ADDR

Подробнее здесь: [url]https://stackoverflow.com/questions/75382726/stm32-hal-i2c-dma-not-triggering-callback-function[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»