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

 
 
> at91sam7s64 + USART... как правильно настроить?, док вроед прочитал но не работает...
Mozart
сообщение Aug 27 2007, 14:36
Сообщение #1


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



Код
volatile AT91PS_PIO    pPIO = AT91C_BASE_PIOA;
pPIO->PIO_ASR |= (1 << 6);
pPIO->PIO_OER = (1 << 6);

volatile AT91PS_USART pUS1 = AT91C_BASE_US1;
    
    pUS1->US_MR |= AT91C_US_CHRL            /*8 bits*/
                  |AT91C_US_PAR_NONE        /*no parity*/
                  |AT91C_US_NBSTOP_2_BIT    /*2 stop bits*/
                  |AT91C_US_OVER            /*8x oversampling*/
                  |AT91C_US_INACK;

    pUS1->US_CR &= ~AT91_US_TXDIS;
    pUS1->US_CR |= AT91_US_TXEN;
    
    //pUS1->US_BRGR = 60;
    pUS1->US_BRGR = 30;

настроил так скажите пжлста так ли, а то совсем закопался...


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
a3r3
сообщение Aug 27 2007, 15:41
Сообщение #2


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

Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947



Цитата
pPIO->PIO_ASR |= (1 << 6);

Читать write-only регистры не стоит.

Записью в PIO_PDR нужно запретить режим PIO на выводах USART.
Go to the top of the page
 
+Quote Post
Mozart
сообщение Aug 28 2007, 16:17
Сообщение #3


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



Цитата(a3r3 @ Aug 27 2007, 19:41) *
Читать write-only регистры не стоит.

всмысле читать регистры??
а очередность инициализации важна?


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
a3r3
сообщение Aug 28 2007, 17:24
Сообщение #4


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

Группа: Новичок
Сообщений: 84
Регистрация: 24-05-07
Пользователь №: 27 947



Цитата(Mozart @ Aug 28 2007, 20:17) *
всмысле читать регистры??

Это:
Код
pPIO->PIO_ASR |= (1 << 6);

Чтение-модификация-запись write-only регистра.

Цитата(Mozart @ Aug 28 2007, 20:17) *
а очередность инициализации важна?

Для конечного результата нет, а в процессе лучше быть аккуратнее во избежание конфликтов на выходах. Впрочем, даже при возникновении такого конфликта ничего катастрофического не случится.
Go to the top of the page
 
+Quote Post
Mozart
сообщение Aug 28 2007, 17:28
Сообщение #5


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



Цитата
Это:
pPIO->PIO_ASR |= (1 << 6);

Чтение-модификация-запись write-only регистра.

я почему-то над этим никогда не задумывался... а ведь действительно... спасибо буду знать...


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
AlexBoy
сообщение Aug 28 2007, 18:07
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 205
Регистрация: 19-12-05
Из: Kiev
Пользователь №: 12 394



Цитата(Mozart @ Aug 28 2007, 19:17) *
всмысле читать регистры??
а очередность инициализации важна?


Попробуйте так:
Код
volatile AT91PS_PIO   pPIO = AT91C_BASE_PIOA;
volatile AT91PS_USART pUS  = AT91C_BASE_US1;

pUS->US_IDR = 0xffffffff;
pUS->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1UL << AT91C_ID_US1);
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1UL << AT91C_ID_PIOA);

pPIO->PIO_PDR = AT91C_PA21_RXD1 | AT91C_PA22_TXD1;
pPIO->PIO_ASR = AT91C_PA21_RXD1 | AT91C_PA22_TXD1;
pPIO->PIO_OER = AT91C_PA22_TXD1;
pPIO->PIO_ODR = AT91C_PA21_RXD1;
pPIO->PIO_PPUDR = AT91C_PA21_RXD1;

// настройка скорости передачи
baud_val = AT91C_MASTER_CLOCK/baud;
if ((baud_val&0x0f)>=8) baud_val += 16;
pUS->US_BRGR = (baud_val>>4);

pUS->US_MR = AT91C_US_ASYNC_MODE;
pUS->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
Go to the top of the page
 
+Quote Post
Mozart
сообщение Aug 29 2007, 11:43
Сообщение #7


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



что-то нифига не получается смотрел осцилом ничего нету... записвыаю чар для передачи в регистр US_THR
Код
unsigned char ch;
ch = 0xFF;
pUS1->US_THR = (ch & 0x1FF);
for(j = 0; j < 10000; j++);

использую доску от атмеля at91sam7s-ek может какие-то джамперы нужно поставить? я уже весь мозг сломал...


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 29 2007, 15:52
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Mozart @ Aug 29 2007, 14:43) *
что-то нифига не получается смотрел осцилом ничего нету...
Тактирование UART включили (AT91C_BASE_PMC->PMC_PCER =(1<<AT91C_ID_US0)wink.gif?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Mozart
сообщение Aug 29 2007, 16:46
Сообщение #9


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



Цитата(Сергей Борщ @ Aug 29 2007, 19:52) *
Тактирование UART включили (AT91C_BASE_PMC->PMC_PCER =(1<<AT91C_ID_US0)wink.gif?

да включил...

меня почему-то сейчас клинануло... а нужно ли подавать сигналы на RTS, CTS, DTR, и прочее??? или они автоматом???

Сообщение отредактировал Mozart - Aug 29 2007, 16:50


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
Mozart
сообщение Sep 5 2007, 07:47
Сообщение #10


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



люди, что делаю не так??? вот код начальной инициализации...
Код
void LowLevelInit(void)
{
    int            i;
    AT91PS_PMC     pPMC = AT91C_BASE_PMC;

    //* Set Flash Wait sate
    //  Single Cycle Access at Up to 30 MHz, or 40
    //  if MCK = 48 054 841 I have 50 Cycle for 1 usecond ( flied MC_FMR->FMCN
    //  result: AT91C_MC_FMR = 0x00320100  (MC Flash Mode Register)
    AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 << 16)) | AT91C_MC_FWS_1FWS;

    //* Watchdog Disable
    // result: AT91C_WDTC_WDMR = 0x00008000  (Watchdog Mode Register)
    AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;

    //* Set MCK at 48 054 841
    // 1 Enabling the Main Oscillator:
    // SCK = 1/32768 = 30.51 uSecond
    // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
    // result: AT91C_CKGR_MOR = 0x00000601  (Main Oscillator Register)

    pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 << 8) | AT91C_CKGR_MOSCEN ));
    
    
    // Wait the startup time
    while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
    
    // PMC Clock Generator PLL Register setup
    //
    // The following settings are used:  DIV = 14
    //                                   MUL = 72
    //                                   PLLCOUNT = 10
    //
    // Main Clock (MAINCK from crystal oscillator) = 18432000 hz (see AT91SAM7-EK schematic)
    // MAINCK / DIV = 18432000/14 = 1316571 hz
    // PLLCK = 1316571 * (MUL + 1) = 1316571 * (72 + 1) = 1316571 * 73 = 96109683 hz
    //
    // PLLCOUNT = number of slow clock cycles before the LOCK bit is set
    //            in PMC_SR after CKGR_PLLR is written.
    //
    // PLLCOUNT = 10
    //
    // OUT = 0 (not used)
    // result: AT91C_CKGR_PLLR = 0x00000000480A0E   (PLL Register)
    
    pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 14) |
                      (AT91C_CKGR_PLLCOUNT & (10<<8)) |
                      (AT91C_CKGR_MUL & (72<<16)));


    // Wait the startup time (until PMC Status register LOCK bit is set)

    while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
    
    // PMC Master Clock (MCK) Register setup
    //
    // CSS  = 3  (PLLCK clock selected)
    //
    // PRES = 1  (MCK = PLLCK / 2) = 96109683/2 = 48054841 hz
    //
    // Note: Master Clock  MCK = 48054841 hz  (this is the CPU clock speed)
    // result:  AT91C_PMC_MCKR = 0x00000007  (Master Clock Register)
    pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_2;
    //pPMC->PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK;    //18432000 HZ
    
    // Set up the default interrupts handler vectors
    
    AT91C_BASE_AIC->AIC_IECR = 0x0;
    AT91C_BASE_AIC->AIC_IDCR = 0xffffffff;
    /*
    AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler;
    for (i=1; i < 31; i++)
    {
        AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler;
    }
    AT91C_BASE_AIC->AIC_SPU  = (int) AT91F_Spurious_handler;
    */
}

вот мой код настройки УСАРТА
Код
    volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA;
//for LED    
    pPIO->PIO_PER = LED_MASK;    //perepherial enable register
    pPIO->PIO_OER = LED_MASK;    //output enable register
    pPIO->PIO_SODR = LED_MASK;
    pPIO->PIO_CODR = LED_MASK;

/*for USART*/
    volatile  AT91PS_PMC pPMC = AT91C_BASE_PMC;            //peripheal clock
    pPMC->PMC_PCER = (1 << AT91C_ID_US1)|(1 << AT91C_ID_US0);        //clock USART1
    
    pPIO->PIO_PDR = (1 << 5)|    /*disable PIO */
                    (1 << 6)|
                    (1 << 21)|
                    (1 << 22);
    
    pPIO->PIO_ASR = (1 << 5)|    /*enable peripheral A*/
                    (1 << 6)|
                    (1 << 21)|
                    (1 << 22);
    int maskPIO;
    maskPIO = pPIO->PIO_OSR | (1 << 6) | (1 << 22);
    pPIO->PIO_OER = maskPIO;    //output USART
    
    volatile AT91PS_USART    pUS1 = AT91C_BASE_US1;        //settings USART
    pUS1->US_BRGR     = CD1;    //baudrate
    pUS1->US_IDR = 0xffffffff;

    pUS1->US_MR     = AT91C_US_USMODE_NORMAL|    
                      AT91C_US_CLKS_CLOCK|    /*AT91C_US_CLKS_SLOW*/
                      AT91C_US_CHRL_8_BITS|
                      AT91C_US_NBSTOP_2_BIT|
                      AT91C_US_DSNACK;
                          
    pUS1->US_CR = 0x50;    //RXEN and TXEN enable

вот мой код передачи байта и зажигание светодиода...
Код
    while(1)
    {
        pPIO->PIO_SODR |= LED_MASK;
    
        for(qwe = 0; qwe < 100000; qwe++);
        
        pPIO->PIO_CODR |= LED_MASK;
        
        for(qwe = 0; qwe < 100000; qwe++);
        
        pUS1->US_THR = 0x1CC;    //transmit char to PC!!!
        
    }

связка у меня такая eclipse + arm-elf-gb + openOCD + wiggler + МК at91sam7...
помогите... мозг уже плавится... руки дрожат... не дайте пропасть душе моей...
светодиодами моргает прекрасно... на кнопочки реагирует...


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
_dem
сообщение Sep 5 2007, 08:02
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



pPMC->PMC_PCER = (1 << AT91C_ID_US1)|(1 << AT91C_ID_US0);

включите тактирование не только USARTов, но и PIO контроллеров

подавать на CTS/RTS ничего не надо

Сообщение отредактировал _dem - Sep 5 2007, 08:06
Go to the top of the page
 
+Quote Post
Mozart
сообщение Sep 5 2007, 09:23
Сообщение #12


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



Код
pPMC->PMC_PCER =     (1 << AT91C_ID_US1)|(1 << AT91C_ID_US0)|
                        (1 << AT91C_ID_PIOA);        //clock USART1

включил них не работает...
3 нога ком-порта сидит в нуле, это нормально?


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
_dem
сообщение Sep 5 2007, 09:49
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



у вас отладчик работает ? что в регистре статуса уарта после записи байта в THR ?

и зачем это :

maskPIO = pPIO->PIO_OSR | (1 << 6) | (1 << 22);
pPIO->PIO_OER = maskPIO; //output USART

?

вот моя последовательность запуска уарта (IAR):

Код
        AT91C_BASE_PMC->PMC_PCER = (1 << self->USART_ID);        
        
        /* Reset and disable receiver */
    self->USART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;

        /* Disable interrupts */
        self->USART->US_IDR = 0xFFFFFFFF;

        self->USART->US_MR = AT91C_US_MAX_ITER | AT91C_US_CLKS_CLOCK | AT91C_US_NBSTOP_1_BIT | AT91C_US_PAR_NONE | AT91C_US_CHRL_8_BITS;

    self->USART->US_BRGR = 320;

        AT91F_US_EnableTx(self->USART);
        AT91F_US_EnableRx(self->USART);    
        
    /* Disable the RX and TX PDC transfer requests */
    self->USART->US_PTCR = AT91C_PDC_RXTDIS;
    self->USART->US_PTCR = AT91C_PDC_TXTDIS;


Сообщение отредактировал _dem - Sep 5 2007, 09:43
Go to the top of the page
 
+Quote Post
Mozart
сообщение Sep 5 2007, 10:25
Сообщение #14


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



если честно под отладчиком не смотрел, просто "прошивал"... ссылаясь на то что оно работает...
сейчас посмотрел под отладчиком во-первых, почему-то после записи в US_THR значения, переходил к функции LowLevelInit(), во-вторых, почему-то не показывает изменения в регистрах... но переписав цикл вайл и превратив его в такой вид
Код
    while(1)
    {
        pPIO->PIO_SODR |= LED_MASK;
    
        //for(qwe = 0; qwe < 100000; qwe++);
        
        pPIO->PIO_CODR |= LED_MASK;
        
        //for(qwe = 0; qwe < 100000; qwe++);

        //while (!(pUS1->US_CSR & AT91C_US_TXRDY));
        for (qwe = 0; qwe < 100; qwe++);
        pUS1->US_THR = 0x1CC;    //transmit char to PC!!!
        
    }

теперь не переходит к LowLevelInit()....
в регистре US_CSR находится 111100000001101000011010 вот это вота... но мне почему-то кажется, что это всё от лукавого...

на 22ой ноге появились признаки жизни... но до разъёма не доходит... это я сейчас разберусь... но есть такой вопрос а собственно в доске at91sam7s-ek фирмешной от атмеля... косяки могут быть???


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
_dem
сообщение Sep 5 2007, 11:49
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Косяки вряд ли - все-таки у многих эта плата и никто пока (если мне не изменят склероз) не жаловался - я сам в их числе.

Кстати, пишите в THR байты, а не слова (0x1CC) - по-моему, атмел в доках говорил что-то про 'undefined behaviour' в таких случаях.

Связка eclipse, toolchain проверенная ? попробуйте сделать то же в IAR (в местных закромах есть) или в Rowley
Go to the top of the page
 
+Quote Post

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

 


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


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