51 SJA1000+PCA82C251自收发检测,为什么通信失败

SJA1000 自收发卡在等待发送完成检测里

我原理图是这样

img

没有发送成功
把最后一句发送完成等待删除while(SJA_SR != TCS_BIT);,按下按键灯执行发送函数灯亮。但是加上等待完成就没反应了。也进入不了接收,是因为发送实际上没有成功。但是不确定是因为代码还是硬件
怎么才可以正常发送完成并自接收进入接收中断呢?


#include <STC12C.h>
#include <intrins.h>
#include "sjapelican.h"
#include "config.h"

#define uint unsigned int
#define uchar unsigned char


void mDelay(uint16 mtime)
{
    for(; mtime > 0; mtime--)
    {
        uint8 j = 244;
        while(--j);
    }    
}

void INT0_Data(void) interrupt 2
{//INT0дݼΪ݆˽дݼ
    EA = 0;
    
    Txd_data++; //զԢ݆˽ޡڻìҢΪսע̍ք˽ߝ
    Peli_TXD();
    P20 = 1;
    P20 = 0;
    EA = 1;
}

void Peli_RXD(void) interrupt 0
{//ޓ˕˽ߝگ˽ì՚א׏ؾϱԌѲאַԃ
    
    uint8 data Status;
    
    EA = 0;//ژCPUא׏
    Status = SJA_IR;
    if(Status & RI_BIT)
    {//IR.0 = 1 ޓ˕א׏
        RX_buffer[0] =  SJA_RBSR0;
        RX_buffer[1] =  SJA_RBSR1;
        RX_buffer[2] =  SJA_RBSR2;
        RX_buffer[3] =  SJA_RBSR3;
        RX_buffer[4] =  SJA_RBSR4;
        RX_buffer[5] =  SJA_RBSR5;
        RX_buffer[6] =  SJA_RBSR6;
        RX_buffer[7] =  SJA_RBSR7;
        RX_buffer[8] =  SJA_RBSR8;
        RX_buffer[9] =  SJA_RBSR9;
        RX_buffer[10] =  SJA_RBSR10;
        RX_buffer[11] =  SJA_RBSR11;
        RX_buffer[12] =  SJA_RBSR12;

        SJA_CMR = RRB_BIT;
        Status = SJA_ALC;//ˍ؅יӃ̦ʱҶ׽݄զǷ
        Status = SJA_ECC;//ˍ؅խϳպëҶ׽݄զǷ
    }
    SJA_IER = RIE_BIT;// .0=1--ޓ˕א׏ʹŜû

    Rxd_data = RX_buffer[5];
    
    EA = 1;//ղߪCPUא׏
}

void MCU_Init(void)
{
    //CPUԵʼۯ
    SJA_RST = 0;//SJA1000شλԐЧ
    mDelay(10);    //ғʱ
    SJA_RST = 1;//CAN؜Пشλڜޅ,شλϞЧnnn
    SJA_CS = 0;//CAN؜ПƬѡԐЧ
    EX1 = 1;//΢ҿא׏1ʹŜûCAN؜Пޓ˕א׏
    IT1 = 1;//΢ҿא׏0غҟҘԥע
    IT0 = 0;//CAN؜Пޓ˕א׏ì֍֧ƽԥע
    EX0 = 1;//ղߪ΢ҿא׏0 
    EA = 1; //ղߪ؜א׏
}

void main(void)
{
    MCU_Init();
    Peli_Init();
    P20 = 1;
    //mDelay(1);
    while(1)
    {  
        
    }
}

void Peli_Init(void)
{//SJA1000 քԵʼۯ
    uint8 bdata Status;
    do
    {//.0=1---reset MODRe,޸ɫشλģʽìӔңʨ׃РӦք݄զǷ
     //؀ֹδ޸ɫشλģʽìטشдɫ
        SJA_MOD = RM_BIT |AFM_BIT;
        Status = SJA_MOD ;
    }
    while(!(Status & RM_BIT));

    SJA_CDR  = CANMode_BIT|CLKOff_BIT;// CDR.3=1--ʱדژҕ, .7=0---basic CAN, .7=1---Peli CAN
    SJA_BTR0 = 0x02;
    SJA_BTR1 = 0x2f;//16MާֱìҨ͘Ê250Kbps
    SJA_IER  = RIE_BIT;// .0=1--ޓ˕א׏ʹŜû  .1=0--ژҕע̍א׏ʹŜ
    SJA_OCR  = 0x1a;// Ƥ׃ˤԶ࠘׆݄զǷ
    SJA_CMR  = RRB_BIT;//ˍ؅ޓ˕ۺԥǷ

    SJA_ACR0  = 0x01;
    SJA_ACR1  = 0x02;
    SJA_ACR2  = 0x03;
    SJA_ACR3  = 0x04;//ԵʼۯҪʾë

    SJA_AMR0  = 0xff;
    SJA_AMR1  = 0xff;
    SJA_AMR2  = 0xff;
    SJA_AMR3  = 0xff;//ԵʼۯҚë

    do
    {//ȷѣ޸ɫؔޓ˕ģʽ
    SJA_MOD   = STM_BIT;
    Status  = SJA_MOD;
    }
    while( !(Status & STM_BIT) );

}//SJA1000 քԵʼۯ

void Peli_TXD( void )
{
    uint8 data Status;
//ԵʼۯҪʾëͷхϢ
    TX_buffer[0] = 0x88;//.7=0)չ֡û.6=0˽ߝ֡; .3=1˽ߝӤ׈
    TX_buffer[1] = 0x01;//Ѿޚַ֣֘
    TX_buffer[2] = 0x02;//
    TX_buffer[3] = 0x03;//
    TX_buffer[4] = 0x04;//

//Եʼۯע̍˽ߝեԪ
    TX_buffer[5]  = Txd_data;
    TX_buffer[6]  = 0x22;
    TX_buffer[7]  = 0x33;
    TX_buffer[8]  = 0x44;//
    TX_buffer[9]  = 0x55;//
    TX_buffer[10] = 0x66;//
    TX_buffer[11] = 0x77;//
    TX_buffer[12] = 0x88;//

    do
    {
        Status = SJA_SR;
    }
    while( Status & RS_BIT);  //SR.4=1 ֽ՚ޓ˕ìֈս
    
    do
    {
        Status = SJA_SR;
    }
    while(!(Status & TCS_BIT)); //SR.3=0,ע̍ȫȳδԦmΪìֈս

    do
    {
        Status = SJA_SR;
    }
    while(!(Status & TBS_BIT)); //SR.2=0,ע̍ۺԥǷѻ̸cֈս

    SJA_TBSR0  = TX_buffer[0];
    SJA_TBSR1  = TX_buffer[1];
    SJA_TBSR2  = TX_buffer[2];
    SJA_TBSR3  = TX_buffer[3];
    SJA_TBSR4  = TX_buffer[4];
    SJA_TBSR5  = TX_buffer[5];
    SJA_TBSR6  = TX_buffer[6];
    SJA_TBSR7  = TX_buffer[7];
    SJA_TBSR8  = TX_buffer[8];
    SJA_TBSR9  = TX_buffer[9];
    SJA_TBSR10 = TX_buffer[10];
    SJA_TBSR11 = TX_buffer[11];
    SJA_TBSR12  = TX_buffer[12];

    SJA_CMR = SRR_BIT;//׃λؔע̍ޓ˕ȫȳ

    while(SJA_SR != TCS_BIT);
    
}

为啥注释是乱码

基于51单片机SJA1000 CAN通讯实现(代码+原理图)
https://blog.csdn.net/chen1658137632/article/details/116381159