原创 调试SJA1000的Basic模式经历

2009-8-11 22:37 4329 11 11 分类: MCU/ 嵌入式

1.P0口作为输入输出端口时,通过端口观察看到有一位没有变化,检查硬件电路看到,上拉电阻引脚断开.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


2.变址间接寻址方式中,设基址为0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />7f00,变址为0x00,0x01,0x02,0x03…..通过端口并不能看到P0P2的变化,此时为第二功能用,要观察的是DPTR寄存器的内容.


3.在在执行BCAN_DATA_WRITE(unsigned char *SendDataBuf)函数时,始终判断上次未发完,既数据状态不对,后经检查,SJA1000的硬件复位引脚一直为低,一直处在硬件复位状态.


4..h 文件中定义的指针, unsigned  char  xdata  *SJA_BCANAdr不可以,在头文件中定义的变量,在其他C源文件中调用,相当于多次定义了,出现***ERROR L104: MULTIPLE PUBLIC DEFINITIONS错误.
5.


点击看大图


如图所示:RST_CANP1.6,当给P1.6赋值1,并不是真正的VCC,P1口的内部结构可知,只是内部上拉,检测其电压也证明了这一点,R4的左端电压只有0.9V,内部上拉电阻很大.


6.单个CAN结点发送是不能成功的,如果没有收到CAN结点的应答,发送结点就会一直发送,直到超出错误计数器的充许值,使得总线关闭.


7.读测试寄存器时,每次读和写入的值相同,但进入复位模式后,读相应的控制寄存器和状态寄存器,发现现值有问题,我用的是伟福,看对应的汇编代码,发现汇编出现问题(用的是Keil 2的编译器).


.H文件中定义:


 #define   SJA_BaseAdr 0x7f00


#define         REG_TEST          SJA_BaseAdr+0x09       //测试寄存器


.C文件中定义:


unsigned        char   xdata     *SJA_BCANAdr;


读测试寄存器函数为: BCAN_CREATE_COMMUNATION(void)


 {


    SJA_BCANAdr = REG_TEST;                     //访问测试寄存器


    *SJA_BCANAdr   =0xa0;                     //写入测试值


    TempValue =   *SJA_BCANAdr;


    if(*SJA_BCANAdr == 0xa0)


    {


        return    0;                          //读测试正确


    }


    else


    {


       return    1;


    }


 }


对应的汇编代码为:


MOV 1CH,#7FH


MOV 1DH,#09H


MOV DPL,1DH


MOV DPH,1CH


MOV A,#A0H


MOVX @DPTR,A


MOV 1BH,A


CLR C


RET


SETB C


RET


可见与原程序的意图有较大差别,升级Keil版本到3,问题解决.


8.今天问题终于解决了,在确认了复位信号成功之后,一直关注于片选信号,只是发现在每执行一步的时候,似乎都有一个微妙的变化,只是不能确认是不真正的片选,因为用到P2寻址,本身用仿真器单步执行就是写DPTR寄存器而已.开始检测读写信号,在主程序的循环中写了两个语句:写语句: *SJA_BCANAdr   =0xee;W/R引脚,发现有跳变.再加入读语句: temp =   *SJA_BCANAdr;,发现R/D引脚没有变化,再检查发现R/D同时也为RS485的接收控制信号,在开始的时候处在接收状态,P3.70,置位后,读信号好用,整个初始化程序通过.


 


总结下SJA1000CAN的调试经历,首先要确定硬件可以复位,再要注意根据硬件确定的片选基址.然后要看片选信号,在这要说明一点,也可以先看一下读写信号,我遇到的问题就是,读信号有问题导致片选也观察不出来,其实只要寻址方式对了,进行读写时,W/RR/D引脚会有相应的变化.


正常情况下,ALE会有方波信号,读和写信号会有微弱的方波信号,但也可以看得出来,片选也是方波信号(前提是,主程序循环体中,一个读语句,一个写语句)


 


另外用周立功的DP-51的仿真头调试的话,可以还要设置下仿真头,就是与寻址方式有关的设置,我用的是伟福不存在这问题.

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条