Мой проект написан на 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», но никаких изменений не произошло.

Но это происходит только в течение 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]
Мобильная версия