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

 
 
> Прием передача по USARTу
Timofey
сообщение Jul 3 2006, 06:38
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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);

}
}

}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
beer_warrior
сообщение Jul 12 2006, 15:15
Сообщение #2


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

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



Цитата
а ваш обработчик и вправду работает? Судя по всему под IAR.
Никак не пойму чем он отличается от обычной функции и как из него выход организуется?
И как вы обходитесь без записи чего-либо в EIOCR? Я тут забыл как-то про него, очень долго голова болела почему прерывание один раз только вызывается.

Нет я сторонник gcc, проcто есть такая неявная фича в Cstartup.S smile.gif
Код
//*------------------------------------------------------------------------------
//*- Function             : IRQ_Handler_Entry
//*- Treatments           : IRQ Controller Interrupt Handler.
//*- Called Functions     : AIC_IVR[interrupt]
//*------------------------------------------------------------------------------*/
        .global IRQ_Handler_Entry
        .func   IRQ_Handler_Entry

IRQ_Handler_Entry:

/*- Manage Exception Entry  */
/*- Adjust and save LR_irq in IRQ stack  */
            sub         lr, lr, #4
            stmfd       sp!, {lr}

/*- Save SPSR need to be saved for nested interrupt */
            mrs         r14, SPSR
            stmfd       sp!, {r14}

/*- Save and r0 in IRQ stack  */
            stmfd       sp!, {r0}

/*- Write in the IVR to support Protect Mode  */
/*- No effect in Normal Mode  */
/*- De-assert the NIRQ and clear the source in Protect Mode */
        ldr         r14, =AT91C_BASE_AIC
        ldr         r0 , [r14, #AIC_IVR]
        str         r14, [r14, #AIC_IVR]

/*- Enable Interrupt and Switch in Supervisor Mode */
            msr         CPSR_c, #ARM_MODE_SVC

/*- Save scratch/used registers and LR in User Stack */
            stmfd       sp!, { r1-r3, r12, r14}

/*- Branch to the routine pointed by the AIC_IVR  */
            mov         r14, pc
            bx          r0
/*- Restore scratch/used registers and LR from User Stack*/
            ldmia       sp!, { r1-r3, r12, r14}

/*- Disable Interrupt and switch back in IRQ mode */
            msr         CPSR_c, #I_BIT | ARM_MODE_IRQ
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/*- Mark the End of Interrupt on the AIC */
           ldr         r14, =AT91C_BASE_AIC
            str         r14, [r14, #AIC_EOICR]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

/*- Restore SPSR_irq and r0 from IRQ stack */
            ldmia       sp!, {r0}

/*- Restore SPSR_irq and r0 from IRQ stack */
            ldmia       sp!, {r14}
            msr         SPSR_cxsf, r14

/*- Restore adjusted  LR_irq from IRQ stack directly in the PC */
            ldmia       sp!, {pc}^
    
        .size   IRQ_Handler_Entry, . - IRQ_Handler_Entry
        .endfunc

Чтобы окончательно закрыть вопрос привожу init
Код
void InitUSART(AT91S_USART *pUSART, DWORD imode, DWORD baudrate)
{
//--------------------------------------------------------------------------
//clear all
//--------------------------------------------------------------------------
pUSART->US_CR =    AT91C_US_RSTRX    |            // Reset Receiver
                AT91C_US_RSTTX    |            // Reset Transmitterp
                AT91C_US_RXDIS    |            // Receiver Disable
                AT91C_US_TXDIS;            // Transmitter Disable
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_RXTDIS |AT91C_PDC_TXTDIS; //PDC off
AT91C_BASE_US1->US_TCR = 0;
AT91C_BASE_US1->US_RCR = 0;
//--------------------------------------------------------------------------
//configure interrupt
//--------------------------------------------------------------------------
AT91F_AIC_ConfigureIt    (AT91C_BASE_AIC,             //base adr
                        AT91C_ID_US1,                //int number
                        AT91C_AIC_PRIOR_HIGHEST - 1,//priority
                        //AT91C_AIC_PRIOR_HIGHEST,    //priority
                        3,                            //int source type
                        USARTInterrupt                //handler
                        );            
//--------------------------------------------------------------------------                        
//USART on
//--------------------------------------------------------------------------
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,(1 << AT91C_ID_US1));
//--------------------------------------------------------------------------
//configure interrupt
//--------------------------------------------------------------------------
pUSART->US_IDR = 0xFFFFFFFF;
pUSART->US_IER = imode;
//--------------------------------------------------------------------------
//set baudrate
//--------------------------------------------------------------------------
AT91F_US_SetBaudrate(pUSART,48054857,baudrate);
//--------------------------------------------------------------------------
//set  timeouts
//--------------------------------------------------------------------------
pUSART->US_TTGR = 20;
pUSART->US_RTOR = 200;
//--------------------------------------------------------------------------
//set mode
//--------------------------------------------------------------------------
pUSART->US_MR = AT91C_US_USMODE_NORMAL    |    // Normal Mode
                AT91C_US_CLKS_CLOCK       |    // Clock = MCK
                AT91C_US_CHRL_8_BITS       |    // 8-bit Data
                AT91C_US_PAR_NONE        |    // No Parity
                AT91C_US_NBSTOP_2_BIT;        // 1 Stop Bit
//--------------------------------------------------------------------------
//Init DMA
//--------------------------------------------------------------------------
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_RXTDIS;
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_TXTDIS;
//active buffer (start from buf 0)
act_buf = 0;                            
//first RX buffer
pUSART->US_RPR = (DWORD)&rx_buf[0];    //set pointer as register value
pUSART->US_RCR = sizeof(BUF);        //base buffer size
// enable the RX and TX PDC transfer requests
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_RXTEN;
AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_TXTEN;
//--------------------------------------------------------------------------
//enable device
//--------------------------------------------------------------------------
pUSART->US_CR =    AT91C_US_RXEN | AT91C_US_TXEN;            
//--------------------------------------------------------------------------
//enable interrupt
//--------------------------------------------------------------------------
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
}

BUF объявлен typedefом как массив заданной размерности.
rx_buf как массив из двух BUF


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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 11 2006, 20:03
|- - Timofey   Нууууу ....... US1, насколько я понимаю, - это 485...   Jul 12 2006, 03:47
|- - Timofey   Да! Там же еще нужно сконфигурировать одну ног...   Jul 12 2006, 04:04
- - 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
- - 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


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 02:14
Рейтинг@Mail.ru


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