📄 text1
字号:
/*-------------------------------------------------------------------------------------------------
文件名称:canbus.c
创建日期:07.01.15
修改日期:07.06.18
-将调试用代码标志出来,在最终应用时,调试代码应注释掉。
文件说明:功能:
-rs232与can总线双向数据转换。可以与工程aa进行通讯,组成PC对PC的CAN通讯。
参数:
-通道0的IDT:0x00000100
-通道0的MSK:0x1FFFFFFF(通道0只能接受IDT为0x00000101的消息)
-通道1的IDT:0x00000101
-通道1的MSK:0x1FFFFFFF(通道1只能发送IDT为0x00000100的消息)
-UartBuffer大小为16字节
-CanBuffer 大小为16字节
创建人: 李大伟
-------------------------------------------------------------------------------------------------*/
#include "reg51cc01.h"
//Can波特率:500k@12Mhz
#define BRP_500K 0x0
#define SJW_500K 0x0
#define PRS_500K 0x2
#define PHS2_500K 0x3
#define PHS1_500K 0x3
//Can使能
#define CAN_CONTROLLER_RESET {CANGCON|=0x01;}
#define CAN_CONTROLLER_ENABLE {CANGCON|=0x02;}
//Can发送接受使能
#define CAN_RX_IT_ENABLE {CANGIE|=0x10;}
#define CAN_TX_IT_ENABLE {CANGIE|=0x20;}
//Can通道设置
#define CAN_SET_CHANNEL(channel) (CANPAGE=(channel<<4))
//Can中断使能
#define CAN_CHANNEL_IT_ENABLE(channel) {(channel<8)?(CANIE2|=(1<<channel)):(CANIE1|=(1<<(channel-8)));}
//Can标识符定义
#define CanID29(v) (((unsigned long)(v))<<3)
#define ID0 (CanID29(0x00000101))
#define ID0MSK (CanID29(0x1FFFFFFF)|0x01)
#define ID0TYP (0x80|0x10|0x01)
#define ID1 (CanID29(0x00000100))
#define ID1MSK (CanID29(0x1FFFFFFF)|0x01)
#define ID1TYP (0x40|0x10|0x01)
#define CanSetIDT(v) CANIDT1=((unsigned char)((v)>>24)); \
CANIDT2=((unsigned char)((v)>>16)); \
CANIDT3=((unsigned char)((v)>> 8)); \
CANIDT4=((unsigned char)(v)) ;
#define CanSetIDM(v) CANIDM1=((unsigned char)((v)>>24)); \
CANIDM2=((unsigned char)((v)>>16)); \
CANIDM3=((unsigned char)((v)>> 8)); \
CANIDM4=((unsigned char)(v));
//全局变量定义
unsigned char AA=1;
//调-----------------------------------
unsigned char BB=0;
//调-----------------------------------
unsigned char UartAddrBuf[50]; //uart buffer
unsigned char CanAddrBuf[50]; //can buffer
unsigned char *UartRecPntr; //pointer to uart buffer
unsigned char *CanRecPntr; //pointer to can buffer
/*=================================================================================================
01.名称:RazAllMailbox
入口:无
出口:无
功能:将mailbox清零复位
=================================================================================================*/
void RazAllMailbox(void)
{
unsigned char num_channel, num_data;
for(num_channel=0;num_channel<15;num_channel++)
{
CANPAGE = num_channel<<4;
CANCONCH= 0;
CANSTCH = 0;
CANIDT1 = 0;
CANIDT2 = 0;
CANIDT3 = 0;
CANIDT4 = 0;
CANIDM1 = 0;
CANIDM2 = 0;
CANIDM3 = 0;
CANIDM4 = 0;
for(num_data=0;num_data<8;num_data++)
{
CANMSG = 0;
}
}
}
/*=================================================================================================
02.名称:CanSetBRP
入口:无
出口:无
功能:设置BRP
=================================================================================================*/
void CanSetBRP(unsigned char prescaler)
{
CANBT1=prescaler<<1;
}
/*=================================================================================================
03.名称:CanSetSJW
入口:无
出口:无
功能:设置SJW
=================================================================================================*/
void CanSetSJW(unsigned char sjw)
{
CANBT2&=~0x60;
CANBT2|=(sjw<<5);
}
/*=================================================================================================
04.名称:CanSetPRS
入口:无
出口:无
功能:设置PRS
=================================================================================================*/
void CanSetPRS(unsigned char prs)
{
CANBT2&=~0x0E;
CANBT2|=(prs<<1);
}
/*=================================================================================================
05.名称:CanSetPHS2
入口:无
出口:无
功能:设置PHS2
=================================================================================================*/
void CanSetPHS2 (unsigned char phs2)
{
CANBT3&=~0x70;
CANBT3|=(phs2<<4);
}
/*=================================================================================================
06.名称:CanSetPHS1
入口:无
出口:无
功能:设置PHS1
=================================================================================================*/
void CanSetPHS1 (unsigned char phs1)
{
CANBT3&=~0x0E;
CANBT3|=(phs1<<1);
}
/*=================================================================================================
07.名称:SysInit
入口:无
出口:无
功能:全局变量和标志初始化
=================================================================================================*/
void SysInit(void)
{
UartRecPntr=UartAddrBuf;
CanRecPntr=CanAddrBuf;
}
/*=================================================================================================
08.名称:UartInit
入口:无
出口:无
功能:UART初始化
=================================================================================================*/
void UartInit(void)
{
SCON=0x50; //uart工作于模式1 (8 bit), REN=1
T2CON&=0xF0; //EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0
T2CON|=0x30; //RCLK = 1; TCLK=1;
TH2=0xFe; //高位初始值
TL2=0xc8; //低位初始值
RCAP2H=0xFe; //重装值,1200 Bds at 12MHz
RCAP2L=0xc8; //重装值,1200 Bds at 12MHz
ES=1; //串口中断使能
TR2=1; //打开T2
}
/*=================================================================================================
09.名称:CanInit
入口:无
出口:无
功能:CAN初始化
=================================================================================================*/
void CanInit(void)
{
CANGCON|=0x01;; //CAN控制器复位
ECAN=0; //CAN 中断禁能
RazAllMailbox(); //CANRAM清零
CanSetBRP(BRP_500K); //设置BPR
CanSetSJW(SJW_500K); //设置SJW
CanSetPRS(PRS_500K); //设置PRS
CanSetPHS2(PHS2_500K); //设置PHS2
CanSetPHS1(PHS1_500K); //设置PHS1
CANGCON|=0x02;; //CAN控制器使能
CANPAGE=0<<4; //设置通道:通道0 接收
CANSTCH=0;
CANCONCH=0;
CanSetIDT(ID0);
CanSetIDM(ID0MSK);
CANCONCH=0x90; //Object waits for data
CANCONCH|=0x01;
CANIE2|=(1<<0); //通道中断允许
/* CANPAGE=1<<4; //通道选择:通道1 发送
CanSetIDT(ID1);
CanSetIDM(ID1MSK);
CANCONCH = 0; //mark no information for transmit objects
CANSTCH = 0; */
ETIM=0; //CAN 定时器溢出中断禁能
CANGIE|=0x20;; //发送中断允许
CANGIE|=0x10;; //接收中断允许
ECAN=1; //CAN中断允许
}
/*=================================================================================================
10.名称:CanTran
入口:无
出口:无
功能:CAN发送函数
=================================================================================================*/
void CanTran(void)
{
unsigned char channel;
unsigned char *p;
p=UartRecPntr;
p--;
channel=CANPAGE;
CANPAGE=1<<4;
CANSTCH =0;
CANCONCH=0x11;
CanSetIDT(ID1);
CanSetIDM(ID1MSK);
CANMSG=*p;
CANCONCH|=0x40;
CANEN2 |= (1 << 1);
CANSTCH=0x00;
CANPAGE=channel;
/*调-------------------------------------
for(channel=0;channel<255;channel++);
SBUF=BB;
while(!AA);
AA=0;
//调-------------------------------------*/
}
/*=================================================================================================
11.名称:UartTran
入口:无
出口:无
功能:UART发送函数
=================================================================================================*/
void UartTran(void)
{
unsigned char *p;
BB=1;
if(AA==1)
{
p=CanRecPntr;
p--;
SBUF=*p;
AA=0;
BB=0;
}
}
/*=================================================================================================
12.名称:main
入口:无
出口:无
功能:系统主函数
检查UartBuffer和CanBuffer中是否有等待发送的数,有发送之。
UartBuffer和CanBuffer 大小都为16个字节,若待发数据过大,
可定义更大的Buffer。
=================================================================================================*/
void main(void)
{
SysInit();
UartInit();
CanInit();
EA=1;
while(1)
{
if(UartRecPntr!=UartAddrBuf)
{CanTran(); if(BB==0) UartRecPntr--;}
if(CanRecPntr!=CanAddrBuf)
{UartTran(); CanRecPntr--;}
}
}
/*=================================================================================================
13.名称:uart_IT
入口:无
出口:无
功能:UART中断函数
=================================================================================================*/
void uart_IT(void) interrupt 4
{
if(1==RI)
{
RI=0;
*UartRecPntr=SBUF;
UartRecPntr++;
/*调----------------------
BB++;
//调----------------------*/
}
else if(1==TI)
{
TI=0;
AA=1;
}
}
/*=================================================================================================
14.名称:can_IT
入口:无
出口:无
功能:can_IT中断函数
=================================================================================================*/
void can_IT(void) interrupt 7
{
unsigned char channel;
channel=CANPAGE;
if(0x01==(CANSIT2&0x01))
{
CANPAGE=0<<4;
if(0x20==(CANSTCH&0x20))
{
CANSTCH&=0; //清接收中断标志
*CanRecPntr++=CANMSG;
CANCONCH=ID0TYP;
CANEN2|=(1<<0);
}
CANSIT2&=~0x01; //清通道中断标
}
CANSTCH=0x00;
CANPAGE=channel;
CANGIT=0x00;
}
/*-----------------------------------------------------------------------------------------------*/
//End-canbus.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -