|
|
  |
UART через PDC в AT91RM9200 |
|
|
|
Oct 23 2007, 04:49
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 29-05-07
Пользователь №: 28 025

|
Привет всем.
Есть платка от аргуссофта AS9200. В datasheet на микроконтроллер написано, что предусмотрен режим ПДП для работы с последовательным портом. Также написано что формат обмена PDC может быть разным: «Depending on the type of transfer (byte, half-word or word), the memory pointer is incremented by 1, 2 or 4, respectively for peripheral transfers…».
Настраивал UART в 9-битный режим через PDC и контроллер завис. Однако, при настройке в восьмибитный режим через ПДП - передача работала, равно как и при настройке в 9-битный режим без ПДП.
В чем может быть трабл? По сколько битов PDC для UART берет из памяти за одну транзакцию?
|
|
|
|
|
Oct 23 2007, 16:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(aaarrr @ Oct 23 2007, 20:21)  Режим с девятью битами данных, несколько экзотичный. Включается битом MODE9 в USART_MR. О работе PDC этом режиме в документации упомянуть забыли, видимо посчитав это очевидным. Да вот вычитал у Atmel (doc1354.pdf): p.105 Each USART channel is closely connected to a corresponding Peripheral Data Controller channel. One is dedicated to the receiver. The other is dedicated to the transmitter. Note: The PDC is disabled if 9-bit character length is selected (MODE9 = 1) in US_MR.
|
|
|
|
|
Oct 23 2007, 17:18
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(sergeeff @ Oct 23 2007, 21:01)  Про старые процессоры - это правильно. Но ведь у спросившего коллеги в этом режиме PDC тоже не работает? Поэтому, мне думается, что mode9 с pdc и в новых процессорах может не дружить. Я проверял на SAM7X - работает. PDC у него точно такой же, как и у RM9200. И предупреждений, подобных процитированному Вами, в документации ни у того, ни у другого нет. Коллега Renik пишет: Цитата Настраивал UART в 9-битный режим через PDC и контроллер завис. Завесить контроллер при помощи PDC, по-моему, можно только записав с его помощью данные не по тому адресу, т.е. при неправильной конфигурации PDC.
|
|
|
|
|
Oct 24 2007, 04:35
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 29-05-07
Пользователь №: 28 025

|
Цитата(aaarrr @ Oct 23 2007, 21:18)  Я проверял на SAM7X - работает. PDC у него точно такой же, как и у RM9200. И предупреждений, подобных процитированному Вами, в документации ни у того, ни у другого нет. Я понимаю что PDC в 9-битном режиме UART должен брать по 2 байта. НО что-то не работает пока.( Можно взглянуть на работающую программу?
|
|
|
|
|
Nov 7 2007, 13:37
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 29-05-07
Пользователь №: 28 025

|
Вот листинг программы которая по идее должна посылать в порт через ПДП 9-битные символы, но не работает.(( Цитата // ----- PIOB #define PIOB_PER *(unsigned int *)0xFFFFF600 #define PIOB_PDR *(unsigned int *)0xFFFFF604 #define PIOB_OER *(unsigned int *)0xFFFFF610 #define PIOB_SODR *(unsigned int *)0xFFFFF630 #define PIOB_CODR *(unsigned int *)0xFFFFF634 #define PIOB_MDDR *(unsigned int *)0xFFFFF654
#define PMC_PCER *(unsigned int *)0xFFFFFC10
// ----- UART1 #define US_CR *(unsigned int *)0xFFFC4000 #define US_MR *(unsigned int *)0xFFFC4004 #define US_CSR *(unsigned int *)0xFFFC4014 #define US_BRGR *(unsigned int *)0xFFFC4020 #define US_IDR *(unsigned int *)0xFFFC400C
#define PDC_TPR *(unsigned int *)0xFFFC4108 #define PDC_TCR *(unsigned int *)0xFFFC410C #define PDC_PTCR *(unsigned int *)0xFFFC4120
unsigned short int buffer;
void main() { PIOB_OER = 0xFFFFFFFF; PIOB_MDDR = 0xFFFFFFFF; PMC_PCER = 0xfffffffd; PIOB_PDR = 0xFFFFFFF0;
US_MR = 0x000208C0; // Normal mode, 1 stop bit, no parity, async mode, 9 bits.
US_IDR = 0xffffffff; // Disable all USART interrupts.
US_BRGR = 42;
US_CR = 0x000000a0; // Disable receiver, disable transmitter. US_CR = 0x0000010c; // Reset status bits, reset rx/tx. US_CR = 0x00000050; // Enable receiver, enable transmitter.
buffer = 0x155; PDC_PTCR = 0x100;
while(1){ PDC_TPR = (unsigned int) &buffer; PDC_TCR = 0x001;
for (int i = 1; i<5535; i++){ PIOB_SODR = 0x01; //TEST_PIN; PIOB_CODR = 0x01; //TEST_PIN; } } } При смене режима работы на 8-битный режим, то есть при замене строчки "US_MR = 0x000208C0;" на "US_MR = 0x000008C0;" посылки в порт идут... В чем может быть дело?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|