⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _rs232.c

📁 at91rm9200 mac control源码
💻 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 + -