at91sam7 i uart

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
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
  //Mul23%  4*(23+1)96%Mhz
  // 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));

  //MCK48%MHz ????
  ..........
}
////////////////////////////////////////////////////////
#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);
}




Re: at91sam7 i uart
Już działa pomyliłem pliki nagłówkowe.




Site Timeline