📄 drv_uart.c
字号:
#include "config.h"
uint16 crc;
uint16 crc_temp;
uint8 crcbuff[60];
uint8 *ptr;
uint8 send232[20];
uint8 serial_number=1;
const uint16 crc_ta[]={ // X16+X12+X5+1 余式表
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6,0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
set_parm SET[5];
/*********************************************************************************************************
** 函数名称: int crc16()
** 功能描述: 位计算法对数据序列进行CRC校验
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
** 作 者: 吴成加
** 日 期: 2007年8月12日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned int crc16_bit(unsigned char *ptr,unsigned char len) // ptr 为数据指针,len 为数据长度
{
unsigned char i;
crc=0; // CRC 初值
ptr = &crcbuff[0]; // 指向第一个 Byte 数据
while(len--)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} // 1-1
else crc<<=1; // 1-2
if((*ptr&i)!=0) crc^=0x1021; // 1-3
}
ptr++;
}
return(crc);
}
/*********************************************************************************************************
** 函数名称: int crc16_tab()
** 功能描述: 字节查表法对数据序列进行CRC校验
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
** 作 者: 吴成加
** 日 期: 2007年8月12日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 crc16_tab(uint8 *ptr,uint8 len) // 字节查表法求 CRC
{
uint8 da;
crc=0;
/* if(sendcrcfalg==0x55)
{
sendcrcfalg=0;
ptr = &crcbuff[8];
}
else
{
ptr = &crcbuff[6];
} */
ptr = &crcbuff[6]; //ptr = &crcbuff[0];
while(len--!=0)
{
da=(uint8) (crc/256); // 以 8 位二进制数暂存 CRC 的高 8 位
crc<<=8; // 左移 8 位
crc^=crc_ta[da^*ptr]; // 高字节和当前数据 XOR 再查表
ptr++;
}
return(crc);
}
/*********************************************************************************************************
** 函数名称: int rec_crc16()
** 功能描述: 字节查表法对接收数据序列进行CRC校验
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
** 作 者: 吴成加
** 日 期: 2007年8月12日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 rec_crc16(uint8 *ptr,uint8 len) // 字节查表法求 CRC
{
uint8 da;
crc=0;
ptr = &crcbuff[0];
while(len--!=0)
{
da=(uint8) (crc/256); // 以 8 位二进制数暂存 CRC 的高 8 位
crc<<=8; // 左移 8 位
crc^=crc_ta[da^*ptr]; // 高字节和当前数据 XOR 再查表
ptr++;
}
return(crc);
}
/*********************************************************************************************************
** 函数名称: get_fanma()
** 功能描述: 取一个数的反码
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
** 作 者: 吴成加
** 日 期: 2007年8月12日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char get_fanma(unsigned char dat)
{
unsigned char i,s;
unsigned char dump=0;
for(i=0;i<8;i++)
{
dump=(dump<<1);
if(dat&0x80) s=0;
else s=1;
dat<<=1;
dump|=s;
}
return dump;
}
/*********************************************************************************************************
** 函数名称: debug()
** 功能描述: 空白测试,用于放大器的空白测试和读取放大器的工作参数.握手指令
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
** 作 者: 吴成加
** 日 期: 2008年8月18日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void command(uint8 type)
{
uint8 i;
send232[0]=0xff;
send232[1]=0xff;
send232[2]=0xff;
send232[3]=0xff; //报头
send232[4]=0x08; //数据包长 40字节
send232[5]=0xf7; //数据包长 反码
send232[6]=type; //控制字
send232[7]=serial_number++; //序列号加1
if(serial_number>=254) serial_number=1;
send232[8] =0; //此处填入0,表示不能返回结果
send232[9] =0;
send232[10]=0;
send232[11]=0;
for(i=0;i<12;i++)
{
crcbuff[i]=send232[i];
}
crc_temp=crc16_tab(ptr,(12-6)); //取得CRC校验码
send232[12]=crc_temp>>8;
send232[13]=crc_temp;
for(i=0;i<14;i++)
{
UART0_SendByte(send232[i]);
}
}
/*********************************************************************************************************
** 函数名称: setting_parm()
** 功能描述: 参数设置,用于放大器的参数标定,设置放大器的积分时间,设置系统光程.
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
** 作 者: 吴成加
** 日 期: 2008年8月19日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void setting_parm(uint8 channel)
{
uint8 i;
//canshu0 = 12341;
// canshu1 = 23452;
// canshu2 = 32343;
// jifen_shijian = 42344;
// guanchen = 52345;
send232[0]=0xff;
send232[1]=0xff;
send232[2]=0xff;
send232[3]=0xff; //报头
send232[4]=0x08; //数据包长 40字节
send232[5]=0xf7; //数据包长 反码
send232[6]=channel+2; //命令字
send232[7]=serial_number++; //序列号加1
if(serial_number>=254) serial_number=1;
switch(channel) //以设置参数类型
{
case 0: //放大器标定参数0
{
send232[8] =SET[0].byte[0];
send232[9] =SET[0].byte[1];
send232[10]=SET[0].byte[2];
send232[11]=SET[0].byte[3];
}
break;
case 1: //放大器标定参数1
{
send232[8] =SET[1].byte[0];
send232[9] =SET[1].byte[1];
send232[10]=SET[1].byte[2];
send232[11]=SET[1].byte[3];
}
break;
case 2: //放大器标定参数2
{
send232[8] =SET[2].byte[0];
send232[9] =SET[2].byte[1];
send232[10]=SET[2].byte[2];
send232[11]=SET[2].byte[3];
}
break;
case 3: //放大器积分时间
{
send232[8] =SET[3].byte[0];
send232[9] =SET[3].byte[1];
send232[10]=SET[3].byte[2];
send232[11]=SET[3].byte[3];
}
break;
case 4: //系统光程
{
send232[8] =SET[4].byte[0];
send232[9] =SET[4].byte[1];
send232[10]=SET[4].byte[2];
send232[11]=SET[4].byte[3];
}
break;
default:
break;
}
for(i=0;i<12;i++)
{
crcbuff[i]=send232[i];
}
crc_temp=crc16_tab(ptr,(12-6)); //取得CRC校验码
send232[12]=crc_temp>>8;
send232[13]=crc_temp;
for(i=0;i<14;i++)
{
UART0_SendByte(send232[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -