打印
[CAN-bus/DeviceNet]

2节点收发问题

[复制链接]
1734|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fatRonaldo|  楼主 | 2007-7-13 11:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2个节点都通过了单节点测试,2个节点收发时不能通讯,示波器测2个节点的中断脚都没有中断信号!这是怎么回事?

//--------------------------------------------------------------
void SJA_Init(void)
{
    unsigned char temp;
    
    do
    {
        SJA_Write(REG_CONTROL, 0x01);
        temp = SJA_Read(REG_CONTROL);        
    }
    while (!(temp & 0x01));        

    SJA_Write(REG_BTR0, 0x05);
    SJA_Write(REG_BTR1, 0xff);

    SJA_Write(REG_ACR, 0xaa);
    SJA_Write(REG_AMR, 0x00);

    SJA_Write(REG_CDR, 0xaa);
    SJA_Write(REG_OCR, 0x48);

    do
    {
        SJA_Write(REG_CONTROL, 0x06);
        temp = SJA_Read(REG_CONTROL);        
    }
    while(!(temp & 0x06));    

        
}


//--------------------------------------------------------------
void SJA_SendBuf(void)
{
    unsigned char i;
    unsigned char temp;
    unsigned char TxBufB;

    TxBufB = REG_TxBuffer1;
    
    while ((SJA_Read(REG_STATUS) & 0x04) == 0);        // 等待发送缓冲区释放
        
    for (i=0; i<10; i++)
    {
        SJA_Write(TxBufB++, TxData);
    }

    SJA_Write(REG_COMMAND, 0x01);

    temp = SJA_Read(REG_STATUS);
    PC_send(temp);

    
}


//--------------------------------------------------------------
void SJA_ReceiveBuf(void)
{
    unsigned char i;
    unsigned char RxBufB;

    RxBufB = REG_RxBuffer1;

    while ((SJA_Read(REG_STATUS) & 0x01) == 0);
    for (i=0; i<10; i++)
    {
        RxData = SJA_Read(RxBufB++);
    }

    SJA_Write(REG_COMMAND, 0x04);
}


//--------------------------------------------------------------
void SJA_INT(void) interrupt 0 using 1      
{
    unsigned char status;
    unsigned char temp;
    EX0 = 0;
    status = SJA_Read(REG_INTERRUPT);    
    temp = status & 0x02;
    if(temp == 0x02)                             
    {        
      ;
    }
    
    temp = status & 0x01;
    if(temp == 0x01)                           
    {
        
        CAN_RxFlag = 1;
    }  

    EX0 = 1;

}
//节点1主程序
void main(void)
{

    MCU_Init();
    PC_send(0x01);
    SJA_Init();
    PC_send(0x02);

    ANOLD = AN;



    while (1)
    {
        while (AN == ANOLD);
        AN = ANOLD;
        SJA_SendBuf();
        BEEP = 0;
        Delay(500);
        BEEP = 1;

        while (CAN_RxFlag == 0);
        CAN_RxFlag = 0;
        SJA_ReceiveBuf();
        BEEP = 0;
        Delay(100);
        BEEP = 1;
        Delay(100);
        BEEP = 1;        
    }
    
}
//节点2主程序
void main(void)
{
    unsigned char temp;
    MCU_Init();
    SJA_Init();
    while (1)
    {
        
        if (CAN_RxFlag == 1)
        {
            CAN_RxFlag = 0;
            SJA_ReceiveBuf();
            BEEP = 0;
            Delay(100);
            BEEP = 1;
            Delay(100);
            BEEP = 1;

            Delay(100);
            SJA_SendBuf();
            BEEP = 0;
            Delay(100);
            BEEP = 1;
        }
    }    
}

相关帖子

沙发
桂电飞天鼠| | 2007-7-14 15:35 | 只看该作者

rt

问题:
    do
    {
        SJA_Write(REG_CONTROL, 0x06);
        temp = SJA_Read(REG_CONTROL);        
    }
    while(!(temp & 0x06));
--------------------------------------------
    初始化中,这个是用来做什么的?写的命令寄存器吗?如果不是,那以下这个初始化中的语句不是用来进入复位模式吗?如是为了进入复位模式,那上面的这个写的值(0x06)又是什么意思?进入自测试模式又进入仅听模式?
    do
    {
        SJA_Write(REG_CONTROL, 0x01);
        temp = SJA_Read(REG_CONTROL);        
    }
    while (!(temp & 0x01));

其它的粗略看了一下,感觉主程序的风格不是很好的说~~~还有接收与处理也比较粗糙了些,可能有误。可以参考一下周工网站的例程或其他网友的程序~~

SJA的初始化很重要,波特率要算好,如果是Peli模式,屏蔽与验收均有四个要设置(好像你只设了一个)。SJA寄存器中断使能你有打开了没?(在这没发现)建议参考别人的看看,熟悉总体的流程之后再尝试按自己的风格去写。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

25

帖子

1

粉丝