📄 _rs232.c
字号:
/****************************************************************
* *
* Program : RS232.C *
* *
* Purpose : Handler for RS232 communication. *
* *
* Compile : SH SERIES C Compiler Ver. 4.1 *
* *
* Version : 1.00 *
* *
* Create : 2002-09-01 Sunday By KWM *
* *
* Copyright (C) 2002 Amnokgang Technology Development Corp. *
* All Rights Reserved. *
* *
****************************************************************/
#include "_MyType.H"
#include "_BIOS.H"
#include "lib_AT91RM9200.h"
#include "config.H"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/* keyword : YMMFAB */
/* You must modify follow according board */
/* ---------------------------------------------- */
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#define BRR96_CWR 9600 /* 9600 BPS */
#define BRR192_CWR 19200 /* 19200 BPS */
#define BRR384_CWR 38400 /* 38400 BPS */
#define BRR576_CWR 57600 /* 57600 BPS */
#define BRR1152_CWR 115200 /* 115200 BPS */
extern void AT91F_USART1_ASM_HANDLER(void);
unsigned char gDeviceID;
char gRecBuffer232[0x0800]; /* receive FIFO buffer */
short gCommPutPos232; /* Put pointer to receive buffer */
short gCommGetPos232; /* Get pointer to receive buffer */
void initrs232(void)
{ /*********** Config IO Rxd1,Txd1 ***********************/
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOB, (AT91C_PIO_PB20 | AT91C_PIO_PB21), 0);
AT91F_US1_CfgPMC();
AT91F_US_Configure (AT91C_BASE_US1, PROCESSOR_CLOCK/MASTER_CLOCK_DIVIDER, AT91C_US_ASYNC_MODE, 57600, 0);
AT91C_BASE_US1->US_CR|=0x100;
AT91C_BASE_US1->US_CR&=0xFFFFFEFF;
AT91F_US_EnableRx(AT91C_BASE_US1);
AT91F_US_EnableTx(AT91C_BASE_US1);
AT91F_US_ResetRx((AT91PS_USART)AT91C_BASE_US1);
AT91F_US_ResetTx((AT91PS_USART)AT91C_BASE_US1);
AT91F_US_EnableIt((AT91PS_USART)AT91C_BASE_US1,AT91C_US_RXRDY);
/************ USART1 RxDRDY INT ENABLE **************/
AT91F_AIC_ConfigureIt (
AT91C_BASE_AIC, // AIC base address
AT91C_ID_US1, // USART1 ID
AT91C_AIC_PRIOR_HIGHEST, // priority 7
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, // Level sensitive
AT91F_USART1_ASM_HANDLER );
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US1);
gCommPutPos232 = 0;
gCommGetPos232 = 0;
gDeviceID = 1;
}
//========================================================================
// Function : PutReceiveData232
// Description : 1byte data put to FIFO buffer.
// Return type : void
// Argument
// ( ) : void
// Create : 2003-01-14 PM 2:49:59 By KWM
//========================================================================
void USART1_PutReceiveData232( void )
{
// printf("\n\n interupt test\n\n");
AT91C_BASE_US1->US_CR|=0x100;
AT91C_BASE_US1->US_CR&=0xFFFFFEFF;
if( ((gCommPutPos232+1)%sizeof(gRecBuffer232)) != gCommGetPos232 ){
gRecBuffer232[gCommPutPos232++] =AT91C_BASE_US1->US_RHR;
gCommPutPos232 %= sizeof(gRecBuffer232);
}
}
//========================================================================
// Function : GetReceiveData232
// Description : 1byte data from SCIF Get from FIFO buffer.
// Return type : int
// Argument
// ( Out) : BYTE *apData
// Create : 2003-01-14 PM 2:48:59 By KWM
//========================================================================
int GetReceiveData232( BYTE *apData )
{
if( gCommPutPos232 == gCommGetPos232 ) return FALSE;
*apData = gRecBuffer232[gCommGetPos232++];
gCommGetPos232 %= sizeof(gRecBuffer232);
return TRUE;
}
/*========================================================================
// Function : Receive1byte232
// Description : Waitting untill receive 1byte data from SCI0.
// timeout=1s
// Return type : BOOL
// Argument
// ( In ) : apData=Buffer for receive data.
// Date : 1998/08/24 AM - Ver.1.0 - By Kim Won Myong
//========================================================================*/
int Receive1byte232( BYTE *apData )
{
register DWORD vCount;
vCount = AT91F_GetTickCount() + 200;
while( vCount > AT91F_GetTickCount() ){
if( GetReceiveData232( apData ) ) return TRUE;
}
/* vCount=0;
while( vCount <0xffffffff )
{
if( GetReceiveData232( apData ) ) return TRUE;
vCount++;
for(i=0;i<0xfffff;i++);
}*/
return FALSE;
}
/*========================================================================
// Function : CheckFIFO232
// Description : Check RS232 FIFO
// Return type : int
// Argument
// ( ) : void
// Create : 2003-12-08 10:27:25 AM By KWM,KGB
//========================================================================*/
int CheckFIFO232( void )
{
if ( gCommPutPos232 != gCommGetPos232 ) return TRUE;
return FALSE;
}
/*========================================================================
// Function : Send1byte232
// Description : Out 1byte data to SCI0.
// Return type : void
// Argument
// ( In ) : aData=data to trans.
// Date : 1998/08/24 AM - Ver.1.0 - By Kim Won Myong
//========================================================================*/
void Send1byte232( BYTE aData )
{
volatile int i;
while(!(AT91C_BASE_US1->US_CSR & 0x2)); //Wait until THR is empty.
for( i=0;i<10; i++);
AT91C_BASE_US1->US_THR=aData;
}
/*========================================================================
// Function : GetCommand232
// Description : Peek host's command from FIFO buffer of SCI
// Return type : int
// Argument
// ( Out) : int *apCommand
// ( Out) : long *apInparam
// ( Out) : int *apBlock_Number
// ( Out) : int *apBlock_Size
// Create : 1998/08/24 AM - Ver.1.0 - By Kim Won Myong
// Update : 2004-01-16 10:06:51 AM By KGB
//========================================================================*/
int GetCommand232( int *apCommand, long *apInparam, int *apBlock_Number, int *apBlock_Size )
{
BYTE vData=0;
WORD vSum;
DWORD vBuff;
while( TRUE ){
vData = 0;
/* STX1 */
if( !GetReceiveData232( &vData ) ) return FALSE;
if( vData != STX1 ) continue;
vSum = vData;
/* STX2 */
if( !Receive1byte232( &vData ) ) return FALSE;
if( vData != STX2 ) continue;
vSum += vData;
/* Device ID */
if( !Receive1byte232( &vData ) ) return FALSE;
vSum += vData;
/* Command */
if( !Receive1byte232( &vData ) ) return FALSE;
if( apCommand != NULL ) *apCommand = vData;
vSum += vData;
/* Inparam */
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff = (DWORD)vData;
vSum += vData;
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff += (DWORD)vData<<8;
vSum += vData;
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff += (DWORD)vData<<16;
vSum += vData;
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff += (DWORD)vData<<24;
if( apInparam != NULL ) *apInparam = vBuff;
vSum += vData;
/* Block_Number */
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff = (WORD)vData;
vSum += vData;
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff += (WORD)vData<<8;
if( apBlock_Number != NULL ) *apBlock_Number = (WORD)vBuff;
vSum += vData;
/* Block_Size */
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff = (WORD)vData;
vSum += vData;
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff += (WORD)vData<<8;
if( apBlock_Size != NULL ) *apBlock_Size = (WORD)vBuff;
vSum += vData;
/* Chksum */
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff = (WORD)vData;
if( !Receive1byte232( &vData ) ) return FALSE;
vBuff += (WORD)vData<<8;
if( vSum != (WORD)vBuff ) continue;
break;
}
return TRUE;
}
//========================================================================
// Function : SendCmdAck232
// Description : Send acknowledge for SCI
// Return type : void
// Argument
// ( ) : void
// Create : 1998/08/24 AM - Ver.1.0 - By Kim Won Myong
// Update : 2004-01-16 10:01:02 AM By KGB
//========================================================================
void SendCmdAck232( void )
{
register WORD vSum;
BYTE vData;
vData = STX3; Send1byte232( vData ); vSum = vData;
vData = STX4; Send1byte232( vData ); vSum += vData;
vData = gDeviceID; Send1byte232( vData ); vSum += vData;
vData = CMD_ANS_ACK; Send1byte232( vData ); vSum += vData;
Send1byte232( LOBYTE(vSum) );
Send1byte232( HIBYTE(vSum) );
}
//========================================================================
// Function : SendExeResult232
// Description : Send execute result for SCI
// Return type : void
// Argument
// (In ) : char aResult
// (In ) : unsigned long aOutparam
// Create : 1998/08/24 AM - Ver.1.0 - By Kim Won Myong
// Update : 2004-01-16 10:00:23 AM By KGB
//========================================================================
void SendExeResult232( char aResult, unsigned long aOutparam )
{
register WORD vSum;
BYTE vData;
vData = STX2; Send1byte232( vData ); vSum = vData;
vData = STX1; Send1byte232( vData ); vSum += vData;
vData = gDeviceID; Send1byte232( vData ); vSum += vData;
vData = aResult; Send1byte232( vData ); vSum += vData;
vData = LOBYTE(LOWORD(aOutparam)); Send1byte232( vData ); vSum += vData;
vData = HIBYTE(LOWORD(aOutparam)); Send1byte232( vData ); vSum += vData;
vData = LOBYTE(HIWORD(aOutparam)); Send1byte232( vData ); vSum += vData;
vData = HIBYTE(HIWORD(aOutparam)); Send1byte232( vData ); vSum += vData;
Send1byte232( LOBYTE(vSum) );
Send1byte232( HIBYTE(vSum) );
}
/*========================================================================
// Function : RecBlockData232
// Description : Receive block data by SCI
// Return type : int
// Argument
// ( Out) : void *apBuff
// (In ) : int aTotalBytes
// (In ) : int aBlock_Number
// (In ) : int aBlock_Size
// Create : 1998/08/24 AM - Ver.1.0 - By Kim Won Myong
// Update : 2004-01-16 09:59:26 AM By KGB
//========================================================================*/
int RecBlockData232( void *apBuff, int aTotalBytes, int aBlock_Number, int aBlock_Size )
{
register WORD vChksum,vSum;
register int vCount;
BYTE vData;
register BYTE *vpDstAddr;
if( aBlock_Number == 0xffff ) return TRUE;
if( aBlock_Size + BLOCK_SIZE*aBlock_Number > aTotalBytes ) return FALSE;
vpDstAddr = (BYTE*)apBuff + BLOCK_SIZE*aBlock_Number;
/* Receive 0x55aa */
if( !Receive1byte232( &vData ) ) return FALSE;
if( vData != STX1 ) return FALSE;
if( !Receive1byte232( &vData ) ) return FALSE;
if( vData != STX2 ) return FALSE;
/* Receive data */
vSum = STX1 + STX2;
vCount = aBlock_Size;
while( vCount-- ){
if( !Receive1byte232( &vData ) ) return FALSE;
*vpDstAddr++ = vData;
vSum += vData;
}
/* Receive checksum */
if( !Receive1byte232( &vData ) ) return FALSE;
vChksum = vData;
if( !Receive1byte232( &vData ) ) return FALSE;
vChksum += (WORD)vData<<8;
if( vSum != vChksum ) return FALSE;
return TRUE;
}
/*=======================================================================
// Function : SendBlockData232
// Description : Send block data by SCI
// Return type : int
// Argument
// (In ) : void *apBuff
// (In ) : int aTotalBytes
// (In ) : int aBlock_Number
// (In ) : int aBlock_Size
// Create : 1998/08/24 AM - Ver.1.0 - By Kim Won Myong
// Update : 2004-01-16 09:58:40 AM By KGB
//========================================================================*/
int SendBlockData232( void *apBuff, int aTotalBytes, int aBlock_Number, int aBlock_Size )
{ register WORD vSum;
register int vCount;
register BYTE *vpDstAddr;
if( aBlock_Number == 0xffff ) return TRUE;
if( aBlock_Size + BLOCK_SIZE*aBlock_Number > aTotalBytes ) return FALSE;
vpDstAddr = (BYTE*)apBuff + BLOCK_SIZE*aBlock_Number;
/* Send 0x55aa */
Send1byte232( STX1 );
Send1byte232( STX2 );
/* Send data */
vSum = STX1 + STX2;
vCount = aBlock_Size;
while( vCount-- ){
Send1byte232( *vpDstAddr );
vSum += *vpDstAddr++;
}
/* Send checksum */
Send1byte232( LOBYTE(vSum) );
Send1byte232( HIBYTE(vSum) );
return TRUE;
}
/****************************************************************
*
* End of file : RS232.C
*
****************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -