📄 sja1000.c
字号:
#include "SJA1000.h"
#include "w78e58b.h"
#include "absacc.h"
extern unsigned char m_addr;
// ...CAN Buffer....
unsigned char m_CanSend[10];
unsigned char m_CanRecv[10];
unsigned char m_can_recv_in = 0;
unsigned char m_can_recv_out = 0;
unsigned char m_can_recvs = 0;
unsigned char xdata *m_pByte;
unsigned char xdata m_can_buf[MAX_CAN_RECV_LEN];
unsigned char xdata m_can_msg[MAX_MSG_LEN+1];
void SJA1000_init()
{
int j;
CAN_RST0 = 0;
for(j=0;j<100;j++);
CAN_RST0 = 1;
SJA_REG0_CR = 0x01;
SJA_REG0_ACR = m_addr;
SJA_REG0_AMR = 0x03; // 0000 00XX 000
SJA_REG0_BTR0 = 0x00;
SJA_REG0_BTR1 = 0x14;
SJA_REG0_OCR = 0xAA;
SJA_REG0_CDR = 0x48;
// Enter operate mode
SJA_REG0_CR = 0x1A; //Enable all interrupt
}
/* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
* Function:SJA1000_Send()
* Description:
* SJA1000 Send data
*/
bit SJA1000_Send()
{
unsigned char i;
unsigned char num;
unsigned char status;
status = SJA_REG0_SR;
//...wait send buffer(TBS) idle...
if (status & 0x04 == 0) return 0;
num = m_CanSend[1] & 0x0F;
num = num + 2;
for ( i = 0; i < num; i ++)
{
m_pByte = SJA_REG0 + 0x0A + i; // 0x0A: the offset of SJA_REG_TxBuf0
*m_pByte = m_CanSend[i];
}
SJA_REG0_CMD = 0x01; // Set TR bit
return 1;
}
/* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
* Function:SJA1000_ISR_1()
* Description:
* CAN interrupt service routine
*/
void SJA1000_ISR_0() interrupt 0 using 1
{
unsigned char i;
unsigned char num;
unsigned char dlc;
unsigned char status;
unsigned char iir;
iir = SJA_REG0_IR;
status = SJA_REG0_SR;
if (iir & 0x01) {//RI receive interrupt
m_CanRecv[0] = SJA_REG0_RxBuf0;
m_CanRecv[1] = SJA_REG0_RxBuf1;
dlc = m_CanRecv[1] & 0x0F;
for ( i = 0; i < dlc; i ++) {
m_pByte = SJA_REG0 + 0x16 + i; // 0x16: the offset of SJA_REG_RxBuf2
num = *m_pByte;
m_CanRecv[i + 2] = num;
}
SaveCanData(&m_CanRecv, dlc + 2);
SJA_REG0_CMD = 0x04; // Set RRB bit(Release receive buffer)
}
if (iir & 0x08) {//data overrun interrupt
SJA_REG0_CMD = 0x08; // Set CDO bit
}
}
void SaveCanData(unsigned char *p_data, unsigned char len)
{
unsigned char i;
if (MAX_CAN_RECV_LEN - m_can_recvs <= len) return; // Buffer full
for ( i = 0; i < len; i ++)
{
m_can_buf[m_can_recv_in] = p_data[i];
m_can_recv_in = m_can_recv_in + 1;
m_can_recv_in = m_can_recv_in % MAX_CAN_RECV_LEN;
}
m_can_recvs = m_can_recvs + len;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -