首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

LPC2131嵌入式系统μCOS-II实现CAN通讯 03

LPC2131嵌入式系统μCOS-II实现CAN通讯 03

    ·数据发送模块
   
    假设要发送的数据的ID存储在数组ID[4]中,数据存储在数组SendData[8]中,其发送模块程序如下所示,其中参数DLC为发送的字节数,FF为帧类型,即0为数据帧,1为远程帧。
   
    void Tx(uint8 DLC,uint8 FF)
   
    {
   
    uint8 i;
   
    OS_ENTER_CRITICAL();
   
    If (FF==0x01)
   
    {
   
    WriteCan(16,DLC+0x80); //数据帧
   
    }
   
    else
   
    {
   
    WriteCan(16,DLC+0xd0); //远程帧
   
    }
   
    WriteCan(17,ID[0]);
   
    WriteCan(18,ID[1]);
   
    WriteCan(19,ID[2]);
   
    WriteCan(20,ID[3]); //TX标识码
   
    for (i=0;i
   
    WriteCan(21+i,sentdata); //TX数据
   
    WriteCan(1,0x01);//设置发送寄存器发送
   
    OS_EXIT_CRITICAL();
   
    }
   
    ·数据接受模块
   
    根据电路图1,采用中断接受的方式来接受数据,LPC2131的P0.30设置为外部中断3,整个数据接受模块由数据接受函数void ReceiveData(uint8 *Rt)、中断处理函数Can_Exception(void)构成。当SJA1000接受到CAN总线数据,通过接收中断使得LPC2131产生外部中断3而使其进入中断处理函数,进而对接受到的数据进行处理。其中数据接受函数和中断处理函数如下:
   
    void ReceiveData (void)
   
    {
   
    uint8 i, err,*Rt;
   
    OS_ENTER_CRITICAL();
   
    Rt=(uint8 *)OSMboxPend(OSCANMbox,0,&err);
   
    //通过邮箱接受数据
   
    for (i=0;i<13;i++)
   
    ReceiveData=*Rt++; //将接受到的数据存在全局变量中供后续处理
   
    OS_EXIT_CRITICAL();
   
    }
   
    void Can_Exception(void)
   
    {
   
    u
   
    int8 temp[13],i;
   
    OS_ENTER_CRITICAL();
   
    for (i=0;i<13;i++)
   
    temp=ReadCan(16+i); //读取CAN数据
   
    OSMboxPost(OSCANMbox,(void *)temp); //将
   
    CAN数据以邮箱发送到接受函数
   
    EXTINT=0x08; //清楚ENT3
   
    VICVectAddr=0; //中断返回
   
    OS_EXIT_CRITICAL();
   
    }
   
    结语
   
    以arm芯片作为主控制器,CAN总线作为数据传输方式来进行通讯的嵌入式系统得到了越来越广泛的应用。同时CAN通讯的可靠性也成为影响系统性能的关键部分之一。本文以LPC2131为例,给出了一类微处理器与CAN控制器SJA1000之间的较为通用的硬件连接方法,对CAN总线进行了可靠性设计,并基于嵌入式实时操作系统μCOS-II进行了CAN通讯软件开发,该设计现已在工厂车间中的分布式监控系统中得到了应用,运行可靠、稳定。
返回列表