📄 can.c
字号:
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include "config.h"
#include "can.h"
INT16U Can1Tbp,Can1Tep; // CAN 发送环形缓冲区指针
INT16U Can1Rbp,Can1Rep; // CAN 接收环形缓冲区指针
INT32U Can1Tb[CanBufSize][4]; // CAN 发送环形缓冲区
INT32U Can1Rb[CanBufSize][4]; // CAN 接收环形缓冲区
union ucanbuf Can1,Can2;
INT32U cur_floor,cur_dir,open_door,close_door,up_ring,down_ring,over_load;
INT8U music_name;
volatile INT32U voice_command_old;
static INT32U old_dir,voice_command=1,voice_timer=0;
INT16U Can1To, Can2To;//超时定时器
void InitCan1(void)
{
CANAFMR = 3; // 接收所有信息,接收滤波器直通
PCONP = PCONP | 0x1e000; // 电源控制
PINSEL1 &= ~((INT32U)0x03 << 18);
PINSEL1 |= ((INT32U)0x01 << 18);
//PINSEL1 = (PINSEL1 & 0xFFF3FFFF) | 0x00040000; // 选择 CAN1 bit18=1 bit19=0
CAN1MOD = 1;
while (!(CAN1MOD & 1)) CAN1MOD = 0x01; // 软件复位 CAN 控制器
CAN1EWL = 0x60; // 设置警告计数阀值
CAN1GSR = 0;
CAN1BTR = BPS_25K; // 设置通讯速率
VICIntEnClr = 0x3cf80000; // 采用查询方式,禁止所有 CAN 中断
CAN1MOD = 0;
Can1Tbp = 0; // 缓冲区指针清零
Can1Tep = 0;
Can1Rbp = 0;
Can1Rep = 0;
}
// CAN1 发送
void Can1Send(void)
{
INT16U i;
i = Can1Tbp + 1;
if (i >= CanBufSize) i = 0;
CAN1TFI1 = Can1Tb[i][0]; // 16 - 19: DLC
CAN1TID1 = Can1Tb[i][1]; // 0 - 10: TXID
CAN1TDA1 = Can1Tb[i][2]; // TDA
CAN1TDB1 = Can1Tb[i][3]; // TDB
CAN1CMR = 0x21;
Can1Tbp = i;
}
// CAN1 接收信息到环形接收缓冲区
void Can1Recv(INT8U ch)
{
INT16U i;
i = Can1Rep + 1;
if (i >= CanBufSize) i = 0;
if (i == Can1Rbp) return; // CAN 缓冲区满,退出接收
Can1Rb[i][0] = CAN1RFS; // 16 - 19: DLC
Can1Rb[i][1] = CAN1RID; // 0 - 10: RXID
Can1Rb[i][2] = CAN1RDA; // RDA
Can1Rb[i][3] = CAN1RDB; // RDB
Can1Rep = i;
CAN1CMR = 0x0c;
}
// CAN 控制器错误检查
void CanErrorCheck(void)
{
if (((CAN1GSR & 0x00ff0000) > 0x00400000) || ((CAN1GSR & 0xff000000) > 0x40000000))
{
InitCan1();
}
}
void CanIO(void)
{
if (CAN1GSR & 1)
Can1Recv(0);
// CANBUS 如果有信息等待发送,等待发送缓冲区空闲时发出
if (Can1Tbp != Can1Tep)
{
if (CAN1GSR & 4)
Can1Send();
}
}
void Can1Tran(INT32U *buf)
{
INT16U i;
i = Can1Tep + 1;
if (i >= CanBufSize) i = 0;
if (i == Can1Tbp) return;
Can1Tb[i][0] = buf[0]; // DLC
Can1Tb[i][1] = buf[1]; // TXID
Can1Tb[i][2] = buf[2]; // TDA
Can1Tb[i][3] = buf[3]; // TDB
Can1Tep = i; // 更新尾指针
}
void CanProcess(void)//周期调用
{
INT8U i;
CanIO();
/*Can1.wbuf[0] = 0; // DLC
Can1.wbuf[1] = 8; // DLC
Can1.lbuf[1] = 8; // CANTXID
Can1.cbuf[8] = 0xff;
Can1.cbuf[9] = 0xff;
Can1.cbuf[10] = 0; // 距离目标层的时间
Can1.cbuf[11] = 0; // 距离目标层的距离
Can1.cbuf[12] = 0xff; // 当前高度
Can1.cbuf[13] = 0xff; // 当前时间 时
Can1.cbuf[14] = 0; // 当前时间 分
Can1.cbuf[15] = 0; // 当前时间 秒
Can1Tran(Can1.lbuf);*/
// 处理通过 CAN1 总线收到的信号
if (Can1Rbp != Can1Rep) // CAN1收到信息
{
i = Can1Rbp + 1;
if (i >= CanBufSize) i = 0;
// CAN信息处理代码
Can1To = 0;
Can1RecvProcess((union ucanbuf *)Can1Rb[i]);
Can1Rbp = i;
}
}
void Can1RecvProcess(union ucanbuf *CanBuf)
{
INT8U cmd_type;
cmd_type = CanBuf->cbuf[9];
if (cmd_type == 1)
{
cur_floor = CanBuf->cbuf[10];
cur_dir = CanBuf->cbuf[11] & 7;
open_door = (( CanBuf->cbuf[11] & 0x08) == 0x08);
close_door = (( CanBuf->cbuf[11] & 0x10) == 0x10);
}
if ((cmd_type == 10) && (CanBuf->cbuf[8]== 4))
{
up_ring = ((CanBuf->cbuf[10]&0x01)==0x01);
down_ring = ((CanBuf->cbuf[10]&0x02)==0x02);
over_load = ((CanBuf->cbuf[10]&0x40)==0x40);
}
}
void update_voice(void) //gh040603
{
if (up_ring || down_ring)
{
voice_command_old = cur_floor;
}
if (cur_dir != old_dir)
{
if ((cur_dir == 2) && (old_dir == 1)) voice_command_old = 253;
if ((cur_dir == 3) && (old_dir == 4)) voice_command_old = 254;
old_dir = cur_dir;
}
if (over_load)
{
voice_command_old = 252;
}
if (open_door)
{
voice_command_old = 250;
}
if (close_door)
{
voice_command_old = 251;
}
if (voice_command != voice_command_old)
{
StopPlay();
voice_timer = 2;
voice_command = voice_command_old;
}
if (voice_timer == 0)
{
//music_name = 0;
;
}
else
{
music_name = voice_command;
voice_timer--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -