|
Прием передача по USARTу |
|
|
|
Jul 3 2006, 06:38
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Добрый день, помогите пожалуйста, я новичок в этом деле и только начал осваивать AT91SAM7S64-EK Мне дали программу, сделанную на делфи, она отсылает на ком порт данные, в виде 01 07 41 Е2 (4 байта). Мне нужно хотя бы считать их и передать назад. Но чего то не выходит. Принимается только последний байт. Подскажите пожалуйста, где моя ошибка. Пробывал передавать просто левые данные, то есть завел отдельную переменную где ручками уже указал что нужно отпоравлять, и оказалось что больше 4 байт он не отправляет, может я не сбрасываю какой то регистр? или что? И еще, подскажите пожалуйста значение этих строк: AT91C_BASE_US0->US_RCR = 100; AT91C_BASE_US0->US_RTOR = 5; Обязательно их снова вставлять в прерывании, ведь при конфигурации уже указывалось (слизано с примера из инета)?
Вот листинг программы полностью:
#include "Board.h" #include <stdio.h>
#define USART_BAUD_RATE 9600
#define USART_INTERRUPT_LEVEL 6
#define AT91C_US_ASYNC_MODEmy ( AT91C_US_USMODE_NORMAL + \ AT91C_US_NBSTOP_1_BIT + \ AT91C_US_PAR_EVEN + \ AT91C_US_CHRL_8_BITS + \ AT91C_US_CLKS_CLOCK )
char BUFFREAD[100]; int len = 0 ; int flag = 0;
//////////////////////////////////////////////// ////функция разбора данных пришедших на порт//// //////////////////////////////////////////////// void funkc (char data[10]) { AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_US0); flag=0; AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED1); int j=0; while (j<4){ while (!AT91F_US_TxReady(AT91C_BASE_US0)); AT91F_US_PutChar(AT91C_BASE_US0,datal[j]); j++; } AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED1); AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED2); AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED3); AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED4); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0); }
/////////////////////////////////////////// ////////Прерывание USARta////////////////// /////////////////////////////////////////// void Usart_c_irq_handler(void) {
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED2); if (len>3) len=0; BUFFREAD[len]=AT91F_US_GetChar(AT91C_BASE_US0); len++; AT91F_US_ResetRx(AT91C_BASE_US0); AT91C_BASE_US0->US_RCR = 100; AT91C_BASE_US0->US_RTOR = 5; AT91C_BASE_US0->US_CSR=0x00; AT91C_BASE_AIC->AIC_EOICR=0x00; AT91C_BASE_AIC->AIC_ICCR=0x00; flag=1; }
/////////////////////////////////////////// ////////Конфигурирование USARta//////////// /////////////////////////////////////////// void CnfUS ( void) { AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<<AT91C_ID_US0 ) ; AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, ((unsigned int) AT91C_PA5_RXD0 ) | ((unsigned int) AT91C_PA6_TXD0 ) , 0 ); AT91F_US_Configure(AT91C_BASE_US0, MCK , AT91C_US_ASYNC_MODEmy , USART_BAUD_RATE , 0); AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN ; AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL, AT91C_AIC_PRIOR_LOWEST, Usart_c_irq_handler); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0); AT91C_BASE_US0->US_RCR = 100; AT91C_BASE_US0->US_RTOR = 5; AT91F_US_EnableIt(AT91C_BASE_US0, AT91C_US_RXBUFF | AT91C_US_TIMEOUT ); }
//////////////////////////////////////// // Основная функция//////////////////// /////////////////////////////////////// main (void) { //конфигурируем кнопки и светодиоды, порты AT91F_PIOA_CfgPMC(); AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED_MASK); AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED_MASK); //232 CnfUS (); //бесконечный цикл while(1) { AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED4); AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED2); if (flag==1 && len==3/ ) { funkc (BUFFREAD, len); } } }
|
|
|
|
|
 |
Ответов
|
Jul 11 2006, 20:03
|
Группа: Новичок
Сообщений: 10
Регистрация: 11-07-06
Пользователь №: 18 752

|
В продолжение темы. тоже только начал знакомится с IAR. задача в принципе тажа: нужно отправлять\принимать по USARTу. проблема в следущем. у меня на плате используется USART1, а не как в примере USART0, казалось бы остается только переделать инициализацию ком порта и всё... а ничего подобного, не хочет отправлять посылать. меняю просто константы для усарта, PA ... т.е пишу во так: Цитата void CnfUS ( void) { AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<<AT91C_ID_US1 ) ; AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, ((unsigned int) AT91C_PA21_RXD1 ) | ((unsigned int) AT91C_PA22_TXD1 ) , 0 ); AT91F_US_Configure(AT91C_BASE_US1, MCK , AT91C_US_ASYNC_MODEmy , USART_BAUD_RATE , 0); AT91C_BASE_US1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN ; AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US1, USART_INTERRUPT_LEVEL, AT91C_AIC_PRIOR_LOWEST, Usart_c_irq_handler); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1); AT91C_BASE_US1->US_RCR = 100; AT91C_BASE_US1->US_RTOR = 5; AT91F_US_EnableIt(AT91C_BASE_US1, AT91C_US_RXBUFF | AT91C_US_TIMEOUT ); } и не работает.... т.е компилится выполняется... но молчит, на второй конец ком порта пробовал "вешать" ComTest, прожка такая, принимает и отправляет байты. А вот еще, на той плате впринципе есть еще и USART0 так там все нормально (но нужен именно USART1) в чем может быть проблема?
|
|
|
|
|
Jul 12 2006, 03:47
|
Частый гость
 
Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528

|
Нууууу ....... US1, насколько я понимаю, - это 485 .... Его у меня нет на плате  Поэтому отвечу с точки зрения новичка не работавшего с ним )) Мне кажется в конфигурировании нужно еще и другую скорость указать. В конфигурировании AT91C_US_ASYNC_MODEmy вместо AT91C_US_USMODE_NORMAL поставил бы AT91C_US_USMODE_RS485. И эту программу я еще дополнил двумя строчками, чтобы пользоваться DMA(PDC): концовка конфигурирования AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0); AT91F_PDC_Open (AT91C_BASE_PDC_US0); AT91C_BASE_US0->US_RPR = (unsigned int) BUFFREAD; AT91C_BASE_US0->US_RCR = 100; AT91C_BASE_US0->US_RTOR = 16; AT91F_US_EnableIt(AT91C_BASE_US0, AT91C_US_RXBUFF | AT91C_US_TIMEOUT ); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS); и пользуешься потом SendFrame .... Ну а так .... фиг знает ... "бывалых" хотелось бы тоже послушать ... так как самому интересно ....
|
|
|
|
Сообщений в этой теме
Timofey Прием передача по USARTу Jul 3 2006, 06:38 beer_warrior RTOR - Receive TimeOut Register - устанавлиавет та... Jul 3 2006, 07:44 Timofey Цитата(beer_warrior @ Jul 3 2006, 13:44) ... Jul 3 2006, 08:24 Zarya такссс... вобщем:
скажите плиз, чем должна отличат... Jul 12 2006, 06:45 Zarya Вобщем, вот такая настройка ни к чему не привела..... Jul 12 2006, 07:14 beer_warrior Цитатаскажите плиз, чем должна отличаться инициали... Jul 12 2006, 08:28 Timofey Цитата(beer_warrior @ Jul 12 2006, 14:28)... Jul 12 2006, 09:20 Zarya если честно, я даже не знаю как и ответить
я пыт... Jul 12 2006, 08:48 beer_warrior Что сказать - USART вызывает одно прерывание на вс... Jul 12 2006, 09:56 Timofey Цитата(beer_warrior @ Jul 12 2006, 15:56)... Jul 12 2006, 10:25  VladislavS Обычно если все правильно и не работает, то забыл ... Jul 12 2006, 10:56 SpiritDance что Это?
Код AT91F_AIC_ConfigureIt (AT91C_BASE... Jul 12 2006, 14:00 Timofey Цитата(SpiritDance @ Jul 12 2006, 20:00) ... Jul 12 2006, 14:25 SpiritDance Timofey
Вдумчиво прочитайте даташит. Раздел AIC, в... Jul 12 2006, 14:42 SpiritDance Сам посмотрел еше раз. Для внутренней переферии в ... Jul 12 2006, 15:03 beer_warrior Цитатаа ваш обработчик и вправду работает? Судя по... Jul 12 2006, 15:15 Zarya а можете поделиться ссылочками на доки по USARTу? ... Jul 13 2006, 03:04 beer_warrior Цитатаа можете поделиться ссылочками на доки по US... Jul 13 2006, 05:34 Zarya Для начала всем огромное спасибо, по крайней мере ... Jul 13 2006, 19:20 aaarrr Zarya, проверьте, привильно ли установлена четност... Jul 13 2006, 20:02 Zarya Еще один вопрос назрел
Принимаю данные вот так:
К... Jul 18 2006, 10:58 aaarrr Цитата(Zarya @ Jul 18 2006, 14:58) Еще од... Jul 18 2006, 11:42 Zarya aaarrr, насчет переполнения массива, вы впринципе ... Jul 18 2006, 12:04 vet Цитата(Zarya @ Jul 18 2006, 16:04) P.S. д... Jul 18 2006, 13:29 Zarya по поводу int и char извиняюсь... действительно, н... Jul 18 2006, 12:24 aaarrr Цитата(Zarya @ Jul 18 2006, 16:04) да, на... Jul 18 2006, 12:37 Zarya aaarrr, спасибо за попытки помочь
Я очень-очень с... Jul 18 2006, 13:45 Redaer Можно тоже вопрос?
Через USART1 пытаюсь организова... Jul 20 2006, 08:50 aaarrr Цитата(Redaer @ Jul 20 2006, 12:50) З.Ы. ... Jul 20 2006, 08:59 beer_warrior ЦитатаИспользую обработчик прерываний, который пре... Jul 20 2006, 09:49 Redaer Пытаюсь прогать в IAR...
Прочитал всю тему и возни... Jul 20 2006, 10:56 beer_warrior Ну что вам сказать... Весь код присутвует в ветке.... Jul 20 2006, 11:29
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|