AT91SAM7S64 DBGU port

Mészáros Attila ictboy at np.hu
Fri Nov 18 11:28:38 CET 2005


Üdv!

A problémám a következő. Most épp az ARM debug soros portját akarom 
használni adatkommunikációra, csak az a baj, hogy ha küldök egy byte-ot 
a PC felé, akkor csak akkor jut el az adat a PCig, ha a byte nem 0.

Ha hex 0x00-t küldök ki a debug porton, akkor a byte nem megy ki. Van 
valakinek valami ötlete, hogy miért ?

Köszi:
Attila

Itt a kód:


// Include Standard files
#include "Board.h"
#include "include\Regptr.h"		//Pointers for the registers 
base address

/* Global variables */
#define SPEED 		(MCKKHz/10)

unsigned int LedSpeed = SPEED *12 ;
const int led_mask[4]= {LED1, LED2, LED3, LED4};
unsigned char I2CBuffer[100];

//----------------------------------------------------------------------
----------------
unsigned int BaudrateCalc (
	const unsigned int main_clock, // \arg peripheral clock
	const unsigned int baud_rate)  // \arg UART baudrate
{
	unsigned int baud_value = (10 * main_clock/(baud_rate * 16));
	if ((baud_value % 10) >= 5)
		baud_value = (baud_value / 10) + 1;
	else
		baud_value /= 10;
	return baud_value;
}
//----------------------------------------------------------------------
----------------
/*
static void change_speed (void)
{
	if (((pPIO->PIO_PDSR) & SW1_MASK) == 0 )
	{
		if ( LedSpeed > SPEED ) LedSpeed -=SPEED ;
	}
	if (((pPIO->PIO_PDSR) & SW3_MASK) == 0 )
	{
	    if ( LedSpeed < MCK ) LedSpeed +=SPEED ;
	}
}
//----------------------------------------------------------------------
----------------
static void wait ( void )
{
    unsigned int waiting_time ;
    change_speed () ;
    for(waiting_time = 0; waiting_time < LedSpeed; waiting_time++) ;
}
*/
//----------------------------------------------------------------------
----------------
static void SendRS232_Byte(unsigned char TxByte)
{

// ez a rész küldi ki a byteot a debug porton, de 0x00-t nem ???

      pDBGU->DBGU_CR = AT91C_US_RSTSTA;
      pDBGU->DBGU_THR = TxByte & 0x000000ff;
      while (((pDBGU->DBGU_CSR) & AT91C_US_TXRDY) == 0) {};
}
//----------------------------------------------------------------------
----------------
unsigned int RecRS232_Byte(void)
{
  unsigned int RxByte, Cou;
      RxByte=0x100; Cou=0;
      while(Cou<10000)
      {
        if (pDBGU->DBGU_CSR & AT91C_US_RXRDY)
        {
           RxByte = pDBGU->DBGU_RHR & 0x00000fff;
           Cou=10000;
        }
      Cou++;
      }
      return RxByte;
}
//----------------------------------------------------------------------
----------------
static void SendRS232String(unsigned char *Kiirni)
{
unsigned char y,l;

    l=strlen(Kiirni);
    for(y=0;y<l;y++){SendRS232_Byte(Kiirni[y]);}
    SendRS232_Byte(13);SendRS232_Byte(10);
}
//----------------------------------------------------------------------
----------------
static void ClearRS232Screen(unsigned char Sor)
{
unsigned char y;

    for(y=0;y<Sor;y++){SendRS232_Byte(13);SendRS232_Byte(10);}
}
//----------------------------------------------------------------------
----------------
static void CheckRS232(void)
{
unsigned int xx;
unsigned char a;

        xx=RecRS232_Byte();
        switch(xx)
        {
          case 0x31:
            SendRS232String(" Start I2C tracing...");
            break;
        
          case 0x32:
            SendRS232String(" I2C tracing stopped...");
            break;
            
          case 0x33:
            for(a=0;a<sizeof(I2CBuffer);a++)
            {
                SendRS232_Byte(I2CBuffer[a]);
            }
            break;
        }
}
//----------------------------------------------------------------------
----------------
static void Initialize(void)
{
    // Setup Clocks
      pPMC->PMC_PCER = 1 << AT91C_ID_PIOA;
      pPMC->PMC_PCER = 1 << AT91C_ID_SYS;
     
    // Setup LEDs
      pPIO->PIO_PER = LED_MASK;
      pPIO->PIO_OER = LED_MASK;
      pPIO->PIO_SODR = LED1 | LED2 | LED3 | LED4;
      
    // Setup DBGU RS232 Port
      pPIO->PIO_PDR = AT91C_PA10_DTXD | AT91C_PA9_DRXD;
      pPIO->PIO_ASR = AT91C_PA10_DTXD | AT91C_PA9_DRXD;
      
      pDBGU->DBGU_BRGR  = BaudrateCalc(MCK, 115200);
      pDBGU->DBGU_MR    = AT91C_US_PAR_NONE | AT91C_US_CHMODE_NORMAL;
      pDBGU->DBGU_CR    = AT91C_US_RXEN | AT91C_US_TXEN;
}
//----------------------------------------------------------------------
----------------
int main(void)
{
unsigned char Cntr;
unsigned char x1;

      Initialize();
  
      x1=0;
/*
      ClearRS232Screen(50);
      SendRS232String(" ");
      SendRS232String("   1 - Start I2C tracing");
      SendRS232String("   2 - Stop I2C tracing");
      SendRS232String("   3 - Download I2C buffer to PC");
      SendRS232String(" ");
  */
   for(Cntr=0;Cntr<255;Cntr++)
   {
      SendRS232_Byte(Cntr);
   }
    SendRS232_Byte(0);
    SendRS232_Byte(0);
     SendRS232_Byte(0);
                    
   while(1)
   {  
        if((x1 & 1))  pPIO->PIO_CODR = LED1;
        if(!(x1 & 1)) pPIO->PIO_SODR = LED1;
        x1=!x1;
        
        CheckRS232();

   }       
}




More information about the Elektro mailing list