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); }