I2C with DMA on STM32G070
Jan. 8th, 2023 06:38 pmДобавил DMA в сниппет I2C под G070. Оказалось все не так уж и сложно: нужно лишь внимательно читать собственный код, чтобы не пропустить косяк, когда ты обнулил I2C1->CCR1, а потом забыл там выставить флаги для чтения/записи по DMA.
Основной недостаток — "подвисание" DMA в случае NAK или других проблем. Поэтому нужно периодически проверять флаги I2C, и чуть какие ошибки — заново его настраивать, чтобы все эти зависоны сбросить.
А еще обнаружил, что подопытный SHT30 — та еще гадость. На малейшую ошибку (скажем, не ту команду дал или не в тот регистр попытался записать) он подвешивает линию I2C! Нужно четко запомнить: всегда питание устройств I2C нужно вешать на управляемый ключ, иначе одна зараза может лишить доступа к другим устройствам.
Пожалуй, на этом игры с G070 на какое-то время прекращу. Да и вообще, G0 по сравнению с F0 практически никаких плюсов не имеет (кроме, разве что, DMAMUX), зато имеет гору минусов. В общем, ну его нафиг! Да еще и каналов DMA на 64-ногий корпус всего лишь 7. Ну что за извращение? Хочу хотя бы 32. А вообще, по-хорошему, надо бы наделать мультиплексоров столько, чтобы было хотя бы 128 каналов DMA. И прерываний хотя бы 256 — чтобы не было этой необходимости делить одно и то же прерывание между несколькими разными интерфейсами.
Основной недостаток — "подвисание" DMA в случае NAK или других проблем. Поэтому нужно периодически проверять флаги I2C, и чуть какие ошибки — заново его настраивать, чтобы все эти зависоны сбросить.
А еще обнаружил, что подопытный SHT30 — та еще гадость. На малейшую ошибку (скажем, не ту команду дал или не в тот регистр попытался записать) он подвешивает линию I2C! Нужно четко запомнить: всегда питание устройств I2C нужно вешать на управляемый ключ, иначе одна зараза может лишить доступа к другим устройствам.
Пожалуй, на этом игры с G070 на какое-то время прекращу. Да и вообще, G0 по сравнению с F0 практически никаких плюсов не имеет (кроме, разве что, DMAMUX), зато имеет гору минусов. В общем, ну его нафиг! Да еще и каналов DMA на 64-ногий корпус всего лишь 7. Ну что за извращение? Хочу хотя бы 32. А вообще, по-хорошему, надо бы наделать мультиплексоров столько, чтобы было хотя бы 128 каналов DMA. И прерываний хотя бы 256 — чтобы не было этой необходимости делить одно и то же прерывание между несколькими разными интерфейсами.