⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sja1000.c

📁 sja1000与51单片机的功能实现源代码
💻 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 + -