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