NewSpark 发表于 2013-11-26 15:16:55

关于CAN通信SJA100读写疑惑

因为对CAN通信不太了解,然后我在网上拍了一块STC89C52的CAN通信开发板做实验,但有一个很大的疑问,开发板有附送的程序,其中在发送程序中写到
void peli_caninit(void)
{
        unchar bdata state;
        do{
                SJA_MOD = RM_BIT | AFM_BIT;        0000 1001 //将模式寄存器的复位和滤波位置一
                state = SJA_MOD;
        }                
        while( !(state & RM_BIT) ); //确保模式寄存器为复位状态
   
        SJA_CDR= CANMode_BIT|CLKOff_BIT|CBP_BIT;// CDR.3=1--时钟关闭, .7=0---basic CAN, .7=1---Peli CAN
    SJA_BTR0 = 0x03;
    SJA_BTR1 = 0x1c;//16M晶振,波特率125Kbps
    SJA_IER= RIE_BIT;// .0=1--接收中断使能;.1=0--关闭发送中断使能
    SJA_OCR= NormalMode|Tx0PullDn|OCPOL1_BIT|Tx1PullUp;// 配置输出控制寄存器
    SJA_CMR= RRB_BIT;//释放接收缓冲器

    SJA_ACR0= 0x11;
    SJA_ACR1= 0x22;
    SJA_ACR2= 0x33;
    SJA_ACR3= 0x44;//初始化标示码 (扩展帧ID号)

    SJA_AMR0= 0xff;
    SJA_AMR1= 0xff;
    SJA_AMR2= 0xff;
    SJA_AMR3= 0xff;//初始化掩码(屏蔽地址)

        do{
                SJA_MOD = STM_BIT;0000 0100
                state = SJA_MOD;
        }
        while( !(state & SJA_MOD) ); //等待进入自检模式
}

void SJA_TX(unchar txdata)
{
        unchar tx_buffer;
        unchar data state;
        tx_buffer = 0x81;
        tx_buffer = 0x11;
        tx_buffer = 0x22;
        tx_buffer = 0x33;
        tx_buffer = 0x44;
       
        tx_buffer = txdata;
       
        do{
                state = SJA_SR;
        }
        while(state & RS_BIT);0001 0000 //接收状态位 0=空闲 1=正在工作
        do{
                state = SJA_SR;
        }       
        while(state & TS_BIT);0000 0010 //发送状态位 0=空闲 1=正在工作
        do{
      state = SJA_SR;
    }
    while(!(state & TBS_BIT)); //SR.2=0, 0000 0100 发送缓冲器被锁。等待 0=无法发送 1=空闲可以发送

        SJA_TBSR0 = tx_buffer;
        SJA_TBSR1 = tx_buffer;
        SJA_TBSR2 = tx_buffer;
        SJA_TBSR3 = tx_buffer;
        SJA_TBSR4 = tx_buffer;
        SJA_TBSR5 = tx_buffer;

        SJA_CMR = SRR_BIT; 0001 0000
}

直到 void SJA_TX(unchar txdata) 之上的程序我用逻辑分析仪分析数据都能理解,就是在void SJA_TX(unchar txdata)之后就产生一个疑问,
疑问就是以下几句
        do{
                state = SJA_SR;       (这一个句是从SJA1000中读数据赋予给state,然后进行以后的判断,在之前的程序中这个SJA_SR被定义的地址为 #define SJA_SR
                                                XBYTE这个里面的SJA_BASE_ADR的地址定义为 #define SJA_BASE_ADR 0xfe00 我的理解不知道是否正确,我的意思是否要事先向SJA1000写入地址 0xfe02 然后读出里面的相对应的寄存器里面的数据再赋予state数据, 但现实上MCU跟本就不是这样的,是直接读数据,现在我想问的问题是MCU怎么知道读出来的数据就是SJA_SR寄存器里面的数据呢)
        }
        while(state & RS_BIT);0001 0000 //接收状态位 0=空闲 1=正在工作

以上光标上的位置就是这个SJA_SR寄存器的工作时序,MCU一开始什么指令都不向SJA100发出就直接读取数据,这样读出来的数据MCU怎么知道是那个寄存器的数据呢

hbzxx 发表于 2014-7-24 20:38:59

能否把完整的例程发上来,大家一起看看啊?
页: [1]
查看完整版本: 关于CAN通信SJA100读写疑惑