📄 can.c
字号:
// CAN操作程序
// 总线频率:8M
// 作者:文洪奎
// 日期:2005-7-20
// CAN总线频率:125kHz
#include "MC68HC908GZ32.h"
#include "CAN.h"
#include "main.h"
#include "sci.h"
// CMCR
char bCANState;
volatile CANSTATESTR _CANSTATE;
extern unsigned char cSCITraBuf[SCIMAXLENGTH]; //发送缓冲区,把要发送的数据存在这里
extern unsigned char cSCITraLen;
void InitCAN(void)
{
LED3 = 1;
CONFIG2_MSCANEN = 1;
// 7 6 5 4 3 2 1 0
CMCR0_SFTRES = 0x001; // 0 0 0 SYNCH TLNKEN SLPAK SLPRQ SFTRES
// 0 0 0 0 0 0 0 1
//软复位
while(!CMCR0_SFTRES); //等待进入复位状态
// 7 6 5 4 3 2 1 0
CMCR1 = 0x001; // - - - - - LOOPB WUPM CLKSRC
// 0 0 0 0 0 0 0 1
CBTR0 = 0x0BF; // SJW1 SJW0 BRP5 BRP4 BRP3 BRP2 BRP1 BRP0
// 1 0 1 1 1 1 1 1
CBTR1 = 0x0B9; // SAMP TSEG22 TSEG21 TSEG20 TSEG13 TSEG12 TSEG11 TSEG10
// 0 0 1 1 1 0 0 1
CIDAC = 0x000; // - - IDAM1 IDAM0 - - IDHIT1 IDHIT0
// 0 0 0 0 0 0 0 0
CIDMR0 = 0x0FF; //Identifier Mask Registers
CIDMR1 = 0x0FF;
CIDMR2 = 0x0FF;
CIDMR3 = 0x0FF; //Set up Module to receive all messages
CIDAR0 = 0x000; //Identifier Acceptance Registers
CIDAR1 = 0x000;
CIDAR2 = 0x000;
CIDAR3 = 0x000;
/*
CMCR0 = 0x000; //MSCAN08 正常.
while(!CMCR0_SYNCH); //等待同步
CRIER = 0x000; //
*/
}
//唤醒
void __interrupt CanWakeupisr(void)
{
}
//错误
void __interrupt CanErrorisr(void)
{
//接收警告中断
if(CRFLG_RWRNIF)
{
}
//发送警告中断
if(CRFLG_TWRNIF)
{
}
//接收器出错被动中断
if(CRFLG_RERRIF)
{
}
//发送器出错被动中断标志
if(CRFLG_TERRIF)
{
}
//脱离总线中断标志
if(CRFLG_BOFFIF)
{
}
//溢出中断标志
if(CRFLG_OVRIF)
{
}
}
//接收
void __interrupt Receiveisr(void)
{
CRFLG = 0x0FF; //清标志
CANState_RecFull = 1; //数据已经到达
LED3 = 1;
}
//发送
void __interrupt Transmit(void) //The transmit buffer is empty
{
CANState_TranEmpty = 1;
LED3 = 0;
}
void CanSendMsg(char *pMsg,char nLen)
{
if(nLen > 8 + 4)
return;
if(cSCIRecLen > 13 || cSCIRecLen < 3)
return;
while(!CTFLG_TXE0) //只用TXE0
TB0IDR0 = pMsg[0];
TB0IDR1 = pMsg[1];
TB0IDR2 = pMsg[2];
TB0IDR3 = pMsg[3];
TB0DSR0 = pMsg[4];
TB0DSR1 = pMsg[5];
TB0DSR2 = pMsg[6];
TB0DSR3 = pMsg[7];
TB0DSR4 = pMsg[8];
TB0DSR5 = pMsg[9];
TB0DSR6 = pMsg[10];
TB0DSR7 = pMsg[11];
TB0DLR = nLen - 4; /* Data Length Register for transmit buffer 1 */
CTFLG = 0x01; //开始发送
return;
}
void SaftTest(void)
{
CMCR0_SFTRES = 1; //进入自检测模式
CMCR0_SFTRES = 0; //退出自检测模式
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -