📄 can.c
字号:
#include "public.h"
void can_init(void)
{
uchar whamr0,whamr1,a,b,c;
if(data5045.cF0==0){
a=0x09;
}else{
a=0x06;
}
c=data5045.cF1+1;
//定义代码和掩码
whacr0=((a<<3)|(c>>3)); //01001(控制器为1)或00110(为其他的值)+层楼数的高3位:要分奇偶数值*/
whacr1=((c<<5)|(0x00>>3)); //层楼数的低3位+RTR+随机数*/
whamr0=0x07; //00000+111
whamr1=0xff;
//定义发送标识符
a=cCtrlNum[data5045.cF0];
b=(data5045.cF1+1);
whid1=((a<<3)|(b>>3)); //控制器标识符+层楼数的高3位*/
whid2=((b<<5)|(0x00>>3)); //层楼数的低3位+随机数*/
do{XBYTE[((P2&0xe0)|0x0F)*256]=0x09;} //进入复位状态,为单滤波方式
while(XBYTE[((P2&0xe0)|0x0F)*256]&0x01==0); //复位信号的查询和置位
//定义时钟分配器,CLKOUT没有使用,则clock off为1,RXINTEN为0,CBP置位,CAN 模式为Pelican,为1;
XBYTE[((P2&0xe0)|0x0F)*256+31]=0xc8;
XBYTE[((P2&0xe0)|0x0F)*256+3]=0; //禁止SJA1000所有的中断
XBYTE[((P2&0xe0)|0x0F)*256+16]=whacr0; //定义接收代码和掩码
XBYTE[((P2&0xe0)|0x0F)*256+17]=whacr1;
XBYTE[((P2&0xe0)|0x0F)*256+18]=0x00;
XBYTE[((P2&0xe0)|0x0F)*256+19]=0x00;
XBYTE[((P2&0xe0)|0x0F)*256+20]=whamr0;
XBYTE[((P2&0xe0)|0x0F)*256+21]=whamr1;
XBYTE[((P2&0xe0)|0x0F)*256+22]=0xff;
XBYTE[((P2&0xe0)|0x0F)*256+23]=0xff;
// 定义总线定时器:波特率为:125kbit,采样点为:87。5%
XBYTE[((P2&0xe0)|0x0F)*256+6]=0x02; //此时为12兆晶振。
XBYTE[((P2&0xe0)|0x0F)*256+7]=0x1c;
//当为8兆晶振时,应该为:XBYTE[0x06]=0x01;XBYTE[0x07]=0x1c;
//定义CAN输出:TX1悬空,TX0为推拉方式,输出为Normal方式
//当为16兆晶振时,应该为:XBYTE[0x06]=0x03;XBYTE[0x07]=0x1c;
//定义CAN输出:TX1悬空,TX0为推拉方式,输出为Normal方式
XBYTE[((P2&0xe0)|0x0F)*256+8]=0x1a;
//定义RX buffer start address RBSA(由于每个数据帧为11个字节)
do //置位复位状态
{XBYTE[((P2&0xe0)|0x0F)*256]=0x08;} //运行状态,单滤波
while((XBYTE[((P2&0xe0)|0x0F)*256]&0x01)!=0x00);
}
void senddata(void)
{
// uchar csenddata;
//发送数据(条件:1.外呼按钮按下+未收到外呼灯点亮数据+开入点滤波100ms)
// (条件:2.锁梯信号+开入点滤波100ms)
// (条件:3.消防信号+开入点滤波100ms)
// (条件:4.消防返回信号+开入点滤波100ms)
if(P1_7==1){
/*
if((time1_flg==1)&&(P1_1==0)){ //上呼设定或没有
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time1_flg=0;
}
if((time2_flg==1)&&(P1_3==0)){ //下呼设定或没有
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time2_flg=0;
}
if(time3_flg==1){ //锁梯
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time3_flg=0;
}
if(time4_flg==1){ //消防
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time4_flg=0;
}
if(time5_flg==1){ //消防返回
csenddata = getsenddata();
dispose_sendata(0x55, csenddata);
time5_flg=0;
}
if(m_RecData.cMaxFloor==1){ //上电后,当初始最大楼层数为1时,发"读最大楼层数"
dispose_sendata(0x5A, 0x00);
}
*/
}
}
void dispose_sendata(uchar data1,uchar data2) //发送数据,每次发送两个数据
{ do {}
while((XBYTE[((P2&0xe0)|0x0F)*256+2]&0x04)!=0x04); //判断发送缓冲区是否释放
XBYTE[((P2&0xe0)|0x0F)*256+16]=0x02; //数据长度为2;
XBYTE[((P2&0xe0)|0x0F)*256+17]=whid1; //主机的发送标识符:00110+层楼数(1~50)
XBYTE[((P2&0xe0)|0x0F)*256+18]=whid2;
XBYTE[((P2&0xe0)|0x0F)*256+19]=data1;
XBYTE[((P2&0xe0)|0x0F)*256+20]=data2;
XBYTE[((P2&0xe0)|0x0F)*256+1]=0x01;
}
uchar getsenddata(void)
{
if((P1_4==0) && (data5045.cF4==1)){
abit_3=1;abit_2=0; //设置消防
}else{
abit_3=0;abit_2=1;
}
if((P1_5==0) && (data5045.cF4==1)){
abit_5=1;abit_4=0; //设置消防返回
}else{
abit_5=0;abit_4=1;
}
if((P1_6==0) && (data5045.cF3==1)){
abit_7=1;abit_6=0; //设置锁梯
}else{
abit_7=0;abit_6=1;
}
return(abit);
}
void receivedata(void)
{
uchar c0id1,c0id2,c0command,c0data;
if((XBYTE[((P2&0xe0)|0x0F)*256+2]&1)==1){
c0id1=XBYTE[((P2&0xe0)|0x0F)*256+17]; //接收的数据id1
c0id2=XBYTE[((P2&0xe0)|0x0F)*256+18]; //接收的数据id2
c0command=XBYTE[((P2&0xe0)|0x0F)*256+19]; //接收的命令
c0data=XBYTE[((P2&0xe0)|0x0F)*256+20]; //接收的参数
XBYTE[((P2&0xe0)|0x0F)*256+1]=0xc;
dispose_recdata(/*c0id1,c0id2,*/c0command,c0data);/*调用数据处理*/
time_nocan_flg=0;
time_nocan_count=TIMER_NOCANDATA_NUM;
}else{
time_nocan_flg=1; //确保置没收到can数据标志
}
}
void dispose_recdata(/*uchar c0id1,uchar c0id2,*/uchar c0command,uchar c0data)
{
uchar cTemp;
uchar cValidFlg=0;
if(c0command==0x55){ //显示楼层数(LHM QUESTION:负楼层的显示以前的程序似乎并未实现)
if((c0data>=0xf7)&&(c0data<=0xff)){ //当输入值为-9 --- -1时,相对应显示输入值为0~8.显示为:-9~-1
cTemp=(c0data-0xf7);
cValidFlg=1;
}else if((c0data>=1)&&(c0data<=48)){ //当输入值为1~48时,显示输入值为:9~56.显示为:1~48;
cTemp=(c0data+8);
cValidFlg=1;
}else if((c0data>=61)&&(c0data<=69)){ //当输入值为61~69时,显示输入值为:69~77.显示为:B1~B9
cTemp=(c0data+8);
cValidFlg=1;
}
if(m_RecData.cCurFloor!=cTemp){
m_cWholeMoveOKFlg=0;
m_cMoveCnt=0;
m_cMoveTimer=TIMER_ONELINE_NUM;
m_cNewLineFlg=0;
}
//2005.01.20 合法性检查后才登记
if(cValidFlg==1){
m_RecData.cCurFloor = cTemp;
}
}else if(c0command==0xaa){ //显示方向
if(c0data==0x55){ //上
m_RecData.cDirect=1;
}else if(c0data==0xaa){ //下
m_RecData.cDirect=0;
}else if(c0data==0x00){ //无
m_RecData.cDirect=0xFF;
}
}else if(c0command==0xa5){ //显示亮度(休眠),对应锁梯
if(c0data==0x55){ //休眠
m_cLockDarkFlg=1;
}else if(c0data==0xAA){ //正常
m_cLockDarkFlg=0;
}
}else if(c0command==0x5A){ //超载
if(c0data==0x55){ //是
m_cOverloadFlg=1;
}else if(c0data==0xAA){ //否
m_cOverloadFlg=0;
}
}else if(c0command==0xCC){ //报站
/* if(c0data==0x55){ //是
m_cReportFlg=1;
}else if(c0data==0xAA){ //否
m_cReportFlg=0;
}*/
m_cReportFlg=1;
m_cReportIdx=c0data; //报站索引
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -