📄 system.c
字号:
{
Save5bps |=0x10;
}
DelayTime(200);
if(RXD0==1)
{
Save5bps |=0x20;
}
DelayTime(200);
if(RXD0==1)
{
Save5bps |=0x40;
}
DelayTime(200);
if(RXD0==1)
{
Save5bps |=0x80;
}
return Save5bps;
}*/
/*************************************************
IN:
OUT:
COMMENT:单字节累加和校验
*************************************************/
/*void SingleCheck(void)
{
unsigned char i;
unsigned char j;
unsigned char sum=0;
if(Comm0SendData[0]!=0x80)
{
i=Comm0SendData[0]-0x7c;
}
else
{
i=Comm0SendData[3]+5;
}
for(j=0;j<i-1;j++)
{
sum+=Comm0SendData[j];
}
Comm0SendData[i-1]=sum;
}*/
/*************************************************
IN:
OUT:
COMMENT:单字节累加和校验
*************************************************/
/*void DoubleCheck(void)
{
unsigned char i;
unsigned short j;
unsigned char sum=0;
if(Comm0SendData[0]!=0x80)
{
i=Comm0SendData[0]-0x7c;
}
else
{
i=Comm0SendData[3]+5;
}
for(j=0;j<i-3;j++)
{
sum+=Comm0SendData[j];
}
Comm0SendData[i-1]=sum/256;
Comm0SendData[i-2]=sum%256;
}*/
/********************CAN 波特率设置**************************/
//In:波特率以K为单位
//Out:BITREG(位定时寄存器)
void SetBaudRate(unsigned int baudrate)
{
CAN0ADR = BITREG; // Point to Bit Timing register
switch(baudrate)
{
case 500:
{
CAN0DAT = 0x7CC0;
}
break;
case 1000:
{
CAN0DAT = 0x1780;
}
break;
}
}
//Clear Message Objects
void Clear_Msg_Objects (void)
{
unsigned char i;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK; // Point to Command MSK Register 1
CAN0DATL = 0xFF; // Set direction to WRITE all IF registers to Msg Obj
for (i=1;i<33;i++)
{
CAN0ADR=IF1ARB2; //指向IF1仲裁寄存器2
CAN0DAT=0X0000; //清除MsgVal位
CAN0DAT=0X0000; //清除消息控制寄存器
CAN0ADR = IF1CMDRQST; // Write blank (reset) IF registers to each msg obj
CAN0DATL = i;
}
}
//Initialize Message Object for RX
void Init_Msg_Object_RX (char MsgNum)
{
/*SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK; // Point to Command MSK 1
CAN0DAT = 0x00B8; // Set to WRITE, and alter all Msg Obj except ID MSK
// and data bits
CAN0ADR = IF1ARB1; // Point to arbitration1 register
CAN0DAT = 0x0000; // Set arbitration1 ID to "0"
CAN0DAT = 0x8000; // Arb2 high byte:Set MsgVal bit, no extended ID,
// Dir = RECEIVE
CAN0DAT = 0x0480; // Msg Cntrl: set RXIE, remote frame function disabled
CAN0ADR = IF1CMDRQST; // Point to Command Request reg.
CAN0DATL = MsgNum; // Select Msg Obj passed into function parameter list
// --initiates write to Msg Obj*/
// 3-6 CAN clock cycles to move IF register contents to the Msg Obj in CAN RAM
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF2CMDMSK; /*指向命令屏蔽寄存器2*/
CAN0DAT = 0x00B8; //00000000 10111000 Set to WRITE, and alter all Msg Obj except ID MSK
//CAN0DAT = 0x00F8; // and data bits
switch(MsgNum)
{
case 17: /*第17个对象用来接收数据ID=07E0*/
{
CAN0ADR = IF2MSK1;
CAN0DAT = 0x0000; //00000000 00000000
CAN0DAT = 0xAF80; //010 *11111100000* 00
CAN0ADR = IF2ARB1;
CAN0DAT = 0x0000; //00000000 00000000
CAN0DAT = 0x9F80; //100 *11111100000* 00
};
break;
}
CAN0ADR = IF2MSGC; /*设置报文控制寄存器:使用屏蔽UMask、中断允许RxIE、EOB、DLC=8*/
CAN0DAT = 0x1488; // 0001 0100 1000 1000
CAN0ADR = IF2CMDRQST;
CAN0DATL = MsgNum;
}
//Initialize Message Object for TX
void Init_Msg_Object_TX (char MsgNum)
{
/*SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK; // Point to Command MSK 1
CAN0DAT = 0x00B2; // Set to WRITE, & alter all Msg Obj except ID MSK bits
CAN0ADR = IF1ARB1; // Point to arbitration1 register
CAN0DAT = 0x0000; // Set arbitration1 ID to highest priority
CAN0DAT = 0xA000; // Autoincrement to Arb2 high byte:
// Set MsgVal bit, no extended ID, Dir = WRITE
CAN0DAT = 0x0081; // Msg Cntrl: DLC = 1, remote frame function not enabled
CAN0ADR = IF1CMDRQST; // Point to Command Request reg.
CAN0DAT = MsgNum; // Select Msg Obj passed into function parameter list
// --initiates write to Msg Obj
// 3-6 CAN clock cycles to move IF reg contents to the Msg Obj in CAN RAM.*/
SFRPAGE=CAN0_PAGE;
CAN0ADR=IF1CMDMSK; /*指向IF1命令屏蔽寄存器*/
CAN0DAT=0x00B8; /*设置为写操作,除了ID的MSK和数据位不能改变,其它都可以变化*/
//000000 10111000
CAN0ADR=IF1MSGC; //设置报文控制寄存器:DLC=8,远程帧允许,中断允许
CAN0DAT=0X2288; //0010 0010 0000 1000 BYTE.13=1 允许中断
// BYTE.9=1 在接收到一远程帧时TxRqst被置1
// BYTE.3~0 发送8个字节
CAN0ADR=IF1CMDRQST; /*指向命令请求寄存器*/
CAN0DATH=0X00; /*向此寄存器中写入目标对象编号,对此对象进行设置*/
CAN0DATL=MsgNum;
}
//Start CAN
void Start_CAN (void)
{
SFRPAGE = CAN0_PAGE;
CAN0CN |= 0x41; // Configuration Change Enable CCE and INIT
SetBaudRate(500);
CAN0ADR =NEWDAT2;
CAN0DATL=0;
CAN0CN |= 0x06; // Global Int. Enable IE and SIE
CAN0CN &= ~0x41; // Clear CCE and INIT bits, starts CAN state machine
}
void Transmit_Message (char MsgNum)
{
unsigned char i,j;
i=0;
j=(MsgNum-1)<<3;
SFRPAGE = CAN0_PAGE; // IF1 already set up for TX
CAN0ADR = IF1CMDMSK; // Point to Command Mask 1
CAN0DAT = 0x0087; // Config to WRITE to CAN RAM, write data bytes,
// set TXrqst/NewDat, Clr IntPnd
CAN0ADR=IF1ARB2;
CAN0DATH |= 0x80;
CAN0ADR=IF1DATA1;
/*for(i=0;i<4;i++)
{
CAN0DATH=CanSendData[j];
CAN0DATL=CanSendData[j+1];
j+=2;
}*/
CAN0DATH=CanSendData[1];
CAN0DATL=CanSendData[0];
CAN0DATH=CanSendData[3];
CAN0DATL=CanSendData[2];
CAN0DATH=CanSendData[5];
CAN0DATL=CanSendData[4];
CAN0DATH=CanSendData[7];
CAN0DATL=CanSendData[6];
CAN0ADR=IF1CMDRQST;
CAN0DAT=MsgNum;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -