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…..通过端口并不能看到P0与P2的变化,此时为第二功能用,要观察的是DPTR寄存器的内容.
3.在在执行BCAN_DATA_WRITE(unsigned char *SendDataBuf)函数时,始终判断上次未发完,既数据状态不对,后经检查,SJA1000的硬件复位引脚一直为低,一直处在硬件复位状态.
4.在.h 文件中定义的指针, unsigned char xdata *SJA_BCANAdr不可以,在头文件中定义的变量,在其他C源文件中调用,相当于多次定义了,出现***ERROR L104: MULTIPLE PUBLIC DEFINITIONS错误.
5.
如图所示:RST_CAN接P1.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.7置0了,置位后,读信号好用,整个初始化程序通过.
总结下SJA1000CAN的调试经历,首先要确定硬件可以复位,再要注意根据硬件确定的片选基址.然后要看片选信号,在这要说明一点,也可以先看一下读写信号,我遇到的问题就是,读信号有问题导致片选也观察不出来,其实只要寻址方式对了,进行读写时,W/R和R/D引脚会有相应的变化.
正常情况下,ALE会有方波信号,读和写信号会有微弱的方波信号,但也可以看得出来,片选也是方波信号(前提是,主程序循环体中,一个读语句,一个写语句)
另外用周立功的DP-51的仿真头调试的话,可以还要设置下仿真头,就是与寻址方式有关的设置,我用的是伟福不存在这问题.
文章评论(0条评论)
登录后参与讨论