⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mscan08.c

📁 飞思卡尔08单片机程序
💻 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作为时钟源

	CIDAC = 0x00;      //单个32位验收滤波器,滤波器0匹配
	CIDMR0 = 0xff;     //标识符屏蔽寄存器
	CIDMR1 = 0xff;
	CIDMR2 = 0xff;
	CIDMR3 = 0xff;     //Match all

	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  



	 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]; 
	


	*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);
   
    }
	
	MessageID_Real =*Message_reg;
	MessageID_Real=((MessageID_Real&0xFFE00000)>>3)|((MessageID_Real&0x0007FFFE)>>1);
	CanRxFlag=1;
  	CRFLG=0x01;
  

 	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -