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

📄 can.c

📁 用Freescale的8位单片机做的RS232-CAN的通讯转换板.包含固件程序,原理图,PCB图和一个说明文件.
💻 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 + -