21ic电子技术开发论坛 综合技术交流 工控、机电一体化 求助!2个节点调试(附代码及故障码)
发新帖我要提问
返回列表
打印
[CAN-bus/DeviceNet]

求助!2个节点调试(附代码及故障码)

[复制链接]
1658|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fatRonaldo|  楼主 | 2007-7-5 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用了2个节点,1个节点发送0xaa给节点2,2节点收到发送0x55给一节点,过程中用串口跟踪个寄存器状态!

节点1上传给串口的数据:00 01 02 01 01 aa 03 01 a6
节点1程序:
//======================================================
unsigned char xdata *SJA_BasicAddr;

unsigned char PC_BUF;

sbit LED = P1^6;
sbit BEEP = P1^7;


#define OK 0
#define ERROR 1

//======================================================




extern bit SJA_TestCommunication(void);
extern bit SJA_EnterRestModel(void);
extern bit SJA_QuitResetModel(void);
extern void SJA_SetInterrupt(unsigned char interruptMode);
extern  void SJA_SetBaudRate(unsigned char baudRateNum);
extern void SJA_SetObject(unsigned char acr, unsigned char amr);
extern void SJA_SetOutandClock(unsigned char outControl, unsigned char clockOut);
void MCU_Init(void);
void Delay(unsigned int Delay_time);
bit SJA_Init(void);
void send(unsigned char S_Data);



       
//-------------------------------------------------------------------
bit SJA_TestCommunication(void)
{
    SJA_BasicAddr = REG_TEST;
    *SJA_BasicAddr = 0xAA;
    
    if (*SJA_BasicAddr == 0xAA)
    {
        return OK;
    }
    else
    {
        return ERROR;
    }

}


   
//-------------------------------------------------------------------

bit SJA_EnterRestModel(void)
{
    unsigned char temp;
    
    SJA_BasicAddr = REG_CONTROL;
    temp = *SJA_BasicAddr;
    *SJA_BasicAddr = temp |RR_CTR;        // 置位复位请求位
    
    if ((*SJA_BasicAddr & RR_CTR) == 1)
    {
        return OK;
    }
    else
    {
        return ERROR;
    }
}


        
//-------------------------------------------------------------------
 bit SJA_QuitResetModel(void)
{
    unsigned char temp;

    SJA_BasicAddr = REG_CONTROL;
    temp = *SJA_BasicAddr;
    *SJA_BasicAddr = temp & (~RR_CTR);

    if ((*SJA_BasicAddr & RR_CTR) == 1)
    {
        return ERROR;
    }
    else
    {
        return OK;
    }

}




//-------------------------------------------------------------------
//参数说明:                 
//返回值:     无            
//说明: 该函数用于设定再系统晶体为16MHz时常用的
//              标准波特率的值。
//-------------------------------------------------------------------
unsigned char code SJA_BTR_TABLE[] = {
0xbf, 0xff,        // 5Kbps时的波特率
0x67, 0x2f,        // 10Kbps时的波特率
0x53, 0x2f,        // 20Kbps时的波特率
0x87, 0xff,        // 40Kbps时的波特率
0x47, 0x2f,        // 50Kbps时的波特率
0x83, 0xff,        // 80Kbps时的波特率
0x43, 0x2f,        // 100Kbps时的波特率
0x03, 0x1c,        // 125Kbps时的波特率
0x81, 0xfa,        // 200Kbps时的波特率
0x01, 0x1c,        // 250Kbps时的波特率
0x80, 0xfa,        // 400Kbps时的波特率
0x00, 0x1c,        // 500Kbps时的波特率
0x80, 0xb6,        // 666Kbps时的波特率
0x00, 0x16,        // 800Kbps时的波特率
0x00, 0x14        // 1000Kbps时的波特率
};

 void SJA_SetBaudRate(unsigned char baudRateNum)
{
    unsigned char btr0, btr1;
    
    btr0 = SJA_BTR_TABLE[2*baudRateNum];
    btr1 = SJA_BTR_TABLE[2*baudRateNum+1];

    SJA_BasicAddr = REG_BTR0;
    *SJA_BasicAddr = btr0;
    SJA_BasicAddr = REG_BTR1;
    *SJA_BasicAddr = btr1;
}


                                                                                                                                             
//-------------------------------------------------------------------
void SJA_SetObject(unsigned char acr, unsigned char amr)
 {
    SJA_BasicAddr = REG_ACR;
    *SJA_BasicAddr = acr;
    SJA_BasicAddr = REG_AMR;
    *SJA_BasicAddr = amr;
 }


                                                                                                     
//-------------------------------------------------------------------
void SJA_SetOutandClock(unsigned char outControl, unsigned char clockOut)
 {
    SJA_BasicAddr = REG_OUTCTR;
    *SJA_BasicAddr = outControl;

    SJA_BasicAddr = REG_CDR;
    *SJA_BasicAddr = clockOut;
 }



//-------------------------------------------------------------------
//
//-------------------------------------------------------------------
bit SJA_Init(void)
{
    while (SJA_TestCommunication() == ERROR);    // 测试连接
    while (SJA_EnterRestModel() == ERROR);
    SJA_SetBaudRate(6);
    SJA_SetObject(0x01, 0xfc);
    SJA_SetOutandClock(0xaa, 0x48);
    while (SJA_QuitResetModel() == ERROR);    

    return 0;
}



//-------------------------------------------------------------------------
void MCU_Init(void)
{
     PC_BUF = 0x77;    
    TMOD = 0x20;
    TH1 = 0xfd;
    TL1 = 0xfd;
    TR1 = 1;
    SCON = 0xd8;
    PCON = 0x00;
    EA = 1;
    ES = 1;
}



void Send(unsigned char S_Data)
{
    SBUF = S_Data;
    while(TI == 0);
    TI =0;
}



//--------------------------------------------------------------------------
void Delay(unsigned int Delay_time)
{
    unsigned int i;
    unsigned char t;

    for (i=Delay_time; i>0; i--)
        for (t=100; t>0; t--)
            {
                ;
            }
}





//----------------------------------------------------------------------------------------
void main(void)
{
    unsigned char temp;
    
    Delay(1000);
    MCU_Init();
    if (SJA_Init() == 0)
    {
        send(0x00);
    }

    LED =0;
    BEEP = 0;
    Delay(1000);
    LED = 1;
    BEEP = 1;
    send(0x01);


    while (1)
    {
        SJA_BasicAddr = REG_STATUS;                        //检查发送缓冲区状态
        while ((*SJA_BasicAddr & TBS_STA) != TBS_STA);
        send(0x02);

        SJA_BasicAddr = REG_TxBuffer1;
        *SJA_BasicAddr = 0x01;
        temp = *SJA_BasicAddr;
        send(temp);
        SJA_BasicAddr = REG_TxBuffer2;
        *SJA_BasicAddr= 0x01;
        temp = *SJA_BasicAddr;
        send(temp);
        SJA_BasicAddr = REG_TxBuffer3;
        *SJA_BasicAddr = 0xaa;
        temp = *SJA_BasicAddr;
        send(temp);

        SJA_BasicAddr = REG_COMMAND;
        *SJA_BasicAddr = TR_CMD;
        temp = *SJA_BasicAddr;
        send(0x03);
        send(temp);

        SJA_BasicAddr = REG_STATUS;
        temp = *SJA_BasicAddr;
        send(temp);
        while ((*SJA_BasicAddr & TCS_STA) != TCS_STA);
        temp = *SJA_BasicAddr;
        send(0x05);
        send (0x04);




        SJA_BasicAddr = REG_STATUS;
        while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);
        send(0x04);
        SJA_BasicAddr = REG_RxBuffer1;
        temp = *SJA_BasicAddr;
        send(temp);
        SJA_BasicAddr = REG_RxBuffer2;
        temp = *SJA_BasicAddr;
        send(temp);
        SJA_BasicAddr = REG_RxBuffer3;
        temp = *SJA_BasicAddr;
        send(temp);


        LED =0;
        BEEP = 0;
        Delay(1000);
        LED = 1;
        BEEP = 1;

        SJA_BasicAddr = REG_COMMAND;
        *SJA_BasicAddr = RRB_CMD;            

        SJA_BasicAddr = REG_STATUS;
        while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);
        send(0x05);
    }

节点2上传给串口数据:00 01 d1 03 cf 50 B8 04 05 
节点2程序:
//======================================================
unsigned char xdata *SJA_BasicAddr;

unsigned char PC_BUF;

sbit LED = P1^6;
sbit BEEP = P1^7;


#define OK 0
#define ERROR 1

//======================================================




extern bit SJA_TestCommunication(void);
extern bit SJA_EnterRestModel(void);
extern bit SJA_QuitResetModel(void);
extern void SJA_SetInterrupt(unsigned char interruptMode);
extern  void SJA_SetBaudRate(unsigned char baudRateNum);
extern void SJA_SetObject(unsigned char acr, unsigned char amr);
extern void SJA_SetOutandClock(unsigned char outControl, unsigned char clockOut);
void MCU_Init(void);
void Delay(unsigned int Delay_time);
bit SJA_Init(void);
void send(unsigned char S_Data);



       
//-------------------------------------------------------------------
bit SJA_TestCommunication(void)
{
    SJA_BasicAddr = REG_TEST;
    *SJA_BasicAddr = 0xAA;
    
    if (*SJA_BasicAddr == 0xAA)
    {
        return OK;
    }
    else
    {
        return ERROR;
    }

}


   
//-------------------------------------------------------------------

bit SJA_EnterRestModel(void)
{
    unsigned char temp;
    
    SJA_BasicAddr = REG_CONTROL;
    temp = *SJA_BasicAddr;
    *SJA_BasicAddr = temp |RR_CTR;        // 置位复位请求位
    
    if ((*SJA_BasicAddr & RR_CTR) == 1)
    {
        return OK;
    }
    else
    {
        return ERROR;
    }
}


        
//-------------------------------------------------------------------
 bit SJA_QuitResetModel(void)
{
    unsigned char temp;

    SJA_BasicAddr = REG_CONTROL;
    temp = *SJA_BasicAddr;
    *SJA_BasicAddr = temp & (~RR_CTR);

    if ((*SJA_BasicAddr & RR_CTR) == 1)
    {
        return ERROR;
    }
    else
    {
        return OK;
    }

}




//-------------------------------------------------------------------
//参数说明:                 
//返回值:     无            
//说明: 该函数用于设定再系统晶体为16MHz时常用的
//              标准波特率的值。
//-------------------------------------------------------------------
unsigned char code SJA_BTR_TABLE[] = {
0xbf, 0xff,        // 5Kbps时的波特率
0x67, 0x2f,        // 10Kbps时的波特率
0x53, 0x2f,        // 20Kbps时的波特率
0x87, 0xff,        // 40Kbps时的波特率
0x47, 0x2f,        // 50Kbps时的波特率
0x83, 0xff,        // 80Kbps时的波特率
0x43, 0x2f,        // 100Kbps时的波特率
0x03, 0x1c,        // 125Kbps时的波特率
0x81, 0xfa,        // 200Kbps时的波特率
0x01, 0x1c,        // 250Kbps时的波特率
0x80, 0xfa,        // 400Kbps时的波特率
0x00, 0x1c,        // 500Kbps时的波特率
0x80, 0xb6,        // 666Kbps时的波特率
0x00, 0x16,        // 800Kbps时的波特率
0x00, 0x14        // 1000Kbps时的波特率
};

 void SJA_SetBaudRate(unsigned char baudRateNum)
{
    unsigned char btr0, btr1;
    
    btr0 = SJA_BTR_TABLE[2*baudRateNum];
    btr1 = SJA_BTR_TABLE[2*baudRateNum+1];

    SJA_BasicAddr = REG_BTR0;
    *SJA_BasicAddr = btr0;
    SJA_BasicAddr = REG_BTR1;
    *SJA_BasicAddr = btr1;
}


                                                                                                                              
//-------------------------------------------------------------------
void SJA_SetObject(unsigned char acr, unsigned char amr)
 {
    SJA_BasicAddr = REG_ACR;
    *SJA_BasicAddr = acr;
    SJA_BasicAddr = REG_AMR;
    *SJA_BasicAddr = amr;
 }

                                                                                                 
//-------------------------------------------------------------------
void SJA_SetOutandClock(unsigned char outControl, unsigned char clockOut)
 {
    SJA_BasicAddr = REG_OUTCTR;
    *SJA_BasicAddr = outControl;

    SJA_BasicAddr = REG_CDR;
    *SJA_BasicAddr = clockOut;
 }



//-------------------------------------------------------------------
//
//-------------------------------------------------------------------
bit SJA_Init(void)
{
    while (SJA_TestCommunication() == ERROR);    // 测试连接
    while (SJA_EnterRestModel() == ERROR);
    SJA_SetBaudRate(6);
    SJA_SetObject(0x02, 0xfc);
    SJA_SetOutandClock(0xaa, 0x48);
    while (SJA_QuitResetModel() == ERROR);    

    return 0;
}



//-------------------------------------------------------------------------
void MCU_Init(void)
{
     PC_BUF = 0x77;    
    TMOD = 0x20;
    TH1 = 0xfd;
    TL1 = 0xfd;
    TR1 = 1;
    SCON = 0xd8;
    PCON = 0x00;
    EA = 1;
    ES = 1;
}



void Send(unsigned char S_Data)
{
    SBUF = S_Data;
    while(TI == 0);
    TI =0;
}




//--------------------------------------------------------------------------
void Delay(unsigned int Delay_time)
{
    unsigned int i;
    unsigned char t;

    for (i=Delay_time; i>0; i--)
        for (t=100; t>0; t--)
            {
                ;
            }
}



//----------------------------------------------------------------------------------------
void main(void)
{
    unsigned char temp;
    
    Delay(1000);
    MCU_Init();
    if (SJA_Init() == 0)
    {
        send(0x00);
    }

    LED =0;
    BEEP = 0;
    Delay(1000);
    LED = 1;
    BEEP = 1;
    send(0x01);


    while (1)
    {
        SJA_BasicAddr = REG_STATUS;
        temp = *SJA_BasicAddr;
        send(temp);
        while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);
        send(0x03);

        SJA_BasicAddr = REG_RxBuffer1;
        temp = *SJA_BasicAddr;
        send(temp);
        SJA_BasicAddr = REG_RxBuffer2;
        temp = *SJA_BasicAddr;
        send(temp);
        SJA_BasicAddr = REG_RxBuffer3;
        temp = *SJA_BasicAddr;
        send(temp);


        LED =0;
        BEEP = 0;
        Delay(1000);
        LED = 1;
        BEEP = 1;

        SJA_BasicAddr = REG_COMMAND;
        *SJA_BasicAddr = RRB_CMD;    
        send(0x04);

        SJA_BasicAddr = REG_STATUS;        
        while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);
        send(0x05);
        


        SJA_BasicAddr = REG_STATUS;                        //检查发送缓冲区状态
        while ((*SJA_BasicAddr & TBS_STA) != TBS_STA);
        send(0x02);

        SJA_BasicAddr = REG_TxBuffer1;
        *SJA_BasicAddr = 0x02;
        SJA_BasicAddr = REG_TxBuffer2;
        *SJA_BasicAddr= 0x01;
        SJA_BasicAddr = REG_TxBuffer3;
        *SJA_BasicAddr = 0x55;

        SJA_BasicAddr = REG_COMMAND;
        *SJA_BasicAddr = TR_CMD;

        SJA_BasicAddr = REG_STATUS;                        //等待发送完毕
        while ((*SJA_BasicAddr & TCS_STA) != TCS_STA);
        send(0x03);



    }

    

    
}


问题出在那里呢?

相关帖子

沙发
fatRonaldo|  楼主 | 2007-7-5 15:34 | 只看该作者

re

串口1上报的数据A6为状态寄存器的值,总线关闭!!!
为什么会这个样子的?

使用特权

评论回复
板凳
fatRonaldo|  楼主 | 2007-7-5 16:01 | 只看该作者

re

补充一下:
硬件方面除了RST脚是接的51K与10U的阻容组成的低电平复位电路,其他的跟周立功网上的一样!

使用特权

评论回复
地板
fatRonaldo|  楼主 | 2007-7-5 23:06 | 只看该作者

re

没人指点的吗

使用特权

评论回复
5
xhtxzxw| | 2007-7-6 13:16 | 只看该作者

是不是复位时间太长了?

用的是SJA10吧?是不是复位时间太长了?时间常数很大啊!T=51K*10u=?啊!
你的main()里面虽然有 Delay(1000),但远远的远远的不够!加电了,SJA1000还迷迷糊糊的没清醒过来呢,你的main()就做初始化了

使用特权

评论回复
6
fatRonaldo|  楼主 | 2007-7-6 16:32 | 只看该作者

re

初始化的问题搞定了

现在出来新的问题:初始化成功后读出的状态寄存器的值是0x0c,我用的是basic模式,接着向TXBUF0,TXBUF1,TXBUF2中分别写入0xaa(ID高8位),0x01(数据帧,数据长度1位),0x66(数据)后,启动发送命令向REG_COMMAND中写入0x01后,延时一段时间,在检测TCS(发送完毕位),一直是未发送完!
进一步检测,当写完REG_COMMAND后,回读REG_COMMAND,其值为0xff,资料上说REG_COMMAND只写,读出来后是0x00?
这是为什么????

使用特权

评论回复
7
fatRonaldo|  楼主 | 2007-7-6 16:39 | 只看该作者

re

发送未完成有没有这种可能:因为这个节点与总线连接有硬件问题,所以发送不成功?
手册上没有找到相关资料,请大家指教!

使用特权

评论回复
8
fatRonaldo|  楼主 | 2007-7-6 16:54 | 只看该作者

re 最新调试程序(发送节点的)

//----------------------------------------------------------------------------------------
void main(void)
{
    unsigned char temp;
    
    Delay(1000);
    Delay(1000);
    Delay(1000);
    Delay(1000);
    MCU_Init();
    Delay(1000);

    RST = 1;
    RST = 1;
    RST = 1;
    Delay(1000);
    RST = 0;
    RST = 0;
    Delay(1000);
    RST = 1;
    RST = 1;
    
        
    temp = SJA_EnterRestModel();
    
    
//    SJA_SetBaudRate();
    SJA_BasicAddr = BASIC_ADDR + REG_BTR0;
    *SJA_BasicAddr = 0x09;
    SJA_BasicAddr = BASIC_ADDR + REG_BTR1;
    *SJA_BasicAddr = 0x1c;
    
//    SJA_SetObject(0xaa, 0x00);
    SJA_BasicAddr = BASIC_ADDR + REG_ACR;
    *SJA_BasicAddr = 0xaa;
    SJA_BasicAddr = BASIC_ADDR + REG_AMR;
    *SJA_BasicAddr = 0x00;


//    SJA_SetOutandClock(0xaa, 0x48);
    SJA_BasicAddr = BASIC_ADDR + REG_OUTCTR;
    *SJA_BasicAddr = 0xaa;
    SJA_BasicAddr = BASIC_ADDR + REG_CDR;
    *SJA_BasicAddr = 0x48;

    SJA_BasicAddr = BASIC_ADDR + REG_CONTROL;
    *SJA_BasicAddr = 0x1e;
    
    temp = SJA_QuitResetModel();

    
    LED =0;
    BEEP = 0;
    Delay(1000);
    LED = 1;
    BEEP = 1;
    send(0x01);


    Delay(1000);
    Delay(1000);


    while (1)
    {

//-----------------------------发送部分--------------------------------------

        SJA_BasicAddr = BASIC_ADDR + REG_STATUS;                        // 检测状态寄存器的值
        temp = *SJA_BasicAddr;
        send(temp);
        
        while((*SJA_BasicAddr & TCS_STA) != TCS_STA);                        // 等待上次发送完毕
        
        while ((*SJA_BasicAddr & TBS_STA) != TBS_STA);                    // 等待发送缓冲区释放
        send(0x02);

        SJA_BasicAddr = BASIC_ADDR + REG_STATUS;                        // 检测状态寄存器的值
        temp = *SJA_BasicAddr;
        send(temp);

        SJA_BasicAddr = BASIC_ADDR + REG_TxBuffer1;                        // 送ID号高8位:01010101
        *SJA_BasicAddr = 0x55;
        temp = *SJA_BasicAddr;
        send(temp);
        
        SJA_BasicAddr = BASIC_ADDR + REG_TxBuffer2;                        // 送ID号低3位,数据标志位,长度:000 0 0001
        *SJA_BasicAddr= 0x01;
        temp = *SJA_BasicAddr;
        send(temp);
        
        SJA_BasicAddr = BASIC_ADDR + REG_TxBuffer3;                        // 发送数据0x66
        *SJA_BasicAddr = 0x66;
        temp = *SJA_BasicAddr;
        send(temp);


        SJA_BasicAddr = BASIC_ADDR + REG_STATUS;                        // 检测状态寄存器的值
        temp = *SJA_BasicAddr;
        send(temp);
        

        SJA_BasicAddr = BASIC_ADDR + REG_COMMAND;                        // 启动发送命令
        *SJA_BasicAddr = 0x01;
        temp = *SJA_BasicAddr;
        send(temp);
        send(0x03);


        Delay(1000);                                                        // 延时
        Delay(1000);

        SJA_BasicAddr = BASIC_ADDR + REG_STATUS;                        // 检测状态寄存器的值
        temp = *SJA_BasicAddr;
        send(temp);


        SJA_BasicAddr = BASIC_ADDR + REG_COMMAND;                        // 终止发送
        *SJA_BasicAddr = 0x02;

        SJA_BasicAddr = BASIC_ADDR + REG_STATUS;                        // 检测状态寄存器的值
        temp = *SJA_BasicAddr;
        send(temp);

        
        while ((*SJA_BasicAddr & TCS_STA) != TCS_STA);                    // 等待发送完毕
        temp = *SJA_BasicAddr;
        send (0x04);


//---------------------------接收部分-----------------------------------------


        SJA_BasicAddr = BASIC_ADDR + REG_STATUS;                        // 检测状态寄存器的值
        temp = *SJA_BasicAddr;
        send(temp);
        

        SJA_BasicAddr = BASIC_ADDR + REG_STATUS;
        while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);                    // 等待接收缓冲区有数据
        send(0x05);

        
        SJA_BasicAddr = BASIC_ADDR + REG_RxBuffer1;                        //读取ID 号
        temp = *SJA_BasicAddr;
        send(temp);
        
        SJA_BasicAddr = BASIC_ADDR + REG_RxBuffer2;                                    // 读取ID号低3位、数据标志位、数据长度                
        temp = *SJA_BasicAddr;
        send(temp);

        
        SJA_BasicAddr = BASIC_ADDR + REG_RxBuffer3;                        // 读取数据
        temp = *SJA_BasicAddr;
        send(temp);


        SJA_BasicAddr = BASIC_ADDR + REG_COMMAND;                        // 释放接收缓冲区
        *SJA_BasicAddr = RRB_CMD;


        SJA_BasicAddr = BASIC_ADDR + REG_STATUS;                        // 检查接收缓冲区状态
        while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);
        send(0x06);
        
        LED =0;
        BEEP = 0;
        Delay(1000);
        LED = 1;
        BEEP = 1;    
    }
    
}


现在的问题,是跟踪到启动发送命令后,查询发送完成标志位,一直都是发送未完成!!!

使用特权

评论回复
9
fatRonaldo|  楼主 | 2007-7-6 16:55 | 只看该作者

补充

send()是向串口发送数据,用于跟踪程序!

使用特权

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

本版积分规则

7

主题

25

帖子

1

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部