SylixOS CAN总线初始化流程解析

发布者:JoyfulSpirit最新更新时间:2022-07-01 来源: csdn关键字:SylixOS  CAN总线  初始化流程 手机看文章 扫描二维码
随时随地手机看文章

概述

本文档是在AT91SAM9X25平台上进行SylixOS CAN总线驱动开发时,对CAN总线初始化流程的分析。


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


技术实现

CAN总线的初始化流程可以分成两个部分:


一部分是CAN总线通道资源初始化,主要工作是对通道相关的管脚和中断以及总线编程时需要的时钟等资源的初始化;另一部分是CAN总线的硬件初始化,主要工作是对总线的波特率的设置、接收和发送数据邮箱(相当于缓存区)的初始化以及接收中断和错误中断的使能。


CAN总线通道资源初始化

在AT91SAM9X25平台上,CAN总线通道资源初始化如图 21所示。CAN总线的TX管脚、RX管脚和时钟的使能以及中断服务函数的绑定是CAN总线在初始化时必须做的工作。CAN总线的通信需要绑定CAN总线上层回调函数,这些上层回调函数由开发者实现,用做应用层和底层的通信。时钟的获取是总线工作需要用到的数据,我们在总线初始化时先将其获取存在全局结构体变量中。

图 21 CAN总线通道资源初始化流程图


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


程序清单 21 CAN总线通道资源初始化


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

** 函数名称: __canChanDataInit

** 功能描述: 初始化通道数据(资源)相关

** 输  入  : uiChannel :通道号

** 输  出  : ERROR_CODE

** 全局变量:

** 调用模块:

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

static INT __canChanDataInit (UINT  uiChannel)

{

    __PCAN_CHANNEL    pChannel;

    ULONG             ulVector;

    UINT              uiInputClock;

    INT               iRet;

 

    static CPCHAR  pcCanIsrName[] = {"can_isr0", "can_isr1"};           /*  const char类型的can中断名称 */

 

    if (uiChannel >= CAN_CHAN_NUMS) {

        printk("channel invalid.n");

        return  PX_ERROR;

    }

 

    pChannel   = &__GCanChannels[uiChannel];                            /*  定义一个全局通道类型结构体  */

 

    __canIomuxConfig(uiChannel);                                        /*  管脚复用                    */

    uiInputClock = __at91sam9X25SysClkGet(MCK);                         /*  获取系统时钟                */

 

    pChannel->CANCH_uiInputClock      = uiInputClock;

    pChannel->CANCH_canchan.pDrvFuncs = &__GCanDrvFuncs;                /*  绑定CAN 总线上层回调函数    */

    pChannel->CANCH_uiMb0Id           = 0x7FF;

    API_AtomicSet(0, &pChannel->CANCH_atomicRef);                       /*  原子赋值操作                */

 

    ulVector = pChannel->CANCH_ulVector;                                /*  中断号                      */

    iRet     = (INT)API_InterVectorConnect(ulVector,                    /*  绑定中断服务函数            */

                                           (PINT_SVR_ROUTINE)__canIrq,

                                           (PVOID)pChannel,

                                            pcCanIsrName[uiChannel]);

    if (iRet != ERROR_NONE) {

        printk("interrupt vector connect error.n");

        return PX_ERROR;

    }

 

    API_InterVectorEnable(pChannel->CANCH_ulVector);                    /*  使能对应中断                */

 

    return ERROR_NONE;

}


CAN总线硬件初始化

在AT91SAM9X25平台上,CAN总线硬件初始化如图 22所示。中断使能和波特率设置是每个CAN总线都需要做的工作。CAN总线波特率是根据具体使用情况和芯片的硬件特性决定的,需要配置相关寄存器来实现。消息邮箱是AT91SAM9X25平台特有的用来接收和发送消息的一组寄存器,相当于发送和接收缓存区。这些邮箱可以根据开发者的需求来配置成接收或者发送模式。

图 22 CAN总线硬件初始化流程图


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


程序清单 22 CAN总线硬件初始化


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

** 函数名称: __canChanHwInit

** 功能描述: 硬件初始化

** 输  入  : pChannel :通道对象

** 输  出  : ERROR_CODE

** 全局变量:

** 调用模块:

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

static INT __canChanHwInit (__PCAN_CHANNEL  pChannel)

{

    UINT  uiRegIer;

 

    writel(AT91_IRQ_ALL, REG_CAN_IDR(CHANNEL));                         /*  禁用所有中断                */

    writel(readl(REG_CAN_MR(CHANNEL)) & ~AT91_MR_CANEN,                 /*  CAN 总线失能                */

           REG_CAN_MR(CHANNEL));

    __canSetBaudRate(pChannel, CAN_MAX_BAUDRATE);                       /*  设置CAN波特率               */

    __canSetMailboxes(pChannel);                                        /*  配置消息邮箱                */

 

    writel(AT91_MR_CANEN, REG_CAN_MR(CHANNEL));                         /*  CAN 总线使能                */

 

    uiRegIer = (AT91_MB_MASK(TX_FIRST) & (~AT91_MB_MASK(TX_FIRST)))     /*  0-5邮箱中断位               */

                | AT91_IRQ_ERRP                                         /*  被动错误中断使能            */

                | AT91_IRQ_ERR_FRAME;                                   /*  帧错误中断使能              */

    writel(AT91_IRQ_ALL, REG_CAN_IDR(CHANNEL));                         /*  禁用所有中断                */

 

    writel(uiRegIer, REG_CAN_IER(CHANNEL));                             /*  使能错误中断和0-5邮箱中断   */

 

    return  ERROR_NONE;

}


关键字:SylixOS  CAN总线  初始化流程 引用地址:SylixOS CAN总线初始化流程解析

上一篇:arm9x25交叉编译IPTABLES问题与解决
下一篇:rootfs根文件系统创建脚本

推荐阅读最新更新时间:2024-11-10 16:31

STM32F2系列驱动开发——CAN总线
一、概述 由于项目需要在机车6A系统上运行,故在产品开发时需要用到STM32 bxCAN外设,总体来说STM32的CAN总线应用起来不是很复杂,仔细看资料很容易上手,并且有官方参考例程。 二、底层配置详解 2.1 GPIO初始化 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_CAN1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_CAN1); GPIO_InitStructure.GPIO_Pin=
[单片机]
CAN总线错误帧长得啥样?怎么产生?
       前两天,帮一个客户调试CAN总线,他的板子发数,USBCAN接收,但是总是调试不成。我接上示波器,量一下CANH与CANL之间的波形,发现他板子不连接 USBCAN 接口卡时,波形是正确的;可是一旦连接上USBCAN以后,波形就成了以下这个样子:                                    就是刚发了第一个显性位之后,就有个阶梯的电压下降,然后保持几个位后,恢复到隐性电平,过了一会,才有正常的波形出来,可是这个帧只剩下一半了,肯定不可能发送成功。         我开始以为是收发器不匹配,换了几个收发器都是一样的。突然我想到这个很像错误帧。既然有错误帧,那就说明可能波特率不对。仔细看
[嵌入式]
基于CO2128的网络信号转换系统电路设计
  0 引言   随着信息科学的快速发展,人们对数据采集后的信号形式的要求越来越多,单一的信号形式已经没有办法满足实际工程的需要。网络信号、USB总线信号、RS232总线信号以及CAN总线信号等形式是目前应用比较广的总线形式,但它们之间的互换仍然存在问题,一直受到复杂的网络协议所限。而对于网络信号的转换,都得通过复杂的算法才能实现,因而无法满足对时实性要求较高的场合。   1 系统总体设计   本文给出的基于CO2128器件的网络信号转换平台主要通过CO2128提供的端口来实现CAN总线、RS232总线、USB总线及网络端口间的相互转换。该设计在保证数据准确的前提下,减少系统开销和提高速度是本设计的重点。通过设计,进而
[嵌入式]
基于STM32和CAN总线的电动车电池管理系统设计
  随着电池能源的广泛应用,石油资源的枯竭和环境污染,电动汽车以其节能环保的优势引起越来越多的重视,在电动汽车的研究和发展上,车载电池及其管理系统的研究与制造占据着重要位置。电动汽车动力电池在应用中的主要问题表现在:生产过程中,电池的工艺,技术以及成组技术还不能保证其初始性能具有良好的一致性;使用过程中,对过充电、过放电、过温度、过电流等非常敏感,这类情况的发生会明显缩短电池寿命,甚至会导致电池报废。电池组是几十个甚至上百个单体电池串联,单体电池之间存在不一致性,随着连续的充放电循环,电池间的不一致性加剧,电池组的可用容量受容量最小的单体电池制约。对于这些情况,电池的初始性能必须要依靠企业生产工艺的优化,生产过程关键参数的控制来改
[单片机]
基于STM32和<font color='red'>CAN总线</font>的电动车电池管理系统设计
VersaLogic推出Mini PCIe接口的双通道CAN总线扩展板
VersaLogic公司通过新的“ C1”模块扩展了其工业温度范围的耐用型Mini PCIe扩展产品,新的双通道CAN总线扩展板提供了一种向任何嵌入式计算机系统添加高速CAN总线端口的方法,尤其是在恶劣环境中的系统。 CAN-FD和CAN 2.0A/B C1支持CAN-FD和高达5 Mbps的高速信令,它也向后兼容CAN 2.0 A和CAN 2.0 B,传输速率高达1 Mbps。C1支持多种CAN功能,包括消息接受过滤器和仅侦听模式。 CANopen高级协议 C1支持高级CANopen协议,该协议标准化了不同制造商的设备和应用程序之间的通信,并且是为自动化中使用的嵌入式系统开发的,从而使其可用于工业机械,国防和航空航天,医
[工业控制]
STM32 CAN总线传输波特率的计算
本人用的单片机是STM32F407,其它型号的单片机类似,可做参考! 一、标准CAN协议位时序概念 由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯。 同时,CAN还使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。 为了实现这个位同步,CAN协议将每个位的时序分解为四段:SS段、PTS段、PSB1段、PBS2段。同时定义最小的时间单位:Tq,四个段的长度用x个Tq表示,加起来就是一个位的时序。 用一个图来表示可能会形象一点,如图一个位的时序就是19Tq。 以上就是CAN标准协议定义的位时序,而S
[单片机]
STM32 <font color='red'>CAN总线</font>传输波特率的计算
基于CAN总线的在线更新机制的设计与实现
分散型控制系统中的现场终端一般由控制器和各检测模块构成,它们之间通过一定的通信网络建立数据的交换链路。这种系统具有高可靠、开放性、灵活性、协调性、易维护等优点。然而,该分散型系统也具有终端数量多、分布范围广的特点。一旦终端系统软件存在缺陷或用户提出新的功能和指标要求时,其升级、维护的工作量和成本都非常大。本文针对上述情况,设计了一种方便、灵活、快速及稳定地对MCU节点进行在线更新的机制。基于LPC11C24微控制器组成的CAN网络,采用IAP 编程技术(In Application Programming),实现了对目标节点MCU的软件更新功能。 1 LPC11C24 单片机和CAN总线 恩智浦半导体(NXP)推出业界首款内嵌易用
[电源管理]
基于<font color='red'>CAN总线</font>的在线更新机制的设计与实现
基于单片机的多电机软起动系统
1 引言 随着国民经济的飞速发展,交流电动机在工业生产中扮演了极为重要的角色,作为各行业中的主要拖动电机,应用更为广泛。众所周知,交流电动机在全压起动时,起动电流达到额定电流的5~7倍,会对电网造成冲击;起动转矩约为额定转矩的2倍,加剧机械结构磨损。为了解决交流电动机的起动问题,通常需要使用软起动器进行软起动。 当前软起动器的监控一般由各自独立的监控单元进行,无法对整个系统实现全面的控制和监测。因此,建立一套数据通信系统将各软起动监控节点连接起来,组成完整的监控网络就显得非常必要。 相对于RS-485等通信标准,CAN(Controller Area Network)总线以其具有的诸多优点而在许多领域得到了应用。
[单片机]
基于单片机的多电机软起动系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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