Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прием DMX пакетов по UART на at91sam7s128
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
vutang
Доброго времени суток.
Вобщем проблема у меня такая. Не знаю как отследить Break протокола DMX-512. Если кто знает как, помогите.
M_Andrey
Всегда, еще с АВР-ок, определял по Frame Error.
vutang
Т.е. мне нужно постоянно читать и если frame без ошибок, то это то что мне нужно?
M_Andrey
УАРТ вешаем на прерывание и по приему с ошибкой FE разрешаем сохранение последующих байт, я еще проверяю этот и следующий байт должны быть = 0, далее сохраняем столько сколько требуется и опять переходим на ожидание следующего FE.
vutang
Вот мой код
И чего-то он не правильно работает...Данные в массиве появляются в рандомных местах
while(1)
{
unsigned int status;
status = m_pUSART0->US_CSR;
m=0;

m_pUSART0->US_CR = AT91C_US_RSTSTA; //сброс битов Frame , Pare и т.д
if((m_pUSART0->US_CSR&AT91C_US_FRAME)==0) //Если Frame=0, то
// стоповых битов в низком уровне не детектировано
{
while(m<513)
{
input1=read_char_USART0(); // Читаем с UART
buff2[m]=input1; // Запись в массив
m++;
}
}
}
aaarrr
Не нужно пытаться ловить break по Framing Error - у USART'а для этого есть событие RXBRK. И еррату почитайте.
vutang
Ну если вы на AVR делали, то напишите что хоть в алгоритме неправильно.


Ок aaarrr, я так пробовал и у меня тоже самое получалось, но сейчас еще раз попробую.

unsigned int status;
status = m_pUSART0->US_CSR;
m=0;

m_pUSART0->US_CR = AT91C_US_RSTSTA; //ñáðîñ áèòîâ RXBRK , Pare è ò.ä
if((m_pUSART0->US_CSR&AT91C_US_RXBRK)!=0) //Åñëè RXBRK=1, òî íàéäåí îáðûâ ïðèåìà ò.å. Break
{
input1=read_char_USART0();
if(input1==0)
{
input1=read_char_USART0();
if(input1==0)
{
while(m<513)
{
input1=read_char_USART0(); // ×èòàåì ñ UART
buff2[m]=input1; // Çàïèñü â ìàññèâ
m++;
}
}
}

}



Ну вот как-то так.... и такая же ситуация
aaarrr
Цитата(vutang @ Dec 10 2009, 14:13) *
Ну вот как-то так.... и такая же ситуация


Замечательно:
Код
      m_pUSART0->US_CR = AT91C_US_RSTSTA;  // Сначала сбросили статусы
      if((m_pUSART0->US_CSR&AT91C_US_RXBRK)!=0) // А теперь пытаемся их проверить
vutang
Увы....но даже если убрать m_pUSART0->US_CR = AT91C_US_RSTSTA;
То ничего не меняется((( Данные принимаются, и в массиве записываются по порядку но начало записи всегда разное.(
aaarrr
Цитата(vutang @ Dec 10 2009, 14:26) *
Увы....но даже если убрать m_pUSART0->US_CR = AT91C_US_RSTSTA;
То ничего не меняется(((

Да не надо убирать (как тогда статусы сбрасываться будут?), надо сделать грамотно, т.е.:
1. Прочитать один абзац о работе Receive Break (31.6.3.11). Обратить внимание на то, что на один break RXBRK генерируется два раза.
2. Почитать еррату. Убедится, что в timeguard не пишется 0.
3. Воспользоваться полученными знаниями для написания программы.
vutang
Спасибо всем кто давал советы. Все заработало вот так:


m_pUSART0->US_CR = AT91C_US_RSTSTA;
while(!(m_pUSART0->US_CSR&AT91C_US_RXBRK)==1)
{
while(!(m_pUSART0->US_CSR&AT91C_US_RXBRK)==1)
{
count++;
if(count==2420)
break;
}
if(count==2420)
break;
while(m<40)
{
Delay(55*4);
input1=read_char_USART0();
buff2[m]=input1;
m++;
}
aaarrr
Цитата(vutang @ Dec 10 2009, 15:21) *
Все заработало вот так

Случайно. Такой код работать не должен.
vutang
Но он работает)
sergeeff
Код, построенный с программными задержками Delay(55*4) вызывает большие сомнения.
aaarrr
Цитата(vutang @ Dec 15 2009, 09:53) *
Но он работает)

Это его не оправдывает нисколько.
vutang
Цитата(sergeeff @ Dec 15 2009, 10:18) *
Код, построенный с программными задержками Delay(55*4) вызывает большие сомнения.


Delay(55*4) это задержки между димерами = 4 мкс, но вообще и без нее тоже работает.
vmp
Цитата(aaarrr @ Dec 10 2009, 13:56) *
Не нужно пытаться ловить break по Framing Error - у USART'а для этого есть событие RXBRK. И еррату почитайте.

Еррату читать всегда полезно, особенно свежую. smile.gif
В даташите ревизии J, выложенном на сайте атмела 15 декабря добавлена errata USART: RXBRK Flag error. Там описан случай, когда вместо RXBRK устанавливается framing error.

P.S. Сам с этим случаем не сталкивался, так что не могу судить, подходит ли она под описанный случай или нет.
aaarrr
Цитата(vmp @ Dec 16 2009, 18:17) *
Еррату читать всегда полезно, особенно свежую. smile.gif

Сообщения в топике тоже.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.