at91sam7 i uart

Feb 11, 2010 1 Replies

Witam. Próbujê uruchomiæ UART na p³ytce startowej zl11 z modu³em zl12 i procesorem at91sam7s256. Niestety mam do czynienia z tym procesorem pierwszy raz i nie wychodzi mi wys³anie znaku.



Czy móg³by który¶ z grupowiczów wskazaæ gdzie mogê mieæ b³±d, mo¿e ¼le ustawiam taktowanie, zastosowany kwarc ma 12MHz. Z moich wyliczeñ MCK powinien byæ 48MHz. Uarta próbujê uruchomiæ na 9600.



Dziêki serdeczne za pomoc. Pawe³



/////////////////////////////////////////////////////////////// LowLevelInit(){



AT91PS_PMC pPMC = AT91C_BASE_PMC;



//Flash i watchdog ......



//Aktywowanie g³ównego generatora MAINCK



// SCK = 1/32768 = 30.51 uSecond // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms pPMC->PMC_MOR = (( ((AT91C_CKGR_OSCOUNT) & (0x06 <<8)) | (AT91C_CKGR_MOSCEN) )); // Wait the startup time while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));



//Aktywacja PLL //DIV=3 12MHz/3=4MHz //Mul=23 4*(23+1)=96Mhz // PLL 96MHz



pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x03) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (23<<16)));



// Wait the startup time while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); // 4. Selection of Master Clock and Processor Clock // select the PLL clock divided by 2 pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 ; //dzielenie PLL na 2 while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));



pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ; //wybranie ¼ród³a PLL while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));



//MCK=48MHz ???? .......... } //////////////////////////////////////////////////////// #define MCK 48000000 #define BR 9600 /* Baud Rate */ #define BRD (MCK/16/BR) /* Baud Rate Divisor */



volatile AT91S_USART * pUSART = AT91C_BASE_US0; /* Global Pointer to USART0 */



void uart0_init (void) { /* Initialize Serial Interface */



//aktywowanie zegara na usart volatile AT91PS_PMC pPMC = AT91C_BASE_PMC; pPMC->PMC_PCER |= (1 << AT91C_ID_US0);



volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; pPIO->PIO_PDR = AT91C_PA0_RXD0 | /* Enable RxD0 Pin */ AT91C_PA1_TXD0; /* Enalbe TxD0 Pin */



//ustawienie peripheral na PIOA na A pPIO->PIO_ASR = AT91C_PIO_PA0 | AT91C_PIO_PA1;



pUSART->US_CR = AT91C_US_RSTRX | /* Reset Receiver */ AT91C_US_RSTTX | /* Reset Transmitter */ AT91C_US_RXDIS | /* Receiver Disable */ AT91C_US_TXDIS; /* Transmitter Disable */



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_1_BIT; /* 1 Stop Bit */



pUSART->US_BRGR = BRD; /* Baud Rate Divisor */



pUSART->US_CR = AT91C_US_RXEN | /* Receiver Enable */ AT91C_US_TXEN; /* Transmitter Enable */ } ///////////////////////////////////////// //wysy³anie znaku int uart0_putc(int ch) { while (!(pUSART->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer



*/ return (pUSART->US_THR = ch); /* Transmit Character */ } ////////////////////////////////////// void init(void) { // enable peripheral clocks for PIO controllers AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_PIOA) | (1<<AT91C_ID_PIOB); // enable reset-key on board AT91C_BASE_RSTC->RSTC_RMR = (0xA5000000 | AT91C_RSTC_URSTEN); //uart init uart0_init(); } ///////////////////////////////////////// int main( void ) {

init();



for(;;) { uart0_putc('H') ; uart0_putc('e') ; uart0_putc('l') ; uart0_putc('l') ; uart0_putc('o') ; uart0_putc('\r') ; uart0_putc('\n') ; } return(0); }


Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required