реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Работа с DMA на передачу UART
SasaVitebsk
сообщение Jan 24 2014, 11:06
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Борюсь с MSP430 уже месяц.
Думаю будет больно слышать тем, кто их регулярно использует и любит данное семейство, но тем не менее есть объективная реальность на мой взгляд.
Кто-то захочет начать, я скажу что совсем недоволен результатом. Некоторые хомуты не укладываются у меня в голове. И при этом я работаю с 6 семейством! Просто диву даюсь с ребят TI.
Перечислю вещи которые на меня произвели неизгладимое впечатление.
1. Если по какой-то причине не сброшен флаг в прерывании, то МК зацикливается на данном прерывании. При чём зацикливается накоротко. То есть при этом он вообще не выполняет ни одной команды головы. Учитывая, что способ сброса флага абсолютно не расписан - вызвало у меня головную боль. В частности есть IV регистр. Было бы логичным сбрасывать флаг там и где-то именно так и происходит, но для SD24B надо прочитать регистр данных. (
2. В таймере при захвате не сбрасывается регистр счёта. Но ведь сброс вручную приводит к очевидной ошибке.
3. При останове процессора родным отладчиком может с периферией может происходить что угодно. Например по первому прерыванию USART вижу последний байт пакета или таймер показывает полную чушь и самое главное при продолжении работает не так, как положено. И так далее.
4. Значительные несоответствия в разных документах. Например в UM на семейство, для таймера обозначаются входы как CCIxA и CCIxB. И ссылаются на документ на конкретный камень. В нём же эти входы обозначены как TAx.0/ TAx.1. В UM описано 4 типа таймеров. В UM на камень с трудом докапываешься какой именно применён. Отличаются объявления в хидерах и документации. Ошибки в целом незначительные и мне сразу понятные, но начинающему, я уверен будет непросто.
5. В целом уровень периферии на порядок слабее аналогичных у других производителей, таких как ST, NXP.
===
Теперь по существу вопроса.
Приём заработал сразу и без вопросов.
Передачу хотел реализовать по DMA.
Инициализирую так.
Код
// Передать буфер
void vUSARTTransmit(void)
{
  LTX_ON;                                            // светодиод TX зажечь
  USART_WR;                                            // Перейти на передачу
  DMACTL0 = DMA0TSEL__USCIA0TX;                        // UCA0TXIFG на канал 0
  DMA0CTL = DMADT2 | DMASRCINCR0 | DMASRCINCR1 |
            DMADSTBYTE | DMASRCBYTE | DMAIE;        // +1 на источнике, побайтно, прерывание
  DMA0SZ = mbcom.len;                                // длина
  DMA0SA = mbcom.buf;                                // Источник
  DMA0DA = (void*)&UCA0TXBUF;                        // Получатель
  //DMAIV;                                            // Сбросить флаги
  DMA0CTL |= DMAEN;                                    // Начать
}

Что-то передача не начинается. (


ЗЫ: Похоже догадался, исходя из "When selecting the trigger, the trigger must not have already occurred, or the transfer does not take place".
Подтвердилось.
Соответственно процедура должна выглядеть примерно так:
Код
// Передать буфер
void vUSARTTransmit(void)
{
  LTX_ON;                                            // светодиод TX зажечь
  USART_WR;                                            // Перейти на передачу
  DMACTL0 = DMA0TSEL__USCIA0TX;                        // UCA0TXIFG на канал 0
  DMA0CTL = DMADT2 | DMASRCINCR0 | DMASRCINCR1 |
            DMADSTBYTE | DMASRCBYTE | DMAIE;        // +1 на источнике, побайтно, прерывание
  DMA0SZ = mbcom.len-1;                                // длина
  DMA0SA = &mbcom.buf[1];                            // Источник
  DMA0DA = (void*)&UCA0TXBUF;                        // Получатель
  //DMAIV;                                            // Сбросить флаги
  DMA0CTL |= DMAEN;                                    // Начать
  UCA0TXBUF = mbcom.buf[0];
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 24 2014, 11:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(SasaVitebsk @ Jan 24 2014, 16:06) *
Борюсь с MSP430 уже месяц.
Думаю будет больно слышать тем, кто их регулярно использует и любит данное семейство, но тем не менее есть объективная реальность на мой взгляд.
Кто-то захочет начать, я скажу что совсем недоволен результатом. Некоторые хомуты не укладываются у меня в голове. И при этом я работаю с 6 семейством! Просто диву даюсь с ребят TI.
Просто вы не до конца разобрались в документаций и поэтому делаете неверные скоропалительные заключения sm.gif
Цитата(SasaVitebsk @ Jan 24 2014, 16:06) *
1. Если по какой-то причине не сброшен флаг в прерывании, то МК зацикливается на данном прерывании. При чём зацикливается накоротко. То есть при этом он вообще не выполняет ни одной команды головы.
Не совсем так. После выхода из обработчика прерывания может быть вызвано более приоритетное прерывание.
Цитата(SasaVitebsk @ Jan 24 2014, 16:06) *
Учитывая, что способ сброса флага абсолютно не расписан - вызвало у меня головную боль. В частности есть IV регистр. Было бы логичным сбрасывать флаг там и где-то именно так и происходит, но для SD24B надо прочитать регистр данных. (
Дык сбрасывайте соответствующий флаг в регистре SD24BIFG.
Цитата(SasaVitebsk @ Jan 24 2014, 16:06) *
2. В таймере при захвате не сбрасывается регистр счёта. Но ведь сброс вручную приводит к очевидной ошибке.
А с какой стати должен сбрасываться регистр счета (TAR)? Вы режимы capture и compare не перепутали? cranky.gif
Цитата(SasaVitebsk @ Jan 24 2014, 16:06) *
3. При останове процессора родным отладчиком может с периферией может происходить что угодно. Например по первому прерыванию USART вижу последний байт пакета или таймер показывает полную чушь и самое главное при продолжении работает не так, как положено. И так далее.
Вновь недопонимание. В MSP430 периферия тактируется отдельно от ядра. Поэтому при останове ядра или переходе его в спячку периферия продолжает работать, независимо от ядра. Это одна из основных фич MSP430, а вовсе не бага! Да, эта фича несколько осложняет отладку с помощью эмулятора. Но нужно просто помнить про нее.
Цитата(SasaVitebsk @ Jan 24 2014, 16:06) *
4. Значительные несоответствия в разных документах. Например в UM на семейство, для таймера обозначаются входы как CCIxA и CCIxB. И ссылаются на документ на конкретный камень. В нём же эти входы обозначены как TAx.0/ TAx.1. В UM описано 4 типа таймеров. В UM на камень с трудом докапываешься какой именно применён. Отличаются объявления в хидерах и документации. Ошибки в целом незначительные и мне сразу понятные, но начинающему, я уверен будет непросто.
Хм. Открываю datasheet MSP430F6736. Раздел SHORT-FORM DESCRIPTION -> Peripherals -> TA0 (1/2/3). В табличках (например, Table 18. TA0 Signal Connections) вижу те же самые наименования входных сигналов этого модуля (TimerA0/1/2/3), что и в User's Guide (CCI1A, CCI1B, CCI2A, CCI2B и т.п.). Чем же вы недовольны?
Цитата(SasaVitebsk @ Jan 24 2014, 16:06) *
5. В целом уровень периферии на порядок слабее аналогичных у других производителей, таких как ST, NXP.

Основная периферия MSP430 была разработана >15 лет назад. С тех пор в TI ее улучшают, стараясь не нарушать совместимости. А вы наверное сравниваете с МК ARM, которые были разработаны менее 10 лет назад? wink.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 24 2014, 12:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Не буду с Вами спорить. Безусловно, что за месяц не возможно глубоко вникнуть. Просто как-то ожидания не оправдались. (
С другой стороны, конечно периферия достаточно простая и понять её можно практически читая описание регистров.
Цитата(rezident @ Jan 24 2014, 14:43) *
А с какой стати должен сбрасываться регистр счета (TAR)? Вы режимы capture и compare не перепутали? cranky.gif

Может я чего не догоняю?
Мне надо замерить длительность входного импульса. Импульс может быть длиннее периода работы таймера.
Я объявляю 2 прерывания: одно на переполнение и одно на сравнение. И читаю 32-ух битное значение 16 младших с регистра захвата 16 старших с ячейки переполнений. Мне бы надо было, чтобы TAR очищался в момент копирования в регистр захвата. А иначе как? Пока я его очищаю вручную, но в этом случае я получаю ошибку в связи с прерыванием.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 24 2014, 14:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(SasaVitebsk @ Jan 24 2014, 17:50) *
Мне бы надо было, чтобы TAR очищался в момент копирования в регистр захвата. А иначе как? Пока я его очищаю вручную, но в этом случае я получаю ошибку в связи с прерыванием.

Зачем сбрасывать TAR? Пускай он себе "тикает" неперерывно. Вы по прерыванию CCRx снимаете 32-х разрядную метку времени: 16 старших бит это программный счетчик переполнений и 16 младших это полученное состояние CCRx. Текущее значение этой метки времени храните в статической или глобальной переменной. Беззнаковая разность двух последовательно считанных временных меток даст вам интервал времени между событиями (в "тиках" таймера).
Но следует учитывать один нюанс: когда частота MCLK близка к тактовой частоте таймера, то можно "пролететь" с задержкой обработки прерывания от переполнения, т.к. оно менее приоритетно, чем прерывание от CCRx. Поэтому в таком случае при считывании в прерывании от захвата значения CCRx нужно проверять его (значение CCRx) на диапазон крайних значений. Если значение CCRx=0x0000 или близко к нему с точностью до периода времени работы обработчика прерывания от переполнения (любое прерывание как минимум 11 тактов MCLK), то следует проверять флаг TAIFG. И если он установлен, то при рассчете метки времени следут добавлять 1 к "верхнему" счетчику переполнений. Но еще раз подчеркиваю, что это исключение может возникнуть при низкой тактовой MCLK - когда значение MCLK не превышает хотя бы на порядок значение тактовой частоты таймера, который в свою очередь тактируется, например, от SMCLK.
P.S. кстати, 32-х разрядный аппаратный capture это пожалуй единственное, что мне не хватает в периферии MSP430 для полного счастья - тут я соглашусь с вами sm.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01303 секунд с 7
ELECTRONIX ©2004-2016