📄 int.c
字号:
#include "c8051f040.h"
#include "can.h"
extern unsigned char DO_Address;
extern unsigned char temp1,temp2;
extern unsigned char DO_Control_Data_New0,DO_Control_Data_New1;
//xdata unsigned char ss[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
xdata unsigned char rr[8]={0,0,0,0,0,0,0,0};
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
SFRPAGE = 0xF;
OSCXCN |= 0x67; //Running at 22.1184MHz.
while (!((OSCXCN & 0x80) == 0x80));
CLKSEL |= 0x01;
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
SFRPAGE = 0xF;
XBR1 |= 0x00;
XBR1 |= 0x04; //INT0 Routed To Port Pin
XBR2 |= 0x40; //If crossbar is disabled, all ports are in input mode.
XBR3 |= 0x80; //CTX pin's output mode is configured as push-pull.
//P0MDOUT = 0x00;
//P1MDIN =0xFF;
P4MDOUT = 0x03; //CANLED and ENABLE
P5MDOUT = 0x00; //OUTPUT CONTROL PORT
P6MDOUT = 0x00; //OUTPUT CONTROL PORT
}
//-----------------------------------------------------------------------------
// INT_Init
// Interrupts By Priority : INT0 > CAN0
//-----------------------------------------------------------------------------
void INT_Init (void)
{
IE |= 0x03; //INT0 Interrupt Enabled
//Timer0 Interrupt Enabled
// IE |= 0x01; //INT0 Interrupt Enabled
EIE2 |= 0x20; //CAN0 Interrupt Enabled
}
//-----------------------------------------------------------------------------
// CAN_Init
// CAN0CN : Automatic Retransmission is Disable. Error and Status Interrrupt
// is Disabled. Module Interrrup is eabled.
// BITREG : BaudRate is 1M/8(b/s).
// CAN0TST : Tx1, Tx0, LBack and Silenct are all 0. Use Basic Mode.
//-----------------------------------------------------------------------------
void CAN_Init (void)
{
SFRPAGE = CAN0_PAGE;
CAN0CN = 0xC3;
CAN0ADR = 0x03;
CAN0DATH = 0x5E;
CAN0DATL = 0xC7; /*0x5EC7的波特率:125kbps 0x5EC0的波特率1Mbps*/
CAN0TST = 0x10; //LBack /*正常工作没有影响*/
}
void CAN_Start(void)
{
SFRPAGE = CAN0_PAGE;
CAN0CN = 0x02; //
}
//-----------------------------------------------------------------------------
// CAN_Transmit_Init(unsigned char MsgNum , unsigned char id)
// wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataA=1,dataB=1
// MsgVal=1, Xad=0,Dir=1:send
// not use the filter,UMask=0,RmtEn=0,eob=1, dlc =8
/* 发送初始化(对象号,ID号)*/
//-----------------------------------------------------------------------------
void CAN_Transmit_Init (unsigned char MsgNum , unsigned char id)
{
/*
unsigned char id_tempL,id_tempH;
id_tempL = id << 2; // id & 0x0F) << 2
id_tempH = id >> 6;
id_tempH = id_tempH || 0xA0; // MsgVal=1, Dir =1
*/
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DATL = 0xb3; //wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataa=1,datab=1
// CAN0ADR = IF1MSK1;
// CAN0DATH = 0x00;
// CAN0DATL = 0x00;
// CAN0DATH = 0x00; //!!bit 13 :not use
// CAN0DATL = 0x00; //IF1MSK
CAN0ADR = IF1ARB1;
CAN0DATH = 0x00;
CAN0DATL = 0x00;
CAN0DATH = 0xA0; //
CAN0DATL = (id << 2 ) & 0x3C; //0x80 | (((DO_Address & 0x0F) << 2)); //IF1ARB
//MsgVal=1, Xad=0,Dir=1:send
CAN0DATH = 0x00; // not use the filter,UMask=0,RmtEn=0
CAN0DATL = 0x88; //IF1MSGC: eob=1, dlc =8
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data A1
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data A2
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data B1
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data B2
CAN0ADR = IF1CMDRQST;
CAN0DATL = MsgNum; //
}
//-----------------------------------------------------------------------------
// CAN_Receive_Init(unsigned char MsgNum , unsigned char id)
// wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataA=1,dataB=1
// MsgVal=1, Xad=0,Dir=0:receive
// not use the filter,UMask=0,RmtEn=0,eob=1, dlc =8, RxEn=1
/* 接收初始化(对象号,ID号)*/
//-----------------------------------------------------------------------------
void CAN_Receive_Init (unsigned char MsgNum , unsigned char id)
{
/*
unsigned char id_tempL,id_tempH;
id_tempL = id << 2; // id & 0x0F) << 2
id_tempH = id >> 6;
id_tempH = id_tempH || 0x80; // MsgVal=1, Dir =0
*/
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF2CMDMSK;
CAN0DATL = 0xbb; //wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=1,txrqet=0,dataa=1,datab=1
// CAN0ADR = IF2MSK1;
// CAN0DATH = 0x00;
// CAN0DATL = 0x00;
// CAN0DATH = 0x00; //0x23;
// CAN0DATL = 0xF4; //IF2MSK 0xco;
CAN0ADR = IF2ARB1;
CAN0DATH = 0x00;
CAN0DATL = 0x00;
CAN0DATH = 0x80;
CAN0DATL = (id << 2 ) & 0x3C; //IF2ARB
//MsgVal=1, Xad=0,Dir=0:get
CAN0DATH = 0x04; //not use the filter,RxEn=1
CAN0DATL = 0x88; //IF2MSGC,, eob=1, dlc =8
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data A1
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data A2
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data B1
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data B2
CAN0ADR = IF2CMDRQST;
CAN0DATL = MsgNum; //
}
//-----------------------------------------------------------------------------
// Timer_Init
// Timer0 For CAN Error -- If there is no CAN information form the bus for
// 10ms, CPU will close all the outputs.
//-----------------------------------------------------------------------------
void Timer_Init (void) {
SFRPAGE = TIMER01_PAGE;
TMOD |= 0x01;
CKCON |= 0x02;
TH0 = 0xFF;
TL0 = 0xFF;
}
/*
//-----------------------------------------------------------------------------
// CAN_send(unsigned char MsgNum,unsigned char *p ) :update the data & start send
/* 发送数据帧(对象号)::发送命令*/
//-----------------------------------------------------------------------------
void CAN_Transmit(unsigned char MsgNum,unsigned char *p_data )
{
unsigned char num;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DATL = 0x87; //wr/rd=1,mask=0,arb=0,control=0,,clrintpnd=0,txrqet=1,dataa=1,datab=1
CAN0ADR = IF1DATA1;
for(num=0;num<8;num++)
{
CAN0DATH=p_data[num];
num++;
CAN0DATL=p_data[num];
}
CAN0ADR = IF1CMDRQST;
CAN0DATL = MsgNum; //
}
//-----------------------------------------------------------------------------
// CAN_receive(unsigned char MsgNum,unsigned char *p )
/* 接收数据帧(对象号,数组地址)*/
//-----------------------------------------------------------------------------
void CAN_Receive (unsigned char MsgNum, unsigned char *p )
{
unsigned char num;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF2CMDMSK;
CAN0DATL = 0x0F;
CAN0ADR = IF2CMDRQST;
CAN0DATL = MsgNum;
CAN0ADR = IF2DATA1;
for(num=0;num<4;num++)
{
*p++ = CAN0DATH;
*p++ = CAN0DATL;
}
}
*/
/*
//-----------------------------------------------------------------------------
// remote_rqst_int(unsigned char MsgNum , unsigned char id)
//wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataa=1,datab=1
/* 远程帧请求初始化(对象号,ID),初始化远程帧,请求其他节电的数据*/
//-----------------------------------------------------------------------------
void CAN_RemoteRqst_Init(unsigned char MsgNum , unsigned char id) //id=1
{
// unsigned char id_tempL,id_tempH;
// id_tempL = id << 2; // id & 0x0F) << 2
// id_tempH = id >> 6;
// id_tempH = id_tempH || 0x80; // MsgVal=1, Dir =0
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DATL = 0xb3; //wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataa=1,datab=1
//?? remote data??
CAN0ADR = IF1ARB1;
CAN0DATH = 0x00;
CAN0DATL = 0x00;
CAN0DATH = 0x80; // MsgVal=1, Dir =0
CAN0DATL = (id << 2 ) & 0x3C; //IF2ARB
//MsgVal=1, Xad=0,Dir=0:receive
CAN0DATH = 0x04; //not use the filter,RxEn=1
CAN0DATL = 0x88; //IF2MSGC
CAN0ADR = IF1CMDRQST;
CAN0DATL = MsgNum;
}
*/
/*
//-----------------------------------------------------------------------------
// remote_rqst(unsigned char MsgNum)
/* 发送远程帧(对象号)::发送请求其他节点数据的命令*/
//-----------------------------------------------------------------------------
/*
void CAN_RemoteRqst(unsigned char MsgNum)
{
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DATL = 0x87; //wr/rd=1,mask=0,arb=0,control=0,,clrintpnd=0,txrqet=1,dataa=1,datab=1
//?? remote data??
CAN0ADR = IF1CMDRQST;
CAN0DATL = MsgNum;
}
*/
//-----------------------------------------------------------------------------
// CAN_Remote_Send_Init(unsigned char MsgNum,unsigned char id )
/* 应答远程帧初始化(对象号,ID)::向发送请求数据的节点发送数据的初始化*/
//-----------------------------------------------------------------------------
void CAN_Remote_Send_Init(unsigned char MsgNum,unsigned char id )
{
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DATL = 0xb3; //wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataa=1,datab=1
CAN0ADR = IF1ARB1;
CAN0DATH = 0x00;
CAN0DATL = 0x00;
CAN0DATH = 0xA0; //
CAN0DATL = (id << 2 ) & 0x3C; //0x80 | (((DO_Address & 0x0F) << 2)); //IF1ARB
//MsgVal=1, Xad=0,Dir=1:send
CAN0DATH = 0x0a; // not use the filter,UMask=0,RmtEn=1,TxIE=1
CAN0DATL = 0x88; //IF1MSGC: eob=1, dlc =8
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data A1
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data A2
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data B1
CAN0DATH = 0x00;
CAN0DATL = 0x00; //data B2
CAN0ADR = IF1CMDRQST;
CAN0DATL = MsgNum; //
}
//-----------------------------------------------------------------------------
// CAN_Remote_Updata(unsigned char MsgNum,unsigned char *p_data )
/* 应答远程帧数据更新(对象号,数组地址)::对应答远程帧数据的更新*/
//-----------------------------------------------------------------------------
void CAN_Remote_Updata(unsigned char MsgNum,unsigned char *p_data )
{
unsigned char num;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF2CMDMSK;
CAN0DATL = 0x08; //wr/rd=0,mask=0,arb=0,control=0,,clrintpnd=1,txrqet=0,dataa=0,datab=0
CAN0ADR = IF2CMDRQST;
CAN0DATL = MsgNum; //
CAN0ADR = IF1CMDMSK;
CAN0DATL = 0x8b; //wr/rd=1,mask=0,arb=0,control=0,,clrintpnd=1,txrqet=0,dataa=1,datab=1
CAN0ADR = IF1DATA1;
for(num=0;num<8;num++)
{
CAN0DATH=p_data[num];
num++;
CAN0DATL=p_data[num];
}
CAN0ADR = IF1CMDRQST;
CAN0DATL = MsgNum;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -