📄 mscan08.c
字号:
/* Include Files */
#include <MC68HC908GZ16.h> /* include peripheral declarations */
#include "Type.h"
#include "MSCAN08.h"
#pragma MESSAGE DISABLE C1825 /*Disable warning C2705 "possible loss of data"*/
/* Global Variables */
UINT8 CAN_RX_Data[8];
UINT8 CanRxFlag;
UINT32 MessageID_Real;
/* Local Variables */
UINT32* Message_reg = &RBIDR0; /* adresses of receive buffer */
UINT8* IDR1regs[3] = {&TB0IDR1,&TB1IDR1,&TB2IDR1}; /* adresses of IDR1 registers */
UINT32* IDRregs[3] = {&TB0IDR0,&TB1IDR0,&TB2IDR0}; /* adresses of IDR registers */
UINT8* IDR3regs[3] = {&TB0IDR3,&TB1IDR3,&TB2IDR3}; /* adresses of IDR3 registers */
UINT8* DSRregs[3] = {&TB0DSR0,&TB1DSR0,&TB2DSR0}; /* adresses of DSR registers */
UINT8* DLRregs[3] = {&TB0DLR,&TB1DLR,&TB2DLR}; /* adresses of DLR registers */
UINT8* TBPRregs[3] = {&TB0TBPR,&TB1TBPR,&TB2TBPR}; /* adresses of TBPR registers */
/*****************************************************************************
* MSCAN08Init:CAN模块初始化
* Input: None
* Output: None
* Parameters: None
*
****************************************************************************/
void MSCAN08Init(void){
CMCR0 = 0x01; //CAN模块初始化,MSCAN08处于软复位状态
CMCR1 = 0x00;//|SELF_LOOP; //MSCAN08使用CGMXCLK/2作为时钟源
CBTR0 = 0x81; //8MHz,SJW=3,3个Tq周期,波特率预定标器BRP=2,
CBTR1 = 0x14; //8MHz,ONE SAMPLE,P_SEG=3,PHASE1=2,PHASE2=2 //0x25; //TSEG1=6,TSEG2=3
CIDAC = 0x00; //单个32位验收滤波器,滤波器0匹配
CIDMR0 = 0xff; //标识符屏蔽寄存器
CIDMR1 = 0xff;
CIDMR2 = 0xff;
CIDMR3 = 0xff; //Match all
CMCR0 = 0x00; //Start the device // 模块控制寄存器
CRIER = 0x01; ///接收器中断使能寄存器,接收器满时产生中断
}
/*****************************************************************************
* CAN_SendFrame:发送一帧
* Input: MessageID:标识符 FrameType:帧类型 Length:数据长度 *Data:数据指针
* Output: None
* Parameters: None
*
****************************************************************************/
void CAN_SendFrame(UINT32 MessageID,UINT8 FrameType,UINT8 Length,UINT8 * Data){
UINT8 i;
UINT8 BufferNum,bufmask; //定义选择的发送缓冲区,值0~2
PTA_PTA3=!PTA_PTA3;
if(CTFLG_TXE0==1) BufferNum=0;
else if(CTFLG_TXE1==1) BufferNum=1;
else if(CTFLG_TXE2==1) BufferNum=2;
bufmask=(1<<BufferNum); //Buffer mask
if ( (BufferNum > 2) || (Length > 8) ) //如果缓冲区标号大于2 或者数据长度大于8
return; //返回错误
if (FrameType > REMOTE_FRAME) //如果帧类型不是远程帧或数据帧
return; //返回错误
if (!(CTFLG & bufmask)) //发送缓冲区满
return; //返回错误
*IDRregs[BufferNum]= ( ((MessageID<<1) & 0x0007FFFF) | ((MessageID << 3) & 0xFFE00000) ) | 0x00180000 ; //设置消息为扩展帧,SRR
for(i=0; i<Length; i++)
*((DSRregs[BufferNum])+i) = Data[i]; /* Store data to the transmit register */
*DLRregs[BufferNum] = Length; //设置信息长度
*TBPRregs[BufferNum] = 0;
CTFLG = bufmask;
}
/*****************************************************************************
* CANRx_ISR:中断服务程序,can接收中断
* Input: None
* Output: None
* Parameters: None
*
****************************************************************************/
void interrupt 20 CANRx_ISR(void){
UINT8 i;
while (!(CRFLG_RXF));//接收器标志寄存器_接收缓冲已满标志位
for(i=0; i<RBDLR; i++)
{
CAN_RX_Data[i] = *(&RBDSR0+i);
}
CanRxFlag=1;
MessageID_Real=*Message_reg;
MessageID_Real=((MessageID_Real&0xFFE00000)>>3)|((MessageID_Real&0x0007FFFE)>>1);
CRFLG=0x01;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -