原创 CAN总线学习笔记二:CAN自收发程序解读

2008-6-16 21:08 8109 12 14 分类: 工业电子

CAN总线学习笔记二:CAN自收发程序解读<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


       花了一整个下午的时间,彻头彻尾的把  PIAE小组提供的CAN自收发源程序解读了一遍。解读别人的程序是一件挺费时费力的一件事,但是在对某项技术或者说某个芯片的入门阶段参考别人的程序又是一项必不可少的任务。


       对于这个程序,头一个任务当然是把头文件先浏览一遍,能弄明白的还是先弄明白,对后面程序的解读有好处。C文件里给出了三个头文件:


#include


#include


#include


       第一个reg52.h我就不废话了,下一个intrins.h我在上一篇日志里也详细的作了说明,这里也不提了。can_selfdef.h是程序员自己定义的一个头文件,在这个头文件里除了一些宏定义和管脚的一些说明外,最重要的就是要弄明白“CAN总线SJA1000寄存器地址定义”。这个我开始也没弄明白,后来反复琢磨,才发现作者在这个程序里吧SJA1000的寄存器作为单片机的外部扩展RAM寻址了,从而省去了编写一些底层的驱动程序,这就让大家连SJA1000datasheet的时序图都不用看了(不过下一步我想用驱动程序来控制SJA1000)。


       看完头文件,可不能从第一个程序依次往下看。应该直接找到主程序main()解读:


void main(void)


{


 


//MCU初始化(主要是各中断寄存器的初始化)


    SJA_RST = 1;       //CAN总线复位管脚复位无效


    SJA_CS = 0;         //CAN总线片选有效


    EX1 = 1;       //MCU外部中断INT1


    IT1 = 0; //MCU外部中断INT1为电平触发,也是CAN总线接收中断口


    IT0 = 1; //MCU外部中断INT0为下降沿触发


    EX0 = 1;       //MCU外部中断INT0


    EA = 1;        //MCU总中断


    SJA_CS = 1;         //CAN总线片选无效,使得对数据总线的操作不会影响SJA1000


 


//SJA1000初始化


CAN_init(); //SJA1000寄存器的读写是采用外部寄存器寻址方式,


//所以不需要程序单独控制片选有效无效


    _nop_();


    _nop_();


 


//主循环


    while(1)


    {


        _nop_();


        _nop_();


        Rxd_deal();        //接收处理程序


        Txd_deal();        //发送处理程序


        led_seg7(0,Txd_data);     //数码管1-2显示发送数据子程序


        led_seg7(1,Rxd_data+3);       //数码管3-4显示接收数据子程序


    }


 


}


 


       上面的注释是本人详细做了加工的,先是单片机中断寄存器的初始化,打开了单片机的INT0INT1两个外部中断。INT0是外接按键的,所以是下降沿触发。这个按键每按下一次,待发送的数据的第一个字节就会加一,这个数据同时会显示在数码管上。而INT1是外界着SJA1000的发送数据中断端口的,采用电平触发,也就是说当SJA1000发送数据时,就会触发中端口INT1,从而让单片机进行数据的接收工作。


       接下来是SJA1000的各个寄存器的初始化,主要是在CAN_init();这个程序里完成的,主要是设置一些寄存器使得满足本次试验的要求。


       最后就进入了主循环中。不断的进行接收数据处理、发送数据处理以及将数据的头一个字节的数值显示在数码管上。每当按键被按下后就会置位发送数据状态标志位,这时就进入发送状态,无非就是把ID码和数据等13个字节送入SJA1000的相应寄存器里,其它的事情就交给SJA1000来完成就可以了。由于是进行自传送,所以SJA1000在接收到数据后会给单片机一个中断,此时也就进入了接收数据状态下,同样只要把SJA1000里相应的寄存器读出来就可以了。为了观察发送和接收的数据是否一致,这个程序里就把发送的数据的头一个字节通过数码管显示出来。发送数据正常显示,而接收数据为了便于观察,我把它+3,就是说显示的接收数据会比发送数据大3。最后很好的得到验证了。


   


 


 

文章评论2条评论)

登录后参与讨论

nneverli_217963090 2010-11-23 22:41

没了

用户1438040 2010-7-19 10:04

10.0的好像没得那些问题了

Cybershu 2008-6-25 17:47

en

用户1359843 2008-6-17 09:35

这种好贴要顶!期望多学多发多交流!
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
我要评论
2
12
关闭 站长推荐上一条 /2 下一条