📄 dkk6interfacelib.c
字号:
#include "InterfaceLIB.h"
/********** Interface Functions Definition **********/
/**********************************************************/
/* Serial Ports Interface Functions */
/**********************************************************/
/**********************************************************/
/* Initialazing Serialserials */
/* */
/* */
/* 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+LCR)) = 0x80; // Enable access to the divisor latches by setting DLAB in LCR
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
//使能增强功能 使能串口8自动流控制功能
*((int*)(AddSerial+LCR)) = 0xBF; //if want to use EFR,LCR must be 0xBF
if(ComNum == 8)
{
*((int*)(AddSerial+EFR)) = 0xD0; //0xD0 - 11010000:bit6=1,bit7=1 enable RTS CTS flow control,bit4=1 enable enhanced function
}
else
{
*((int*)(AddSerial+EFR)) = 0x10;
}
//设置工作模式 RTS输出低电平 INT output Enable
*((int*)(AddSerial+LCR)) = 0x7F; //use MCR, LCR[7] must be 0
parameter = (Mode << 4 ) | 0xA ; //0x0A - 00001010 设置模式Mode=0正常,Mode=1循环,INT output=1,out1=0,RTS=1,DTR=0
*((int*)(AddSerial+MCR)) = parameter;
//使能RX TX FIFO, Reset RX TX FIFO
*((int*)(AddSerial+LCR)) = 0x7F;
*((int*)(AddSerial+FCR)) = 0x01; //0x01-00000001:Enable FIFO
*((int*)(AddSerial+FCR)) = 0x07; //0x07-00000111:Reset FIFO
//设置收到几个字节触发中断,以及流控制上下限
if((Count >= 36) && (Count <= 90))
{
//中断
*((int*)(AddSerial+LCR)) = 0xBF; //enable FCTR
*((int*)(AddSerial+FCTR)) = (TABLED&SELRX); //0x30 - 00110000: bit4=1 bit5=1 select Table-D; bit7=0 set RX
*((int*)(AddSerial+TRG)) = Count; //set Trigger Level Register
*((int*)(AddSerial+FCTR)) = (TABLED|SELTX); //0x30 - 00110000: bit4=1 bit5=1 select Table-D; bit7=1 set TX
*((int*)(AddSerial+TRG)) = Count; //set Trigger Level Register
//流控制
*((int*)(AddSerial+FCTR)) = (TABLED|0x03|0x40); //0x03-00000011:bit1=1,bit0=1 设置流控制的值+-36;0x40-01000000:bit6=1 选择增强模式 , 才能访问EMSR和FLVL
*((int*)(AddSerial+LCR)) = 0x7F; //LCR[7]=0 才能访问EMSR
*((int*)(AddSerial+EMSR)) = EMSR11; //bit5=1 bit4=1 设置流控制的值
if(ComNum == 7)
{
*((int*)(AddSerial+IER)) = 0x01; //IER, enable receive interrupt
}
}
else if((Count<36)||(Count>90))
{
return FALSE;
}
//取出当前接收缓存中的数据个数
*((int*)(AddSerial+EMSR)) = (0xFC&EMSR11); //bit1=0 bit0=0 RX FIFO Counter Mode
len = (*((int*)(AddSerial+FLVL)))&0xFF;
while(len > 0)
{
parameter = *((int*)(AddSerial+RHR)); //Clear the reciever FIFO
len--;
}
//设置数据位、停止位、奇偶校验位
parameter = ((Data - 5) & 0x03) + (((Stop-1) & 0x01) << 2) ; //数据位LCR[1:0]和停止位
parameter |= (Parity & 0x07) << 3;
*((int*)(AddSerial+LCR)) = parameter;
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,CountR;
if(ComNum < 1 || ComNum > 8 || pReadBuffer == NULL) return FALSE;
switch(ComNum)
{
case 7:
case 8:
AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
////取出当前接收缓存中的数据个数
*((int*)(AddSerial+EMSR)) = (0xFC&0x30); //bit1=0 bit0=0 RX FIFO Counter Mode
CountR = (*((int*)(AddSerial+FLVL)))&0xFF;
if(CountR > 128)
{
*RealSize = 0;
return FALSE;
}
*RealSize = CountR >= ReadBufferSize ? ReadBufferSize : CountR;
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,CountW;
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+EMSR)) = (0x01|EMSR11); //bit1=0 bit0=1 TX FIFO Counter Mode
CountW = (*((int*)(AddSerial+FLVL)))&0xFF;
EmptyLen = 128 - CountW;
if(WriteSize > EmptyLen)
{
return FALSE;
}
else
{
for(i = 0;i < WriteSize;i++)
*((int*)(AddSerial+THR)) = pWriteBuffer[i];
return TRUE;
}
default:
break;
}return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -