https://static.assets-stash.eet-china.com/album/old-resources/2009/1/13/46a87ccb-5117-4474-9111-7922988a9872.rar 呵呵,总算折腾出来点东西了,两块CAN板之间发送数据有中断产生了,并且可以显示接收数据了,高兴之余不忘记了分享,虽然说简单但是总是有点点收获了。把助学板买回来就开始折腾了,但是我还是坚持我的原则,不看开发板例程,自己动手做所有的程序。
先是下载程序,就看了STC-ISP.exe中的那五个步骤,下载成功了。前四项的选项我都没有仔细研究,但是最后一个步骤的第一个选项我看了。因为以前用AVR的AVR Studio下载程序都是自动载入的,而这个难道每次都需要执行步骤2吗。仔细看了下“每次下载前重新调入己打开在缓冲区的文件,方便调试使用”,于是选上,再次进行了程序下载,果然不用每次执行步骤2了。步骤五的第二个选项,我感觉我自己用不了,也就没用了。
用下载程序自带串口调试助手方便,第一次在家中的电脑调试没有任何问题,因为仔细检查了“COM”号,“波特率”、“检验位”、“数据位”、“停止位”。同时在接收区的下方选择“十六进制显示”,在单字串发送区的下方同样选择“十六进制发送”,这样发送0-F,程序都可以接收为了程序的简单。第二次在公司电脑,没太在意就搞了半天。
写程序总是由最简单开始,因为CAN通讯第一次使用,所以先把其它所有可能的问题得都先排除。于是先调试了数码管显示,包括显示各种数据,接着调试串口,确定发送和接收都没有问题,再接着调试了SJA1000连接到STC的中断引脚。
在具备了初步的条件后,接着仔细阅读了SJA1000的Datasheet。读完之后的第一个概念和印象是确定STC单片机的映射地址,CS片选为低(P20),ALE、RD、WR不用管,RST接到STC单片机的P23,由此可确定映射地址的P23为高,P20为低。其余位为任意。我选择了最简单明确的就是0x800。于是用串口发送命令,来分别读SJA1000的寄存器的值,读Interrupt的值为224,Status寄存器的值为12。和Datasheet上的复位值相同,可证明地址线的连接没有问题。
紧接着的问题是,如何让系统处于BASICCAN或者PELICAN呢,仔细阅读后发现这一模式为地址31即clock divider的最高位确定的(为0则为BasicCAN 模式、为1则为PeliCAN模式)。接下来出现的问题是,如何让系统处于Reset mode OR operating mode,由控制位的最低位CR.0来确定的,在上电时是RESET模式,当这位由高变为低时,进入运行模式。
进入正式编程,配置了控制寄存器,接收代码寄存器、接收屏蔽寄存器、总线时序寄存器0和寄存器1,还有clock
divider寄存器,还有发送ID和RTR及数据长度DLC。可是怎么调试也不成功,查找资料也没有。于是从EDN上下载下来,通讯自测试程序,一看原来不是BasicCan模式是Pelican模式。网上查了半天也没有找到点有用的程序,于是停止了研究,第二天早上开始。大清早一看,好象单单少配置了个output control寄存器,配置测试,单板测试,哦,LED3和LED4点亮了,可能有所收获了。于是连线将两块板连接起来,一测试,另一块板显示了。呵呵成功了。
成功了就休息休息,我想接下来的内容会更加容易的。于是就写了上面的这些,写完这些,想了想刚才的状态,在单板的时候两个指示灯亮,联调时只是在闪烁。于是试着把一个板的电源断了,在另外一个板发送,这时指示灯还是持续点亮,于是把电源打开,哈,灯熄灭了,同时数据也接收正确。不写了,这就是CAN与SJA1000的结合,想用万用表测量测量,写写结果,可是这属于下午的事情了。至于这个功能是SJA1000的作用还是CAN协议的规定,还有待学习。
文章评论(0条评论)
登录后参与讨论