📄 can.c
字号:
#define BASE_CAN 0x4000
#define CON_REG (unsigned char xdata*)(BASE_CAN)/*mode*/
#define CMD_REG (unsigned char xdata*)(BASE_CAN+1)
#define STS_REG (unsigned char xdata*)(BASE_CAN+2)
#define INT_REG (unsigned char xdata*)(BASE_CAN+3)
#define IE_REG (unsigned char xdata*)(BASE_CAN+4)
#define ACC0_REG (unsigned char xdata*)(BASE_CAN+16)
#define ACC1_REG (unsigned char xdata*)(BASE_CAN+17)
#define ACC2_REG (unsigned char xdata*)(BASE_CAN+18)
#define ACC3_REG (unsigned char xdata*)(BASE_CAN+19)
#define ACM0_REG (unsigned char xdata*)(BASE_CAN+20)
#define ACM1_REG (unsigned char xdata*)(BASE_CAN+21)
#define ACM2_REG (unsigned char xdata*)(BASE_CAN+22)
#define ACM3_REG (unsigned char xdata*)(BASE_CAN+23)
#define BTR0_REG (unsigned char xdata*)(BASE_CAN+6)
#define BTR1_REG (unsigned char xdata*)(BASE_CAN+7)
#define OUT_REG (unsigned char xdata*)(BASE_CAN+8)
#define TEST_REG (unsigned char xdata*)(BASE_CAN+9)
#define ALC_REG (unsigned char xdata*)(BASE_CAN+11)
#define ECC_REG (unsigned char xdata*)(BASE_CAN+12)
#define EWL_REG (unsigned char xdata*)(BASE_CAN+13)
#define REC_REG (unsigned char xdata*)(BASE_CAN+14)
#define TEC_REG (unsigned char xdata*)(BASE_CAN+15)
#define RX_FRAME (unsigned char xdata*)(BASE_CAN+16)
#define TX_FRAME (unsigned char xdata*)(BASE_CAN+16)
#define RxMC_REG (unsigned char xdata*)(BASE_CAN+29)
#define RBSA_REG (unsigned char xdata*)(BASE_CAN+30)
#define CLK_REG (unsigned char xdata*)(BASE_CAN+31)
#define RX_REG (unsigned char xdata*)(BASE_CAN+16)
#define TX_REG (unsigned char xdata*)(BASE_CAN+16)
#include "REG51.h"
#include </C51/string.h>
#include </C51/intrins.h>
#include "can.h"
#include "sio.h"
MSG_BUF can_in;
MSG_BUF can_out;
unsigned char bdata sts;
sbit rdy=sts^0;
sbit ovr=sts^1;
sbit tbs=sts^2;
sbit tcs=sts^3;
sbit rs=sts^4;
sbit ts=sts^5;
sbit es=sts^6;
sbit bs=sts^7;
unsigned char bdata int_;
sbit int_ri=int_^0;
sbit int_ti=int_^1;
sbit int_ei=int_^2;
sbit int_oi=int_^3;
sbit int_wi=int_^4;
static void can_isr (void) interrupt 0 using 3
{
unsigned char i,len;
unsigned int id;
EA=0;
//sts=*(STS_REG);
int_=*(INT_REG);
if(int_ri)
{
i=(*(RX_REG))&0x0f;
len=i<8?i:8;
id=*(RX_REG+1);
id<<=8;
id|=*(RX_REG+2);
id>>=5;
can_in.ID=id;
can_in.LEN=i;
for (i=0; i < len; i++)
(can_in.BUF[i]) = *(RX_REG+i+3); // copy bytes
clr_rxbuf();
// SBUF = can_in.BUF[0];
SBUF = can_in.ID;
}
EA=1;
}
void can_init (void)
{
EA = 0;
*(CON_REG) = 0x01;
*(CLK_REG) = 0x88;//PeliCAN mode clock off
*(ACC0_REG) = 0x0;
*(ACC1_REG) = 0x70;
*(ACC2_REG) = 0x0;
*(ACC3_REG) = 0x70;
*(ACM0_REG) = 0xBF;
*(ACM1_REG) = 0xFF;
*(ACM2_REG) = 0xBF;
*(ACM3_REG) = 0xFF;
*(IE_REG) = 0x01;
*(BTR0_REG) = 0x1;
*(BTR1_REG) = 0x1C;
*(OUT_REG) = 0xAA;
*(RBSA_REG) = 0x0;
*(CON_REG) = 0x00;
IT0 = 0;
EX0 = 1;
PX0 = 1;
EA = 1;
// while ((*(STS_REG)) & 0x80);//wait until controller is active
}
void clr_rxbuf()
{
*(CMD_REG)=0x04;
}
//void clr_ovr()
//{
//()*(CMD_REG)=0x08;
//}
//void go_sleep()
//{
//()*(CMD_REG)=0x10;
//}
//void req_tx()
//{
//()*(CMD_REG)=0x01;
//}
//void stop_tx()
//{
//()*(CMD_REG)=0x02;
//}
//unsigned char check_busoff_state (void)
//{
// Check status register for bus-off state
// if ((*(STS_REG)) & 0x80)
// return (0xFF); // CAN controller is in bus-off
// else
// return (0); // CAN controller active
//}
//a example ,can_rxbuf---->rs232c txbuf
//char can_getmsg (void)
//{
//}
//unsigned char can_rbuflen (void)
//{
//}
void transmit_message ( MSG_BUF *pTransmitBuf )
{
unsigned long Identifier; // CAN message identifier
unsigned char Length; // lenght of data frame
unsigned char i; // local loop counter
// Prepare length code and identifier.
Length = pTransmitBuf->LEN<8 ?pTransmitBuf->LEN :8;
Identifier = (pTransmitBuf->ID << 5);
// Wait until write access to CAN controller buffer is allowed
while ( !((*(STS_REG)) & 0x04) );
// Write message to transmit buffer
*(TX_REG) = (unsigned char)Length;
*(TX_REG+2)= (unsigned char)Identifier; // write identifier
*(TX_REG+1)= (unsigned char)(Identifier >> 8); // write identifier
for (i=0; i < Length; i++) // write data bytes
*(TX_REG+3+i) = *(unsigned char *)(pTransmitBuf->BUF+i); // copy data byte
// Init a transmission request.
*(CMD_REG) = 0x01;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -