📄 interfacelib.c
字号:
#include "InterfaceLIB.h"
/********** Interface Functions Definition **********/
/**********************************************************/
/* Serial Ports Interface Functions */
/**********************************************************/
/**********************************************************/
/* Initialazing Serialserials */
/* */
/* ComNum---
/* Bitrate--- 2400 ,3200 ,4800 ,6525 ,7680 , */
/* 9309 ,9600 ,10593 ,11520 ,13050 , */
/* 14400 ,15360 ,19200 ,23040 ,26100 , */
/* 27927 ,28800 ,30720 ,31779 ,38400 , */
/* 57600 ,51200 ,76800 ,102400,115200, */
/* 122880,153600,204800,307200,614400 */
/* 非智能: */
/* Data--- 8,7,6,5bit */
/* Stop--- 1=1,2=1.5,2 */
/* Parity--- 0- no parity */
/* 1- odd */
/* 3- even */
/* 5- parity bit forced to 1 */
/* 7- parity bit forced to 0 */
/* Count --- 非智能的FIFO大小 */
/* Mode --- 工作方式0 正常 1 循环 */
/*
/**********************************************************/
BOOL InitCom (int ComNum,int Bitrate,int Data,int Stop,
int Parity,int Count, int Mode )
{
int Init_Data[3],i,Status;
int Bitrate_Table[2][25]= /* Intelligent Serials */
{2400 , 3200 , 4800 , 6400 , 7680 ,
9600 , 11520 , 12800 , 14400 , 15360 ,
19200 , 25600 , 28800 , 30720 , 38400 ,
51200 , 57600 , 76800 , 102400, 115200,
122880, 153600, 204800, 307200, 614400,
0x30 , 0x2c , 0x28 , 0x21 , 0x17 ,
0x24 , 0x13 , 0x15 , 0x12 , 0x0f ,
0x20 , 0x0d , 0x0a , 0x07 , 0x14 ,
0x05 , 0x10 , 0x0c , 0x01 , 0x08 ,
0x7f , 0x7e , 0x7d , 0x00 , 0x7c
};
unsigned char parameter , OldACR ;
unsigned int divisor , len , AddSerial;
if( ComNum > 8 || ComNum < 1 ||
Bitrate > 614400|| Bitrate < 2400 ||
Stop > 2 || Stop < 1 ||
Mode > 1 || Mode < 0
)
return FALSE;
switch(ComNum)
{
case 7: /* unintelligent Serials */
case 8:
{
if((Parity < 0 || Parity > 7 || Parity == 2 || Parity == 4 || Parity == 6)
|| (( (Data & 0x0f) > 8) || ( (Data & 0x0f) < 5 )))
return FALSE;
AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
/*设置波特率 */
*((int*)(AddSerial+SPR)) = CSR; /* Write SPR to Select CSR */
*((int*)(AddSerial+ICR)) = 0x00; /* Write 0x00 into CSR for reset 16c954 */
*((int*)(AddSerial+LCR)) = 0xBF; /* Enable access to the EFR, DLL and DLM registers */
divisor =(unsigned int)(614400/Bitrate);/* Input frequency is 9.8304Mhz */
parameter = divisor & 0xFF;
*((int*)(AddSerial+DLL)) = parameter; /* DLL */
parameter = (divisor >> 8) & 0xFF;
*((int*)(AddSerial+DLM)) = parameter; /* DLM */
if(ComNum == 8)
*((int*)(AddSerial+EFR)) = 0xD0; /* EFR, enhance mode select,enable RTS CTS flow control*/
else
*((int*)(AddSerial+EFR)) = 0x10; /* EFR, enhance mode select,enable RTS CTS flow control*/
parameter = ((Data - 5) & 0x03) + (((Stop-1) & 0x01) << 2) ;/* 数据位LCR[1:0]和停止位 */
parameter |= (Parity & 0x07) << 3;
*((int*)(AddSerial+LCR)) = parameter; /* LCR ,设置数据位,停止位,校验位 */
parameter = (Mode << 4 ) | 0xa ;
*((int*)(AddSerial+MCR)) = parameter; /* 设置模式Mode=0正常,Mode=1循环,out2=1,out1=0,RTS=1,DTR=0*/
/*设置收到几个字节触发中断*/
if(Count >= 1 && Count < 128)
{
*((int*)(AddSerial+FCR)) = 0x07; /* Enable FIFO, Flush THR and RHR */
*((int*)(AddSerial+SPR)) = ACR; /* SPR = 0, PT ACR */
*((int*)(AddSerial+ICR)) = 0x60; /* ACR, enable 950 mode,ICR read enable */
*((int*)(AddSerial+SPR)) = TTL; /* SPR = 4, PT TTL */
*((int*)(AddSerial+ICR)) = Count; /* Transmit trigger level */
*((int*)(AddSerial+SPR)) = RTL; /* SPR = 5, PT RTL */
*((int*)(AddSerial+ICR)) = Count; /* Receive trigger level */
*((int*)(AddSerial+SPR)) = FCL; /* SPR = 6, PT FCL */
*((int*)(AddSerial+ICR)) = 1;
*((int*)(AddSerial+SPR)) = FCH;
*((int*)(AddSerial+ICR)) = Count;
}else if(Count < 1 || Count > 127) return FALSE;
*((int*)(AddSerial+SPR)) = ACR;
OldACR = *((int*)(AddSerial+ICR));
*((int*)(AddSerial+ICR)) = OldACR | 0x80 ;
len = *((int*)(AddSerial+RFL)) & 0xFF ;
*((int*)(AddSerial+SPR)) = ACR;
*((int*)(AddSerial+ICR)) = OldACR;
while(len > 0)
{
parameter = *((int*)(AddSerial+RHR)); /* Clear the reciever FIFO */
len--;
}
if(ComNum == 7) *((int*)(AddSerial+IER)) = 1; /* IER, enable receive interrupt */
break;
}
default:
return FALSE;
}
return TRUE;
}
BOOL ResetCom(int ComNum) /* Reset Com */
{
unsigned int AddSerial;
if(ComNum < 1 || ComNum > 8) return FALSE;
switch(ComNum)
{
case 7:
case 8:
AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
*((int*)(AddSerial + SPR)) = CSR; /* SPR = 0x0C, PT CSR */
*((int*)(AddSerial + ICR)) = 0x00; /* Reset Com */
break;
default:
return FALSE;
}
return TRUE;
}
BOOL ReadCom (int ComNum, /* Number of Com 1-8 */
BYTE *pReadBuffer, /* Buffer for readed data from com */
int ReadBufferSize, /* Size of Buffer */
int *RealSize /* Real Size of readed data */
)
{
unsigned int AddSerial;
int Status,i,RevDataLen,Count1,Count2;
if(ComNum < 1 || ComNum > 8 || pReadBuffer == NULL) return FALSE;
switch(ComNum)
{
case 7:
case 8:
AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
*((int*)(AddSerial+SPR)) = ACR; /* PT ACR */
*((int*)(AddSerial+ICR)) |= 0x80; /* ACR = TempACR (ACR[7] = 1) */
Count1 = *((int*)(AddSerial+RFL))&0xFF; /* Number of characters int receiver FIFO */
Count2 = *((int*)(AddSerial+RFL))&0xFF; /* Number of characters int receiver FIFO */
*((int*)(AddSerial+SPR)) = ACR; /* PT ACR */
*((int*)(AddSerial+ICR)) &= 0x7F; /* ACR = TempACR (ACR[7] = 0) */
if((Count1 != Count2)|| Count1 > 128 || Count2 > 128 )
{
*RealSize = 0;
return FALSE; /* If RHR is Empty,Return */
}
*RealSize = Count1 >= ReadBufferSize ? ReadBufferSize : Count1;
if(*RealSize == 0) return FALSE;
for(i = 0;i < *RealSize;i++)
pReadBuffer[i] = (BYTE)(*( (int*)(AddSerial+RHR) ) & 0xFF);
return TRUE;
default:
break;
}
*RealSize = 0;
return FALSE;
}
BOOL WriteCom(int ComNum, /* Number of Com */
BYTE *pWriteBuffer, /* Buffer saving data to be writed */
int WriteSize /* Size of Data to be writed */
) /* Suceed ,return TRUE; fail ,return FALSE */
{
unsigned int AddSerial;
int EmptyLen,i;
if(ComNum < 1 || ComNum > 8 || pWriteBuffer == NULL) return FALSE;
switch(ComNum)
{
case 7:
case 8:
if(WriteSize < 1 || WriteSize > 128)
return FALSE;
AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
*((int*)(AddSerial+SPR)) = ACR; /* PT ACR */
*((int*)(AddSerial+ICR)) |= 0x80; /* ACR = TempACR (ACR[7] = 1) */
EmptyLen = 128 - *((int*)(AddSerial+TFL))&0xFF; /* Number of characters int receiver FIFO */
*((int*)(AddSerial+SPR)) = ACR; /* PT ACR */
*((int*)(AddSerial+ICR)) &= 0x7F; /* ACR = TempACR (ACR[7] = 0) */
if(WriteSize > EmptyLen)
return FALSE;
else
{
for(i = 0;i < WriteSize;i++)
*((int*)(AddSerial+THR)) = pWriteBuffer[i];/* Read *RealSize Data */
return TRUE;
}
default:
break;
}return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -