SylixOS 基于AT91SAM9X25的CAN总线传输流程解析

发布者:温文儒雅最新更新时间:2022-06-28 来源: eefocus关键字:SylixOS  CAN总线 手机看文章 扫描二维码
随时随地手机看文章

概述

本文档是在AT91SAM9X25平台上进行SylixOS CAN总线驱动开发时,对CAN总线底层传输流程的解析。


适用于正在学习CAN总线驱动的技术工程师。


技术实现

CAN总线的传输流程可以分成两个部分:


一部分是CAN总线的发送流程,主要工作是将准备发送的数据填充到对应的寄存器,并使能开始传输位和邮箱中断位;另一部分是CAN总线的中断处理流程,主要工作是对触发中断的中断源进行判断,并对不同的中断进行相关处理。


CAN总线的发送流程

在AT91SAM9X25平台上,CAN总线发送流程如图 21所示。在填写数据的帧ID时,必须要将邮箱设置为禁用模式。正常情况下,当我们将数据填充完成,开始发送数据时,就可以在总线上测到我们发送的数据。这里使能的邮箱中断是传输完成中断。


图 21 CAN总线的发送流程图


具体的代码实现如程序清单 21所示。


程序清单 21 CAN总线的传输函数


/*********************************************************************************************************

** 函数名称: __canTransmit

** 功能描述: CAN的传输

** 输    入: pChannel     通道对象

**           pcanFrame    can帧结构体指针

** 输    出:

** 返    回: LW_FALSE     传输出错

**           LW_TRUE      传输成功

*********************************************************************************************************/

static INT  __canTransmit (__PCAN_CHANNEL  pChannel,

                           CAN_FRAME      *pcanFrame)

{

    UINT uiRegMid;

    UINT uiRegMcr;

 

    if (pcanFrame->CAN_bExtId) {                                        /*  如果是扩展帧                */

        uiRegMid = (pcanFrame->CAN_uiId & CAN_EFF_MASK) | CAN_MID_MIDE;

    } else {                                                            /*  如果是标准帧                */

        uiRegMid = (pcanFrame->CAN_uiId & CAN_SFF_MASK) << CAN_MID_MIDVA_SHIFT;

    }

    uiRegMcr = (pcanFrame->CAN_bRtr & 1 ? CAN_MCR_MRTR : 0)  |

                (pcanFrame->CAN_ucLen << CAN_MSR_MDLC_SHIFT) |

                CAN_MCR_MTCR;

 

    writel((MB_MODE_DISABLED) | SET_PRIO_IS_0,                          /*  写ID时,将邮箱设为禁用模式  */

           REG_CAN_MMR(CHANNEL, MB_TX));

    writel(uiRegMid, REG_CAN_MID(CHANNEL, MB_TX));                      /*  将ID写到对应寄存器          */

    writel((MB_MODE_TX) | SET_PRIO_IS_0,                                /*  设置为TX模式                */

           REG_CAN_MMR(CHANNEL, MB_TX));

 

    if (!(readl(REG_CAN_MSR(CHANNEL, MB_TX)) & CAN_MSR_MRDY)) {

        printk("TX Mailbox is busy!n");

        return (LW_FALSE);

    }

 

    if (pcanFrame->CAN_ucLen > 0) {                                     /*  如果有数据                  */

        UINT uiDataL;

        uiDataL  = pcanFrame->CAN_ucData[0] << 0;

        uiDataL += pcanFrame->CAN_ucData[1] << 8;

        uiDataL += pcanFrame->CAN_ucData[2] << 16;

        uiDataL += pcanFrame->CAN_ucData[3] << 24;

        writel(uiDataL, REG_CAN_MDL(CHANNEL, MB_TX));                   /*  填充数据寄存器              */

    }

    if (pcanFrame->CAN_ucLen > 3) {                                     /*  超过4个字节数据             */

        UINT uiDataH;

        uiDataH  = pcanFrame->CAN_ucData[4] << 0;

        uiDataH += pcanFrame->CAN_ucData[5] << 8;

        uiDataH += pcanFrame->CAN_ucData[6] << 16;

        uiDataH += pcanFrame->CAN_ucData[7] << 24;

        writel(uiDataH, REG_CAN_MDH(CHANNEL, MB_TX));                   /*  填充数据寄存器              */

    }

 

    writel(uiRegMcr, REG_CAN_MCR(CHANNEL, MB_TX));                      /*  触发传输                    */

    writel((1 << MB_TX), REG_CAN_IER(CHANNEL));                         /*  使能发送邮箱中断            */

 

    return (LW_TRUE);

}


CAN总线的中断处理流程

CAN总线的中断处理流程如图 22所示。在AT91SAM9X25平台上,读状态寄存器(REG_CAN_SR)就可以清除中断标志位。通过对状态寄存器和中断屏蔽寄存器的比较,可以判断出是哪一种中断,并进行相应的处理。

图 22 CAN总线的中断处理流程图


具体代码实现如程序清单 22所示。


程序清单 22 CAN总线的中断处理函数


/*********************************************************************************************************

** 函数名称: __canIrq

** 功能描述: 中断服务函数

** 输  入  : pCanchan         通道对象

**           ulVector         中断向量号

** 输  出  : LW_IRQ_HANDLED   系统中断返回值

**           LW_IRQ_NONE      系统中断返回值

*********************************************************************************************************/

static irqreturn_t __canIrq (__PCAN_CHANNEL  pChannel, ULONG  ulVector)

{

    UINT  uiRegSr;

    UINT  uiRegImr;

    UINT  uiRxOrErr;

 

    uiRegSr  = readl(REG_CAN_SR(CHANNEL));                              /*  清除中断标志位              */

    uiRegImr = readl(REG_CAN_IMR(CHANNEL));

    uiRegSr &= uiRegImr;

    if (!uiRegSr) {

        goto exit;

    }

 

    /*

     *  Rx和错误中断

     */

    uiRxOrErr = ((1 << MB_RX)                                           /*  RX和错误中断的中断位        */

                 | AT91_IRQ_ERR_FRAME);

    if (uiRegSr & uiRxOrErr) {

        if (uiRegSr & (1 << MB_RX)) {

            __canReadMsg(pChannel);

        } else {

            _DebugFormat(__PRINTMESSAGE_LEVEL, "__canIrq: Frame error!rn");

            readl(REG_CAN_SR(CHANNEL));                                 /*  清除错误中断标志位          */

            return (LW_IRQ_NONE);

        }

    }

 

    /*

     *  Tx中断

     */

    if (uiRegSr & (AT91_MB_MASK(MAILBOXES_NUM) & (~AT91_MB_MASK(MB_TX)))) {

        writel(1 << MB_TX, REG_CAN_IDR(CHANNEL));                       /*  禁用发送邮箱的中断          */

    }

 

exit:

    return (LW_IRQ_HANDLED);

}


关键字:SylixOS  CAN总线 引用地址:SylixOS 基于AT91SAM9X25的CAN总线传输流程解析

上一篇:ATMEL AT91SAM9X25 平台的开发流程
下一篇:01-AT91SAM9X25初识

推荐阅读最新更新时间:2024-11-10 15:39

基于CAN总线的分布式水下航行器控制器的设计方法
本文提出了一种基于 CAN 总线的分布式水下航行器控制器的设计方法,主要描述了其硬件总体设计方案和实现办法。控制器作为分布式控制系统的一个节点,与其他节点之间以CAN总线连接并形成网络,相互传输数据和控制命令,每个节点都有主控计算机,以实现计算任务的分散化。控制器以基于ARM架构的MCU为控制计算机,搭载隔离模块、CAN控制器和收发器、数据存储模块、I/O接口模块、RS232模块等 电路 。该控制器的特点是体积和功耗小,通讯功能强,可实现智能控制、数据采集处理,故障发现等控制功能。 水下自主航行器是可移动水下探测和水下作业工程装备的统称,是进行海洋考察与开发的重要工具。它能够完成水下地形勘探、侦测、水下危险环境作业等任务。
[单片机]
基于<font color='red'>CAN总线</font>的分布式水下航行器控制器的设计方法
汽车轮速传感器设计中CAN总线的应用
    目前,网络技术是 汽车电子 领域发展的一项新技术。它不仅是解决汽车电子化中的线路复杂和线束增加问题的技术,而且其通讯和资源共享能力成为新的电子与计算机技术在车上应用的一个基础,是车上信息与控制系统的支撑。   汽车电子网络按功能可分为面向控制的网络(CON)和面向信息传输的网络(ION)。按网络信息传输速度,美国汽车工程师协会(SAE)将网络分为A, B,C三类。A类为低速网,波特率在9600bps以下,进而波特率在125kbps以下为中速网B类,125kbps以上为高速网C类。车轮速度(即车轮绕轮轴旋转的线速度)传感器(简称轮速传感器)信号,可供发动机控制模块、防抱制动系统(ABS)控制模块及仪表控制模块共享,使车辆在制
[嵌入式]
现代电动车辆中电控技术应用
        电动车由于储能设备容量有限,在运行过程中对电能流向管理十分严格。精确的电能管理可以延长车辆运行里程,减少电池充电频率,从而节约运行成本。车载能量管理系统需要随时监控电池电压、电机输出功率以及其它设备的用电情况。同时,电动车电子控制系统的动态信息必须具有实时性,各子系统需要将车辆的公共数据实时共享,如电机转速、车轮转换、油门踏板位置等。但不同控制单元的控制周期不同,数据转换速度、各控制命令优先级也不同,因此需要一种具有优先权竞争模式的数据交换网络,并且本身具有极高的通信速率。此外,作为一种载人交通工具,电动汽车必须具有极高的运行稳定性,整车通讯系统必须具有很强的容错能力和快速处理能力。          德国Bosch
[嵌入式]
基于S3C2410的CAN总线通信设计与开发
  1 引言   网络化控制系统是控制系统的发展趋势和研究热点,现场总线控制系统作为网络化系统的重要组成部分,近年来在实际的控制系统中得到了广泛的应用。CAN(Con- troller Area Network)总线作为一种容错性强、可靠性高、布线简单且成本低廉的现场总线倍受用户钦睐,在国内CAN总线已经得到了广泛应用。目前国内广泛应用的独立CAN控制器SJA1000因存在如地址、数据总线的分时复用常导致接口效率低下;接收、发送缓冲区的个数太少,导致数据吞吐率不高;帧屏蔽和过滤器的设置不够灵活,不能满足同时需要更多屏蔽和过滤条件的要求等。   ARM芯片S3C2410是一种高集成度,高性价比的嵌入式处理芯片,已成功用于工控设备
[单片机]
基于S3C2410的<font color='red'>CAN总线</font>通信设计与开发
如何为下一代电动汽车创建安全可靠的电路
在电动化和自动化程度更高的车辆中建立可靠电路保护的设计注意事项。 图1。在混合动力电动汽车电气结构中,车载充电器必须与交流电源线及其可能产生的过载和瞬态过压相匹配。(Littelfuse) 图2。车载充电器框图和推荐的保护和功率控制器件。(Littelfuse) 图3。用于保护CAN总线的TVS二极管阵列。(Littelfuse) 为电动车辆设计电路极具挑战性。 为了确保能够承受过载,瞬态和静电放电(ESD)的可靠和安全设计,设计人员需要确保其电路具有必要的器件以防止损坏。 本文以车载充电器为例,提出了电路保护和高效功率控制的建议。 如图1示意图所示,对于必须开发能够承受来自内燃发动机和大功率电动机瞬
[汽车电子]
如何为下一代电动汽车创建安全可靠的电路
一种混合动力电池监测模块的设计实现
引言 分布式电池监测系统具有应用广泛,可扩展的优点; CAN总线具有传输速率高、可靠性好的优点,将二者结合应用,典型电池监测与管理系统结构如图1所示。 其中远程数据采集单元即电池监测模块。 监测模块的功能定义 功能实现的前提是在不影响或对电池性能影响小到可以忽略的基础上实现,离开这个前提则监测模块的设计会失去意义,因为在实际应用中往往是多个电池串连在一起应用,一个电池的失效必然导致整个电池包出问题。 监测模块将在上述前提下实现下列功能: 接受上层控制器的控制; 实现电池数据的采集,准确反应电池的物理参数,如电压,温度; 将采集到的数据传送给上层控制器,实现数据共享。 监测模块要达到的物理性能 在采样速率
[单片机]
一种混合动力电池监测模块的设计实现
基于Cortex-M3内核芯片LM3S2965的CAN总线节点设计
引言   CAN总线具有通信速率高、可靠性高、连接方便和性能价格比高等诸多特点。CAN(Controller Area Network,控制器局域网)属于总线式通信网络,它是一种专门用于工业自动化领域的网络,不同于以太网等管理和信息处理用网络,其物理特性及网络协议特性更强调工业自动化的底层监测及控制。它采用了最新的技术及独特的设计,可靠性和性能超过了已陈旧的现场通信技术,如RS485、BITBUS等。   多数采用微处理器结合CAN控制器芯片的硬件方案,软件实现上是对CAN控制器芯片的寄存器编程,比较繁琐。Luminary Micro公司(现已被TI公司收购)所提供的Stellaris系列是基于ARM Cortex-M3的控
[单片机]
基于Cortex-M3内核芯片LM3S2965的<font color='red'>CAN总线</font>节点设计
如何快速实现CAN总线故障定位?
摘要:CAN总线是当前应用最广泛的现场总线之一,但其复杂的故障排查经常困扰到应用工程师。本文结合工作经验为大家推荐几种快速定位CAN总线故障节点的方法。 一 、总线故障 CAN总线故障的原因多种多样,如节点发送周期异常、节点掉线甚至整条总线被拖垮。一个故障节点或者隐患节点往往会危害到整个产品的安全,如新能源车的控制总线中,故障节点导致仪表盘数据更新滞后、显示错误导致司机判断错误引发道路安全事故。 图1 总线故障案例 二、故障定位方法 方法一:将CAN节点一个一个往总线上接,每接一个节点后观察、测试总线通信状况。该方法相信是绝大多数现场应用工程师都有尝试,往往可以零成本揪出问题节点。以上方法虽然非常简单,但
[汽车电子]
如何快速实现<font color='red'>CAN总线</font>故障定位?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved