| Автор |
Съобщение |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 STM32 I2C + DMA
Е не можах да накарам I2C-то да работи с ДМА и това е. (Само с интеръпти си работи отлично). Става дума за master mode, за слейв имам един еепром.
Ето какво се случва: 0. Клоци имат всички. 1.1 Инизиализирам И2Ц-то - ОК. 1.2 Вдигам CR2->DMAEN на И2Ц-то, щото така пише по менюалите. 1.3 IRQ-та за ДМА и И2Ц: конфигурирани и разрешени.
2. Инициализирам си ДМА канал (+ TCIE интеръпти) и го пускам. Разрешавам event interrupts от И2Ц-то. 3. Започвам трансфер - START condition. 4. Интеръпт след START condition - OK. Зареждам слейв адреса. 5. Интеръпт след ADDR. Забранявам event interrupts от И2Ц-то - вече не ни трябват, щото минаваме на ДМА, уж. TxE флага се вижда, че е вдигнат, изчиствам ADDR интеръпта с четене на SR1 и SR2, обаче ДМА трансфери не започват. CNDTR регистъра си стои с първоначално заредената дължина за трансфер и не мърда. Аз наивно си мисля, че щом има TxE флаг, значи трябва трансфера да захапе, обаче - не.
Пробвах да местя инициализацията на ДМА-то къде ли не, не работи и това е. Да не би да има някаква магия, дето съм изпуснал да приложа? (контролера е STM32L152VBT6).
|
| Вто Мар 11, 2014 12:24 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11265 Местоположение: Добрич
|
 Re: STM32 I2C + DMA
преди време имах проблем с нетръгващо ДМА... оказа че бях забравил flow контрола, демек дали ДМА-то е мастер или периферията прави заявки. В твоя случай ако следваме логиката на ST на периферията трябва да й кажеш да прави заявки към ДМА-то, а то да е слейв...
|
| Вто Мар 11, 2014 11:06 am |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: STM32 I2C + DMA
То точно това е целта на тоя бит DMAEN (в И2Ц-то) в комбинация с DIR бита в ДМА-то, но аз си ги сетвам както трябва. Аз сега гледам какви ли не примери по темата и ми прави впечатление, че всички ползват отделни ДМА канали за Rx и Tx. И се питам защо, след като бъса е half-duplex? Опитвам се да ползвам само един ДМА канал за И2Ц канал, може в това да е проблема (но в момента нямам таргет да пробвам).
|
| Вто Мар 11, 2014 11:31 am |
|
 |
|
Vesko
Ранг: Популярен
Регистриран на: Пон Мар 22, 2010 8:52 pm Мнения: 328
|
 Re: STM32 I2C + DMA
Поне при Ф2 ДМА канала не е въпрос на свободен избор. Имаш определен брой възможности за ползване...
Миро, по отношение на флоъ контрола СДИО-то не беше ли единствената различна периферия?
|
| Вто Мар 11, 2014 11:40 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11265 Местоположение: Добрич
|
 Re: STM32 I2C + DMA
Значи аз говоря за DMA_SxCR_PFCTRL флага, при теб вероятно е дефиниран по друг начин... аз ползвам конвенцията ПЕРИФЕРИЯ–РЕГИСТЪР–СТОЙНОСТ
Това е независимо от другите настройки. Проблемът е че това има едно описание, а както казва Веско комбинациите не са свободни.
В случая с тоя флаг се настройва ДМА-то да прави трансфер само при заявка от периферият. В обратния случай не би трябвало да се съобразява с периферията и да прави трансфер веднага като го разрешиш. Да, ама не. Поне при SDIO дето борих не правеше трансфери въпреки че е разрешен и всичко останало....
|
| Вто Мар 11, 2014 11:47 am |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: STM32 I2C + DMA
@Vesko, благодаря, това е проблема. За форума: Извод №0: Менюала не трябва да се чете избирателно  Извод №1: Не всеки ДМА канал може да се ползва с всяка периферия. Извод №2: При работа с определена периферия, даден ДМА канал си има посока.
|
| Вто Мар 11, 2014 12:10 pm |
|
|