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

 
 
> Импульс на TXD при включении USART, AT91SAM7S
kichkine
сообщение Mar 6 2007, 17:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 3-11-06
Из: Kiev
Пользователь №: 21 933



Включаю USART следующей последовательнстью:

*(AT91C_PIOA_ASR) = (1 << 5) | (1 << 6);
*(AT91C_PIOA_PDR) = (1 << 5) | (1 << 6);
*(AT91C_PIOA_PPUDR) = (1 << 5) | (1 << 6);
*(AT91C_PMC_PCER) = 1 << AT91C_ID_US0;

TXD все время имеет высокий уровень, кроме момента выполнения последней строчки. Там наблюдается "отрицательный" импульс 90 мкс. Откуда он там?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
beer_warrior
сообщение Mar 6 2007, 17:22
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Подозреваю, что переходные процессы. Именно в этот момент включается сам девайс.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
vmp
сообщение Mar 6 2007, 17:37
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Цитата(kichkine @ Mar 6 2007, 17:07) *
TXD все время имеет высокий уровень, кроме момента выполнения последней строчки. Там наблюдается "отрицательный" импульс 90 мкс. Откуда он там?


Проблема в чем? Почему импульс или как с ним бороться?
Есть "как бороться", то посоветую сначала включать USART, а затем подключать его к выводу микросхемы (через PIO_ASR/PIO_BSR/PIO_PDR).
Go to the top of the page
 
+Quote Post
kichkine
сообщение Mar 6 2007, 18:31
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 3-11-06
Из: Kiev
Пользователь №: 21 933



Цитата(vmp @ Mar 6 2007, 16:37) *
... сначала включать USART, а затем подключать его к выводу микросхемы...


Получается, что регистр PMC_PCER надо программировать до программирования US_CR, тогда мусора нет. У меня получилось вот так:
Код
    
p->US_MR = (4 << 9) | (3 << 6);    /*Normal mode, no parity*/
p->US_IER = AT91C_US_RXRDY; /*  */
p->US_BRGR = 30;    /*  */
*(AT91C_PMC_PCER) = 1 << AT91C_ID_US0;
p->US_CR = AT91C_US_RSTSTA | AT91C_US_TXEN | AT91C_US_RXEN;

*(AT91C_PIOA_ASR) = (1 << 5) | (1 << 6);
*(AT91C_PIOA_PDR) = (1 << 5) | (1 << 6);
*(AT91C_PIOA_PPUDR) = (1 << 5) | (1 << 6);
Go to the top of the page
 
+Quote Post
Hexxx
сообщение Mar 20 2007, 13:05
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 29-03-06
Пользователь №: 15 592



Я пользуюсь вот таким вот кодом:
Код
void uart0Init(void)
{
    // enable the clock of UART0
    AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0);
    
    // enable uart pins on PIO
    *AT91C_PIOA_PDR = AT91C_PA5_RXD0 | AT91C_PA6_TXD0;

    // disable I/O pullup
    *AT91C_PIOA_PPUDR = AT91C_PA5_RXD0;
    
    // reset the UART
    pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS |AT91C_US_TXDIS;
    // set serial line mode
    pUSART->US_MR =    AT91C_US_USMODE_NORMAL |// Normal Mode
                       AT91C_US_CLKS_CLOCK |   // Clock = MCK
                       AT91C_US_CHRL_8_BITS |
                       AT91C_US_PAR_NONE |
                       AT91C_US_NBSTOP_1_BIT;                  
     // set the baud rate
     pUSART->US_BRGR = AT91F_US_Baudrate(MCK,BR);
     // enable the uart
     pUSART->US_CR = AT91C_US_RXEN | AT91C_US_TXEN | AT91C_US_DTREN;
}


Код работает. Получил я его опытным путем перебирая разные чужие примеры. Вопрос у меня в следующем. Читаю доку по UART в AT91 и часть кода:
Код
    // reset the UART
    pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS |AT91C_US_TXDIS;
    // set serial line mode
    pUSART->US_MR =    AT91C_US_USMODE_NORMAL |// Normal Mode
                       AT91C_US_CLKS_CLOCK |   // Clock = MCK
                       AT91C_US_CHRL_8_BITS |
                       AT91C_US_PAR_NONE |
                       AT91C_US_NBSTOP_1_BIT;                  
     // set the baud rate
     pUSART->US_BRGR = AT91F_US_Baudrate(MCK,BR);
     // enable the uart
     pUSART->US_CR = AT91C_US_RXEN | AT91C_US_TXEN | AT91C_US_DTREN;

мне полностью понятна. Но откуда я должен был догадаться о том что вначале надо делать:
Код
    // enable the clock of UART0
    AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0);
    
    // enable uart pins on PIO
    *AT91C_PIOA_PDR = AT91C_PA5_RXD0 | AT91C_PA6_TXD0;

    // disable I/O pullup
    *AT91C_PIOA_PPUDR = AT91C_PA5_RXD0;

Где-то может есть какие-то application notes про UART или еще чего-то?
p.s. только начинаю работать с AT91 вопросов больше чем когда-либо cranky.gif

Сообщение отредактировал Hexxx - Mar 20 2007, 13:06
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Mar 20 2007, 13:24
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Это все описанно в подразделе Product Dependincies раздела USART. smile.gif


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Hexxx
сообщение Mar 23 2007, 12:29
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 29-03-06
Пользователь №: 15 592



Я ща пытаюсь написать функцию чтения с порта с выходом по таймауту. Ща седелал ее через RTTC. Но как я догадываюсь у UART есть возможность детектить таймаут самостоятельно. Расскажите плиз как пользоваться US_RTOR.

Цитата
This function allows an idle condition on the RXD line to be detected. The maximum delay for which the USART should wait for a new character to arrive while the RXD line is inactive (high level) is programmed in US_RTOR (Receiver Time-out). When this register is set to 0, no time-out is detected. Otherwise, the receiver waits for a first character and then initializes a counter, which is decremented at each bit period and reloaded at each byte reception. When the counter reaches 0, the TIMEOUT bit in US_CSR is set. The user can restart the wait for a first character with the STTTO (Start Time-out) bit in US_CR.

Calculation of time-out duration:
Duration = US_RTOR Value × 4 × Bit Period


Как я понимаю в US_RTOR выставляется время через которое считается что произошел таймаут передачи. Типа если ставлю 200 мсек, то если символы будут приходить поочереди с задержкой в 199 мсек - флаг US_CSR не выставится. Как только придет символ с задержкой >=200 - выставится. Правильно?
Объясните плиз как высчитать задерку. Мне формула Duration = US_RTOR Value × 4 × Bit Period непонятна. Bit period - это baud rate? Правильно я понимаю что если US_RTOR=1 и скорость порта 9600 то задержка между символами не более 1 * 4 * (1/9600) ~ 0,0004 секунды?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 23 2007, 14:28
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Как я понимаю в US_RTOR выставляется время через которое считается что произошел таймаут передачи. Типа если ставлю 200 мсек, то если символы будут приходить поочереди с задержкой в 199 мсек - флаг US_CSR не выставится. Как только придет символ с задержкой >=200 - выставится. Правильно?

Да.
Цитата
Объясните плиз как высчитать задерку. Мне формула Duration = US_RTOR Value × 4 × Bit Period непонятна. Bit period - это baud rate? Правильно я понимаю что если US_RTOR=1 и скорость порта 9600 то задержка между символами не более 1 * 4 * (1/9600) ~ 0,0004 секунды?

Нет. Bit Period это длительность одного бита - т.е. случае 8N1 - 1/10 байта (старт + стоп + собственно байт).


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Hexxx
сообщение Mar 23 2007, 15:11
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 29-03-06
Пользователь №: 15 592



Так а как мне определить время в секундах? Точнее что записать в регистр чтобы ждало к примеру одну секунду при baud rate = 9600.

Сообщение отредактировал Hexxx - Mar 23 2007, 16:00
Go to the top of the page
 
+Quote Post

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

 


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


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