datasheet
超过460,000+ 应用技术资源下载
pdf

LPC2000系列ARM-CAN控制器驱动程序的使用指南

  • 1星
  • 日期: 2015-08-06
  • 大小: 1.35MB
  • 所需积分:1分
  • 下载次数:1
  • favicon收藏
  • rep举报
  • 分享
  • free评论
标签: LPC2000系列ARMCAN

LPC2000系列ARM-CAN控制器驱动程序的使用指南

广州周立功单片机发展有限公司 www.zlgmcu.com PHILIPS LPC2000 系列 ARM7 微处理器 CAN 控制器驱动程序的编写与开发 广州周立功单片机发展有限公司 2004 年 8 月 25 日 1 广州周立功单片机发展有限公司 www.zlgmcu.com 目录 第 1 章 CAN 控制器和验收过滤器 .........................................................................................4 1.1 特性...................................................................................................................................4 1.2 管脚描述...........................................................................................................................4 1.3 CAN 模块的存储器映射 .................................................................................................4 1.4 CAN 控制器寄存器一览表 .............................................................................................5 1.5 各控制寄存器解释...........................................................................................................7 1.5.1 模式寄存器(CANMOD – 0xE00x x000)............................................................7 1.5.2 命令寄存器(CANCMR – 0xE00x x004) ............................................................7 1.5.3 全局状态寄存器(CANGSR – 0xE00x x008) .....................................................8 1.5.4 中断和捕获寄存器(CANICR – 0xE00x x00C)..................................................9 1.5.5 中断使能寄存器(CANIER – 0xE00x x010).....................................................10 1.5.6 总线时序寄存器(CANBTR – 0xE00x x014) ................................................... 11 1.5.7 出错警告界限寄存器(CANEWL – 0xE00x x018)........................................... 11 1.5.8 状态寄存器(CANSR – 0xE00x x01C)..............................................................12 1.5.9 Rx 帧状态寄存器(CANRFS – 0xE00x x020) ......................................................12 1.5.10 Rx 标识符寄存器(CANRID – 0xE00x x024)...................................................13 1.5.11 Rx 数据寄存器 A(CANRDA – 0xE00x x028) .................................................13 1.5.12 Rx 数据寄存器 B(CANRDB – 0xE00x x02C) .................................................14 1.5.13 Tx 帧信息寄存器(CANTFI1,2,3 – 0xE00x x030,40,50)..................................14 1.5.14 Tx 标识符寄存器(CANTID1,2,3 – 0xE00x x034,44,54) .................................14 1.5.15 Tx 数据寄存器 A(CANTDA1,2,3 – 0xE00x x038,48,58)................................15 1.5.16 Tx 数据寄存器 B(CANTDB1,2,3 – 0xE00x x03C,4C,5C) ..............................15 1.6 寄存器操作方法.............................................................................................................16 1.6.1 错误处理.................................................................................................................17 1.6.2 睡眠模式.................................................................................................................18 1.6.3 中断.........................................................................................................................18 1.6.4 发送优先级.............................................................................................................19 1.7 组合 CAN 寄存器 ..........................................................................................................19 1.7.1 集中发送状态寄存器(CANTxSR – 0xE004 0000)..........................................19 1.7.2 集中接收状态寄存器(CANRxSR – 0xE004 0004)..........................................20 1.7.3 集中其他状态寄存器(CANMSR – 0xE004 0008)...........................................20 1.8 全局验收过滤器.............................................................................................................21 1.8.1 验收过滤器寄存器.................................................................................................22 1.8.2 标准帧单个起始地址寄存器(SFF_sa – 0xE003 C004) ...................................22 1.8.3 标准帧组起始地址寄存器(SFF_GRP_sa – 0xE003 C008) .............................23 1.8.4 扩展帧起始地址寄存器(EFF_sa – 0xE003 C00C) ..........................................23 1.8.5 扩展帧组起始地址寄存器(EFF_GRP_sa – 0xE003 C010) .............................23 1.8.6 AF 表格终止寄存器(ENDofTable – 0xE003 C014).............................................23 2 广州周立功单片机发展有限公司 www.zlgmcu.com 1.8.7 LUT 错误地址寄存器(LUTerrAd – 0xE003 C018) .............................................24 1.8.8 LUT 错误寄存器(LUTerr – 0xE003 C01C)..........................................................24 1.8.9 验收过滤器表格和 ID 索引值举例.......................................................................24 1.8.10 FullCAN 模式.........................................................................................................25 第 2 章 CAN 控制器驱动程序的编写 ...................................................................................28 2.1 驱动程序的结构.............................................................................................................28 2.2 驱动程序使用方法.........................................................................................................31 2.3 驱动程序各文件介绍.....................................................................................................31 2.3.1 用户配置文件.........................................................................................................31 2.3.2 CAN 驱动应用接口层文件 .......................................................................................33 2.3.3 功能函数层文件.....................................................................................................41 2.3.4 硬件抽象层文件.....................................................................................................44 第 3 章 CAN 驱动程序应用实例——RS232 与 CAN-bus 透明转换器 .............................45 3.1 硬件平台.........................................................................................................................45 3.2 软件平台.........................................................................................................................46 3.3 应用注意事项.................................................................................................................46 3.4 实现的功能说明.............................................................................................................47 3.5 测试方法说明.................................................................................................................47 3.6 简单的 RS232 数据与 CAN-bus 数据透明转换的实现..............................................49 3.6.1 系统初始化.............................................................................................................49 3.6.2 主循环处理.............................................................................................................50 第 4 章 参考文献.....................................................................................................................54 3 广州周立功单片机发展有限公司 www.zlgmcu.com 第1章 CAN 控制器和验收过滤器 LPC2119/2129/2194/2290/2292/2294 微处理器包含 2 或 4 个 CAN 模块,可同时支持多个 CAN 总线的操作,使器件可用作网关、开关、工业或汽车应用中多个 CAN 总线的路由器。 1.1 特性 2 或 4 个(LPC2119/2129/2292 或 LPC2290/2194/2294)CAN 控制器和总线(64 脚 封装中包含 2 条,144 脚的封装中包含 4 条)。 每个总线的数据波特率可达 1Mbps; 可访问 32 位的寄存器和 RAM; 符合 CAN 规范 CAN2.0B,ISO 11898-1; 全局验收过滤器可识别几乎所有总线的 11 和 29 位 Rx 标识符; 验收过滤器为选择的标准标识符提供了 FullCAN-style 自动接收。 1.2 管脚描述 CAN 控制器输入输出管脚表 1.1 所示。 表 1.1 CAN 管脚描述 管脚名称 RX4、RX3 RX2、RX1 TX4、TX3 TX2、TX1 类型 输入 输出 描述 串行输入。来自 CAN 收发器。 注:RX2 和 RX1 适用于所有含有 CAN 模块的器件。但 RX4 和 RX3 只可用 于 144 管脚含有 CAN 模块的某些器件。 串行输出。输出到 CAN 收发器。 注:TX2 和 TX1 适用于所有含有 CAN 模块的器件。但 TX4 和 TX3 只可用 于 144 管脚含有 CAN 模块的某些器件。 1.3 CAN 模块的存储器映射 CAN 控制器和验收过滤器占用部分 VPB slot 空间,表 1.2 所示。 表 1.2 CAN 模块的存储器映射 地址范围 E003 8000 – 87FF E003 C000 – C017 E004 0000 – 000B E004 4000 – 405F E004 8000 – 805F E004 C000 – C05F E005 0000 – 005F 验收过滤器 RAM (2048 字节) 验收过滤器寄存器 中央 CAN 寄存器 CAN 控制器 1 寄存器 CAN 控制器 2 寄存器 CAN 控制器 3 寄存器 CAN 控制器 4 寄存器 用途 4 广州周立功单片机发展有限公司 www.zlgmcu.com 1.4 CAN 控制器寄存器一览表 CAN 模块使用的寄存器见表 1.3 和表 1.4 所示。详情见后面的描述。 表 1.3 CAN 验收过滤器和中央 CAN 寄存器 名称 AFMR 描述 验收过滤器寄存器 访问 R/W 复位值 1 SFF_sa SFF_GRP_sa EFF_sa EFF_GRP_sa ENDofTable LUTerrAd LUTerr CANTxSR CANRxSR 标准帧单个起始地址寄存器 标准帧组起始地址寄存器 扩展帧起始地址寄存器 扩展帧组起始地址寄存器 AF 表格终止寄存器 LUT 错误地址寄存器 LUT 错误寄存器 CAN 集中发送状态寄存器 CAN 集中接受状态寄存器 R/W 0 R/W 0 R/W 0 R/W 0 R/W 0 RO 0 RO 0 RO 0x003F 3F00 RO 0 CANMSR CAN 集中其他状态寄存器 RO 0 地址 0xE003 C000 0xE003 C004 0xE003 C008 0xE003 C00C 0xE003 C010 0xE003 C014 0xE003 C018 0xE003 C01C 0xE004 0000 0xE004 0004 0xE004 0008 表 1.4 CAN1,CAN2,CAN3 和 CAN4 控制器寄存器映射 名称 CANMOD CANCMR CANGSR CANICR CANIER CANBTR CANEWL CANSR CANRFS 描述 控制 CAN 控制器 的工作模式 影响 CAN 控制器 状态的命令位 全局控制器状态 和错误计数器 中断状态,仲裁丢失 捕获,错误码捕获 访问 R/W WO ROa RO CAN1 地址&名称 0xE0044000 C1MOD CAN2 地址&名称 0xE0048000 C2MOD CAN3 地址&名称 0xE004C000 C3MOD CAN4 地址&名称 0xE0050000 C4MOD 0xE0044004 0xE0048004 0xE004C004 0xE0050004 C1CMR C2CMR C3CMR C4CMR 0xE0044008 0xE0048008 0xE004C008 0xE0050008 C1GSR C2GSR C3GSR C4GSR 0xE004400C 0xE004800C 0xE004C00C 0xE005000C C1ICR C2ICR C3ICR C4ICR 中断使能 0xE0044010 0xE0048010 0xE004C010 0xE0050010 R/W C1IER C2IER C3IER C4IER 总线时序 0xE0044014 0xE0048014 0xE004C014 0xE0050014 R/Wb C1BTR C2BTR C3BTR C4BTR 出错警告界限 0xE0044018 0xE0048018 0xE004C018 0xE0050018 R/Wb C1EWL C2EWL C3EWL C4EWL 状态寄存器 0xE004401C 0xE004801C 0xE004C01C 0xE005001C RO C1SR C2SR C3SR C4SR 接收帧状态 0xE0044020 0xE0048020 0xE004C020 0xE0050020 R/Wb C1RFS C2RFS C3RFS C4RFS 5 广州周立功单片机发展有限公司 www.zlgmcu.com 续表 1.4 名称 描述 访问 CAN1 地址&名称 CAN2 地址&名称 CAN3 地址&名称 CAN4 地址&名称 CANRID 接收到的标识符 0xE0044024 0xE0048024 0xE004C024 0xE0050024 R/Wb C1RID C2RID C3RID C4RID CANRDA 接收到的数据字节 0xE0044028 0xE0048028 0xE004C028 0xE005 0028 R/Wb 1-4 C1RDA C2RDA C3RDA C4RDA CANRDB 接收到的数据字节 0xE004402C 0xE004802C 0xE004C02C 0xE005002C R/Wb 5-8 C1RDB C2RDB C3RDB C4RDB CANTFI1 发送帧信息(1) 0xE0044030 0xE0048030 0xE004C030 0xE0050030 R/W C1TFI1 C2TFI1 C3TFI1 C4TFI1 CANTID1 发送标识符(1) 0xE0044034 0xE0048034 0xE004C034 0xE0050034 R/W C1TID1 C2TID1 C3TID1 C4TID1 CANTDA1 发送数据字节 1-4(1) 0xE0044038 0xE0048038 0xE004C038 0xE0050038 R/W C1TDA1 C2TDA1 C3TDA1 C4TDA1 CANTDB1 发送数据字节 5-8(1) 0xE004403C 0xE004803C 0xE004C03C 0xE005003C R/W C1TDB1 C2TDB1 C3TDB1 C4TDB1 CANTFI2 发送帧信息(2) 0xE0044040 0xE0048040 0xE004C040 0xE0050040 R/W C1TFI2 C2TFI2 C3TFI2 C4TFI2 CANTID2 发送标识符(2) 0xE0044044 0xE0048044 0xE004C044 0xE0050044 R/W C1TID2 C2TID2 C3TID2 C4TID2 CANTDA2 发送数据字节 1-4(2) 0xE0044048 0xE0048048 0xE004C048 0xE0050048 R/W C1TDA2 C2TDA2 C3TDA2 C4TDA2 CANTDB2 发送数据字节 5-8(2) 0xE004404C 0xE004804C 0xE004C04C 0xE005004C R/W C1TDB2 C2TDB2 C3TDB2 C4TDB2 CANTFI3 发送帧信息(3) 0xE0044050 0xE0048050 0xE004C050 0xE0050050 R/W C1TFI3 C2TFI3 C3TFI3 C4TFI3 CANTID3 发送标识符(3) 0xE0044054 0xE0048054 0xE004C054 0xE0050054 R/W C1TID3 C2TID3 C3TID3 C4TID3 CANTDA3 发送数据字节 1-4(3) 0xE0044058 0xE0048058 0xE004C058 0xE0050058 R/W C1TDA3 C2TDA3 C3TDA3 C4TDA3 CANTDB3 发送数据字节 5-8(3) 0xE004405C 0xE004805C 0xE004C05C 0xE005005C R/W C1TDB3 C2TDB3 C3TDB3 C4TDB3 a. 错误计数器只能在 CANMOD 的 RM 为 1 时才能写入。 b. 这些寄存器只能在 CANMOD 的 RM 为 1 时才能写入。 下面的寄存器表中,“复位值”列表示硬件复位对每个位域的影响,“RM 置位”列指示 了当 RM 位被软件置位或由于总线离线而置位时对每个位域的影响。注意:当 RM 由于硬件复 6 广州周立功单片机发展有限公司 www.zlgmcu.com 位而置位时,如果某一位/域对应在“复位值”列和“RM 置位”列中的值不同,使用“复位值”列的值。 在“复位值”列和“RM 置位”列中,X 表示该位/域的值不变。 1.5 各控制寄存器解释 1.5.1 模式寄存器(CANMOD – 0xE00x x000) 该寄存器控制 CAN 控制器的基本工作模式。表中未列出的寄存器位读出为 0,并应向 其写入 0,模式寄存器功能见表 1.5。每个 CAN 通道寄存器的地址见表 1.4。 表 1.5 CAN 模式寄存器(CANMOD – 0xE00x x000) CAN MOD 0 名称 RM 功能 0:CAN 控制器正常工作,某些寄存器不能写入。 1:复位模式——禁止 CAN,可写寄存器可以写入数据。 复位值 1 0:当 CAN 总线成功接收到信息时,CAN 控制器产生应答。 1:只听模式——控制器不会在 CAN 总线上产生应答,即使 1 LOM 0 成功接收到信息。此时不发送信息,控制器工作在“错误被 动”状态。该模式用于软件位速率检测和“热插入”。 0:发送的信息必须被应答才被认可。 1:自测试模式——控制器认可没有应答的 Tx 信息传输。此 2 STM 0 状态和 CANCMR 的 SRR 位一起使用,可以达到自发自收 的效果。 0:3 个发送缓冲区的优先级由各自的 CAN ID 决定。 3 TPM 0 1:3 个发送缓冲区的优先级由各自的 Tx 优先级域决定。 0:正常工作模式。 4 SM 1:睡眠模式——如果无中断请求发生且没有总线活动,CAN 0 控制器进入睡眠模式。见后面的睡眠模式描述。 0:如果传输的是显性位,Rx 和 Tx 脚为低电平。 5 RPM 0 1:翻转极性模式——如果传输的是显性位,Rx 脚为高电平。 0:正常工作模式。 7 TM 0 1:测试模式。Rx 脚的状态被记录到 Tx 脚上。 注:LOM 和 STM 位只有在 RM 位为 1 时才能被写入。 RM 置位 1 X X X 0 0 0 1.5.2 命令寄存器(CANCMR – 0xE00x x004) 通过写命令寄存器来启动一次动作。表中未列出的寄存器位必须写入 0。该寄存器读出 总为 0,命令寄存器功能见表 1.6。 表 1.6 CAN 命令寄存器(CANCMR – 0xE00x x004) CANCMR 0 1 名称 TR AT 功能 1:发送请求——报文,先前写入 CANTFI 和 CANTID 的内容以及 CANTDA 和 CANTDB 寄存器的内容等待发送。 1:中止发送——所有等待发送请求取消,正在处理的发送请求除外。如果该位 和 TR 在同一次写操作中置位,尝试执行一次单帧发送,如果既未建立错误标志 仲裁也未丢失,则不再执行帧发送。 7 广州周立功单片机发展有限公司 www.zlgmcu.com 续表 1.6 CANCMR 2 3 4 名称 RRB CDO SRR 功能 1:释放接收缓冲区——如果 CANRDA 和 CANRDB 寄存器的内容可用, CANRFS,CANRID 的内容释放并可由接收到的下一帧信息来代替。如果接收到的 下一帧信息不可用,写入该命令来清除 CANSR 的 RBS 位。 1:清除数据溢出——清除 CANSR 的数据溢出位。 1:自接收请求——报文,先前写入 CANTFS 和 CANTID 的内容以及 CANTDA 和 CANTDB 寄存器的内容等待发送。该位与 TR 位的不同在于:发送过程中接收 器并未禁能,接收器仍能够接收符合验收过滤器识别标识的信息。 5 STB1 1:选择发送 Tx 缓冲区 1 的内容。 6 STB2 1:选择发送 Tx 缓冲区 2 的内容。 7 STB3 1:选择发送 Tx 缓冲区 3 的内容。 1.5.3 全局状态寄存器(CANGSR – 0xE00x x008) 该寄存器是一个只读寄存器,但当 CANMOD 寄存器的 RM 位为 1 时,错误计数器可写 入。表中未列出的寄存器位读出为 0,并应向其写入 0,全局状态寄存器功能见表 1.7 表 1.7 CAN 全局状态寄存器(CANGSR – 0xE00x x008) CANGSR 0 名称 RBS 功能 1:接收缓冲区状态——如果 CANRDA 和 CANRDB 寄存 器有效,CANRFS 和 CANRID 内接收到的信息可用,只要 以后再无可用的接收信息,该位通过 CANCMR 的释放接 收缓冲区命令清除。 复位值 0 RM 置位 0 1:数据溢出状态——由于前面传输到 CAN 控制器的数据 未被读出,而接收缓冲区没有及时释放,从而引起后面信 1 DOS 息丢失。 0 0 0:自从上次的清除数据溢出命令被写入 CANCMR(或自 从复位后)后就无数据溢出发生。 1:发送缓冲区状态——无发送信息(3 个 Tx 缓冲区中任 何 一 个 的 信 息 ) 等 待 CAN 控 制 器 处 理 , 软 件 可 以 向 CANTFI、CANTID、CANTDA 和 CANTDB 寄存器写入数 据。 2 TBS 1 X 0:至少有一条前面队列中的到 CAN 控制器的信息未被发 送,因此,软件不应该向存放信息的那个(那些)Tx 缓冲 区的 CANTFI、 CANTID、CANTDA 和 CANTDB 寄存器 写入数据。 1:发送结束状态——所有发送请求都被成功处理。 3 TCS 0:至少有一个请求发送未处理。 1 0 8 广州周立功单片机发展有限公司 www.zlgmcu.com 续表 1.7 CANGSR 4 5 6 7 23:16 31:24 名称 RS TS ES BS RXERR TXERR 功能 1:接收状态:CAN 控制器正在接收数据。 1:发送状态:CAN 控制器正在发送数据。 1:错误状态:发送和接收错误计数器的计数值或其中一个 的计数值已经达到出错警告界限寄存器中设置的阈值。 1:总线状态:由于发送错误计数器的计数值已达到其阈值 255,CAN 控制器目前被禁止。 Rx 错误计数器的当前值。 Tx 错误计数器的当前值。 复位值 0 0 0 0 0 0 RM 置位 0 0 0 0 X X 1.5.4 中断和捕获寄存器(CANICR – 0xE00x x00C) CANICR 寄存器的位用来表征 CAN 总线上出现的事件。它是一个只读寄存器。表中未 列出的寄存器位读出为 0,应向其写入 0。中断和捕获寄存器功能见表 1.8。 位 1-9 读出时被清零,位 16-23 在总线出现错误时捕获。同时,如果 CANIER 的 BEIE 位为 1,则 CANICR 的 BEI 位置位并产生 CAN 中断。位 24-31 在 CAN 仲裁丢失时捕获。 同时,如果 CANIER 的 ALIE 位为 1,则 CANICR 的 ALI 位置位并产生 CAN 中断。一旦上 述这些字节被捕获,它们的值将保持不变直到被读出(该值被读取后,将释放寄存器以捕获 新的值)。 不管如何进行读取寄存器操作,清除位 1-9 以及释放位 16-23 和 24-31 的操作都在读 CANICR 时完成。这就表明,软件总是按字的方式来读取 CANICR,并根据实际应用的需 要对所有寄存器的位进行处理。 表 1.8 CAN 中断和捕获寄存器(CANICR – 0xE00x x00C) CANICR 0 1 2 名称 RI TI1 EI 功能 复位值 1:接收中断…当 CANSR 的 RBS 位和 CANIER 的 RIE 位都为 0 1 时该位置位,表示接收到一条有用信息。 1:发送中断 1…当 CANSR 的 TBS1 位从 0 变为 1 且 CANIER 0 的 TIE1 位为 1 时该位置位,表明发送缓冲区 1 的数据可用。 1:出错警告中断…每当 CANSR 的错误状态或总线状态位的 状态改变(置位或清零),且 CANIER 的 EIE 位此时为 1 时, 0 该位置位。 RM 置位 0 0 X 1:数据溢出中断…当 CANSR 的 DOS 位从 0 变为 1,且 CANIE 3 DOI 0 0 的 DOIE 位为 1 时,该位置位。 1:唤醒中断:当 CAN 控制器处于睡眠状态时检测到总线活动, 4 WUI 0 0 并且 CANIE 的 WUIE 位为 1 时,该位置位。 1:错误认可中断…当 CANIE 的 EPIE 位为 1,且 CAN 控制器 5 EPI 在错误认可模式和错误主动模式两者之间进行任何方向的切 0 0 换时,该位置位。 9 广州周立功单片机发展有限公司 www.zlgmcu.com CANICR 6 名称 ALI 续表 1.8 功能 复位值 1:仲裁丢失中断…当 CANIE 的 ALIE 位为 1,且 CAN 控制器 0 在准备发送数据时丢失了仲裁,该位置位。 RM 置位 0 1:总线错误中断…当 CANIE 的 BEIE 位为 1,且 CAN 控制器 7 BEI 0 X 检测到总线错误时,该位置位。 8 IDI 1:ID 准备就绪中断…当 CANIE 的 IDIE 位为 1,且接收到一 0 0 个 CAN 标识符时,该位置位。 1:发送中断 2…当 CANSR 的 TBS2 位从 0 变为 1,且 CANIER 9 TI2 0 0 的 TIE2 位为 1 时,该位置位,表明发送缓冲区 2 可用。 1:发送中断 3…当 CANSR 的 TBS3 位从 0 变为 1,且 CANIER 10 TI3 0 0 的 TIE3 位为 1 时,该位置位,表明发送缓冲区 3 可用。 错误码捕获:这些捕获值反映了内部状态变量,并不表示内部 状态变化的线性规律。 00011:帧起始 00010:ID28:21 00110:ID20:18 00100:SRTR 位 00101:IDE 位 00111:ID17:13 01111:ID12:5 01110:ID4:0 01100:RTR 位 20:16 ERRBIT 01011:DLC 01010:数据域 01000:CRC 0 X 11000:CRC 分隔符 11001:Ack slot 11011:Ack 分隔符 11011:帧结束 10010:间断 10001:主动错误标志 10110:认可错误标志 10011:显性 OK 位 10111:错误间隔 11000:超载标志 读该字节用来使能捕获另一个总线错误中断。 当 CAN 控制器检测到总线错误时,当前位的传输方向捕获到 21 ERRDIR 0 X 该位。1=接收,0=发送。 当 CAN 控制器检测到总线错误时,错误类型被捕获到该域: 23:22 ERRC 0 X 00=位错误,01=格式错误,10=填充错误,11=其它错误。 如果在向 CAN 总线发送数据时出现仲裁丢失,数据帧的位编 号被捕获到该域。0 表明仲裁丢失发生在标识符的第一位 28:24 ALCBIT 0 X (MS)…31 表明仲裁丢失发生在扩展帧的 RTR 位。该字节读 出后,ALI 位清零,允许发生新的仲裁丢失中断。 1.5.5 中断使能寄存器(CANIER – 0xE00x x010) CANIER 是一个读/写寄存器,它控制着 CAN 控制器出现的事件是否能产生中断。该寄 存器的位 7:0 与 CANICR 寄存器的位 7:0 一一对应,中断使能寄存器功能见表 1.9。 10 广州周立功单片机发展有限公司 www.zlgmcu.com 表 1.9 CAN 中断使能寄存器(CANIER – 0xE00x x010) CANIER 名称 功能 复位值 RM 置位 0 RIE 接收器中断使能 1 TIE1 发送中断使能(1) 2 EIE 出错警告中断使能 3 DOIE 数据溢出中断使能 4 WUIE 唤醒中断使能 5 EPIE 错误认可中断使能 6 ALIE 仲裁丢失中断使能 7 BEIE 总线错误中断使能 8 IDIE ID 准备就绪中断使能 9 TIE2 发送中断使能(2) 10 TIE3 发送中断使能(3) 0 X 0 X 0 X 0 X 0 X 0 X 0 X 0 X 0 X 0 X 0 X 1.5.6 总线时序寄存器(CANBTR – 0xE00x x014) CANBTR 寄存器控制着由微处理器的 VPB 时钟驱动的各种 CAN 时序。该寄存器可随 时读取,但只能在 CANMOD 的 RM 位为 1 时写入,总线思绪寄存器功能见表 1.10。 表 1.10 CAN 总线时序寄存器(CANBTR - 0xE00x x014) CANBTR 名称 功能 复位值 RM 置位 波特率预分频器。VPB 时钟被(该域的值+1)分频来产生 0:9 BRP 0 X CAN 时钟。 15:14 SJW 同步跳变宽度为(该值+1)个 CAN 时钟周期。 0 X 指定同步点到采样点的延时时间为(该域的值+1)个 CAN 19:16 TSEG1 1100 X 时钟周期。 采样点到下个指定同步点的延时时间为(该域的值+1)个 22:20 TSEG2 CAN 时钟周期。指定的 CAN 位时间为(该域的值+TSEG1 001 X 的值+3)个 CAN 时钟周期。 23 SAM 1:总线采样 3 次(建议用于低到中速的总线); 0:总线采样 1 次(建议用于高速总线)。 0 X 1.5.7 出错警告界限寄存器(CANEWL – 0xE00x x018) CANEWL 寄存器设定了一个 Tx 或 Rx 出错阈值,可用于产生中断。该寄存器可随时读 取,但只能在 CANMOD 的 RM 位为 1 时写入,具体功能见表 1.11。 表 1.11 CAN 出错警告界限寄存器(CANEWL – 0xE00x x018) CANEWL 名称 功能 复位值 RM 置位 在 CAN 操作过程中,该值与 Tx 和 Rx 错误计数器的计数 7:0 EWL 器相比较,如果其中一个计数值与该值相等,CANSR 的错 9610=0x60 X 误状态(ES)位置位。 11 广州周立功单片机发展有限公司 www.zlgmcu.com 1.5.8 状态寄存器(CANSR – 0xE00x x01C) CANSR 寄存器含有 3 个状态字节,状态字节中与发送无关的位和全局状态寄存器中相 应的位相同,与发送有关的位反映了 3 个 Tx 缓冲区的状态,具体功能见表 1.12。 表 1.12 CAN 状态寄存器(CANSR – 0xE00x x01C) CANSR 名称 功能 复位值 RM 置位 0,8,16 RBS 这些位与 GSR 寄存器的 RBS 位相同。 0 0 1,9,17 DOS 这些位与 GSR 寄存器的 DOS 位相同。 0 0 1:软件可以向这个 Tx 缓冲区的 CANTFI、CANTID、 TBS1,TBS2, CANTDA 和 CANTDB 寄存器写入数据。 2,10,18 1 X TBS3 0:软件不能向这个 Tx 缓冲区的 CANTFI、CANTID、 CANTDA 和 CANTDB 寄存器写入数据。 TCS1,TCS2, 1:这个 Tx 缓冲区的所有发送请求都已经成功处理。 3,11,19 1 0 TCS3 0:这个 Tx 缓冲区的发送请求并未完全处理。 4,12,20 RS 这些位与 GSR 寄存器的 RS 位相同。 0 0 5,13,21 6,14,22 7,15,23 TS1,TS2, TS3 ES BS 1:CAN 控制器正在发送 Tx 缓冲区的信息。 这些位与 GSR 寄存器的 ES 位相同。 这些位与 GSR 寄存器的 BS 位相同。 0 0 0 0 0 0 1.5.9 Rx 帧状态寄存器(CANRFS – 0xE00x x020) CANRFS 寄存器用来定义当前接收到的信息的特性。正常工作模式下只能对它执行读 操作,但可在 CANMOD 的 RM 位为 1 时被写入以用作测试,具体功能见表 1.13。 表 1.13 CAN Rx 帧状态寄存器(CANRFS – 0xE00x x020) CANRFS 名称 功能 复位值 RM 置位 如果 BP 位(见下行)为 0,该字段的值是从零开始的查询 表格 RAM 行的编号,验收过滤器利用该值来匹配接收标识 9:0 ID 索引 符。标准表格中的禁能行也设定有编号,但不参与匹配。 0 X 详见“验收过滤器表格和 ID 索引值举例”中的 ID 索引值举 例。 如果该位为 1,则当前接收的信息处于验收过滤器(AF) 10 BP 旁路(Bypass)模式,ID 索引字段(见上行)无意义。 0 X 该域包含了当前接收到的信息的数据长度代码(DLC)。当 RTR=0 时,它与 CANRDA 和 CANRDB 寄存器中的数据字 19:16 DLC 节数有关: 0000-0111=0~7 个字节 1000-1111=8 个字节 0 X RTR=1 时,DLC 用来指示请求发回的数据字节数,使用相 同的编码方式。 12 广州周立功单片机发展有限公司 www.zlgmcu.com 续表 1.13 CANRFS 名称 功能 复位值 RM 置位 该位包含了当前接收到的信息的远程发送请求位。0 表明接 收到一个数据帧,数据可从 CANRDA 和 CANRDB 寄存器 30 RTR 中读出(如果 DLC 不为零)。1 表明接收到一个远程帧,这 0 X 时 DLC 的值用来表示使用相同识别符的请求发送的数据字 节数。 该位为 0 时,表明当前接收到的信息包含 11 位标识符;该 31 FF 位为 1 时,表明当前接收到的信息包含 29 位标识符。FF 的 0 X 值直接影响着下面将要描述的 CANID 寄存器的内容。 1.5.10 Rx 标识符寄存器(CANRID – 0xE00x x024) 该寄存器包含了当前接收到的信息的标识符字段。正常工作模式下只能对它执行读操 作,但可在 CANMOD 的 RM 位为 1 时被写入以用作测试。CANRID 寄存器有 2 种不同格 式,由 CANRFS 寄存器中 FF 位决定,标准帧格式见表 1.14,扩展帧格式见表 1.15。 表 1.14 CAN Rx 标识符寄存器(FF=0)(CANRID – 0xE00x x024) CANRID 10:0 名称 ID 功能 复位值 RM 置位 当 前 接 收 到 的 信 息 的 11 位 标 识 符 字 段 。 这 些 位 在 CAN2.0A 规范被称为 ID10-0,在 CAN2.0B 中被称为 0 X ID29-18。 表 1.15 CAN Rx 标识符寄存器(FF=1)(CANRID – 0xE00x x024) CANRID 名称 功能 复位值 RM 置位 当 前 接 收 到 的 信 息 的 29 位 标 识 符 字 段 。 这 些 位 在 28:0 ID CAN2.0B 规范中被称为 ID29-0。 0 X 1.5.11 Rx 数据寄存器 A(CANRDA – 0xE00x x028) CANRDA 寄存器包含了当前接收到的信息的前面 1~4 个数据字节。正常工作模式下只 能对它执行读操作,但可在 CANMOD 的 RM 位为 1 时被写入以用作测试,具体功能见表 1.16。 表 1.16 CAN Rx 数据寄存器 A(CANRDA – 0xE00x x028) CANRDA 7:0 15:8 23:16 31:24 名称 数据 1 数据 2 数据 3 数据 4 功能 如果 CANRFS 寄存器的 DLC 值>=0001,该域包含的是 当前接收到的信息的第 1 个数据字节。 如果 CANRFS 寄存器的 DLC 值>=0010,该域包含的是 当前接收到的信息的第 2 个数据字节。 如果 CANRFS 寄存器的 DLC 值>=0011,该域包含的是当 前接收到的信息的第 3 个数据字节。 如果 CANRFS 寄存器的 DLC 值>=0100,该域包含的是 当前接收到的信息的第 4 个数据字节。 复位值 0 0 0 0 RM 置位 X X X X 13 广州周立功单片机发展有限公司 www.zlgmcu.com 1.5.12 Rx 数据寄存器 B(CANRDB – 0xE00x x02C) CANRDB 寄存器包含了当前接收到的信息的第 5~8 个数据字节。正常工作模式下只能 对它执行读操作,但可在 CANMOD 的 RM 位为 1 时被写入以用作测试,具体功能见表 1.17。 表 1.17 CAN Rx 数据寄存器 B(CANRDB – 0xE00x x02C) CANRDB 名称 功能 复位值 RM 置位 如果 CANRFS 寄存器的 DLC 值>=0101,该域包含的是 7:0 数据 5 0 X 当前接收到的信息的第 5 个数据字节。 如果 CANRFS 寄存器的 DLC 值>=0110,该域包含的是当 15:8 数据 6 0 X 前接收到的信息的第 6 个数据字节。 23:16 数据 7 如果 CANRFS 寄存器的 DLC 值>=0111,该域包含的是当 0 X 前接收到的信息的第 7 个数据字节。 如果 CANRFS 寄存器的 DLC 值>=1000,该域包含的是 31:24 数据 8 0 X 当前接收到的信息的第 8 个数据字节。 1.5.13 Tx 帧信息寄存器(CANTFI1,2,3 – 0xE00x x030,40,50) 当 CANSR 的 TBSn 位为 1 时,软件可以向 CANTFIn 写入数据,来定义对应的 Tx 缓冲 区中下一条将发送信息的格式。表中未列出的寄存器位读出为 0,并应向其写入 0,具体功 能见表 1.18。 表 1.18 CAN Tx 帧信息寄存器(CANTFI1,2,3 – 0xE00x x030,40,50) CANTFI 名称 功能 复位值 RM 置位 如果 CANMOD 寄存器的 TPM 位为 1,根据该域的值, 7:0 PRIO 使能的 Tx 缓冲区将竞争信息的发送权。PRIO 的值越小, 优先权就越高。 该值将从下一条发送信息的 DLC 字段中发送出去。如 果 RTR=0,DLC 控制着下一条发送信息的数据字节数, 19:16 DLC 0 X 发送信息来自 CANTDA 和 CANTDB 寄存器: 0000-0111=0~7 个字节 1xxx=8 个字节 该值将从下一条发送信息的 RTR 位中发送出去。如果 该位为 0,DLC 字段调用的数据字节数将从 CANTDA 30 RTR 0 X 和 CANTDB 寄存器中发送出去。如果该位为 1,发送 远程帧,要求传输的数据字节数包含在帧内。 该位为 0 时,发送的下一条信息包含 11 位的标识符。 31 FF 0 X 该位为 1 时,发送的下一条信息包含 29 位的标识符。 1.5.14 Tx 标识符寄存器(CANTID1,2,3 – 0xE00x x034,44,54) 当 CANSR 的 TBSn 位为 1 时,软件可以向 CANTFIn 写入数据来定义下一条发送信息 的标识符。表中未列出的寄存器位读出为 0,并应向其写入 0。该寄存器有 2 种不同格式, 由 CANTFIn 寄存器的 FF 位决定。标准帧格式见表 1.19,扩展帧格式见表 1.20。 14 广州周立功单片机发展有限公司 www.zlgmcu.com 表 1.19 CAN Tx 标识符寄存器(FF=0)(CANTID1,2,3 – 0xE00x x034,44,54) CANTID 名称 功能 10:0 ID 下条发送信息包含 11 位的标识符。 复位值 RM 置位 0 X 表 1.20 CAN Tx 标识符寄存器(FF=1)(CANTID1,2,3 – 0xE00x x034,44,54) CANTID 28:0 名称 ID 功能 下条发送信息包含 29 位的标识符。 复位值 RM 置位 0 X 1.5.15 Tx 数据寄存器 A(CANTDA1,2,3 – 0xE00x x038,48,58) 当 CANSR 的 TBSn 位为 1 时,软件写入 CANTDAn 寄存器来定义下一条信息的前 1~ 4 个数据字节,具体功能见表 1.21。 表 1.21 CAN Tx 数据寄存器 A(CANTDA1,2,3 – 0xE00x x038,48,58) CANTDA 名称 功能 复位值 RM 置位 如果 CANTFI 寄存器的 RTR=0 且 DLC 值>=0001,该字 7:0 数据 1 0 X 节作为下条信息的第 1 个数据字节。 如果 CANTFI 寄存器的 RTR=0 且 DLC 值>=0010,该字 15:8 数据 2 0 X 节作为下条信息的第 2 个数据字节。 如果 CANTFI 寄存器的 RTR=0 且 DLC 值>=0011,该字 23:16 数据 3 0 X 节作为下条信息的第 3 个数据字节。 如果 CANTFI 寄存器的 RTR=0 且 DLC 值>=0100,该字 31:24 数据 4 0 X 节作为下条信息的第 4 个数据字节。 1.5.16 Tx 数据寄存器 B(CANTDB1,2,3 – 0xE00x x03C,4C,5C) 当 CANSR 的 TBSn 位为 1 时,软件写入 CANTDAn 寄存器来定义下一条信息的第 5~ 8 个数据字节,具体功能见表 1.22。 表 1.22 CAN Tx 数据寄存器 B(CANTDB1,2,3 – 0xE00x x03C,4C,5C) CANRDB 名称 功能 复位值 RM 置位 如果 CANTFI 寄存器的 RTR=0 且 DLC 值>=0101,该字 7:0 数据 5 0 X 节作为下条信息的第 5 个数据字节。 如果 CANTFI 寄存器的 RTR=0 且 DLC 值>=0110,该字 15:8 数据 6 0 X 节作为下条信息的第 6 个数据字节。 如果 CANTFI 寄存器的 RTR=0 且 DLC 值>=0111,该字 23:16 数据 7 0 X 节作为下条信息的第 7 个数据字节。 如果 CANTFI 寄存器的 RTR=0 且 DLC 值>=1000,该字 31:24 数据 8 0 X 节作为下条信息的第 8 个数据字节。 15 广州周立功单片机发展有限公司 www.zlgmcu.com 1.6 寄存器操作方法 我们以 CAN 的模式寄存器的操作方法为例,介绍操作 CAN 寄存器的方法。其他的寄 存器定义和使用请读者参考附带的程序。 操作详解: 模式寄存器决定了 CAN 控制器的工作模式,所以在应用中对于该寄存器的设置显得非 常重要。由于该寄存器是可以读写的,所以完全可以实现不同功能位的分时操作。在操作这 些功能位时,应该注意 LOM 和 STM 位只有在 RM 位为 1 时才能被写入。为了方便操作, 可以将该寄存器用一个数据结构——联合的方式来定义。下面的例子说明了定义该寄存器并 对该寄存器进行读写操作的过程。 1. 用数据类型对该寄存器进行描述,以便更直观、更方便的操作。因为该寄存器可以 同时操作,也可以分时操作,所以可以用联合的方式来描述该寄存器的内容。这样便可以实 现同时操作该寄存器的 32 个位,或只操作其中的某个功能位。如程序清单 1.1。 程序清单 1.1 CAN 寄存器的定义 //CAN 模式寄存器数据类型定义 typedef union _canmod_ { UINT32 Word; struct { UINT32 RM_BIT :1; UINT32 LOM_BIT :1; UINT32 STM_BIT :1; UINT32 TPM_BIT :1; UINT32 SM_BIT :1; UINT32 RPM_BIT :1; UINT32 RSV_BIT1 :1; UINT32 TM_BIT :1; UINT32 RSV_BIT24 :24; }Bits; }uCANMod,*P_uCANMod; //定义 RM 位 //定义 LOM 位 //定义 STM 位 //定义 TPM 位 //定义 SM 位 //定义 RPM 位 //保留位 //定义 TM 位 //保留位 2. 定义该寄存器在微处理器 VPB 空间的基地址。 //定义模式寄存器在 ARM 中 VPB 的基地址 #define CANMOD_BADR 0xE0044000 3. 定义 1 个统一的对所有 CAN 模块该功能寄存器进行操作的方法。 //定义所有 CAN 模块模式寄存器的数据类型 #define CANMOD(CanNum) (*((volatile P_uCANMod) (CANMOD_BADR+CanNum* CAN_OFFSET_ADR))) 程序清单 1.2 描述了对 CAN 模块 4 模式寄存器中 LOM 位置位的操作。 程序清单 1.2 寄存器的操作 CANMOD(CAN4).Bits. RM _BIT CANMOD(CAN4).Bits.LOM_BIT = 1; = 1; //在写操作 LOM 位之前,RM 必须为 1 //CAN 控制器操作 16 广州周立功单片机发展有限公司 www.zlgmcu.com 1.6.1 错误处理 CAN 控制器根据 CAN 2.0B 规范来对发送和接收错误进行计数、处理。每当检测到一 个错误,发送或接收错误计数器将加 1;当错误被释放后,发送和接收错误计数器减 1。如 果发送错误计数器的值为 255 时出现一个错误,CAN 控制器强制进入总线离线状态。此状 态下,以下寄存器位被置位:CANSR 的位 BS、CANIR 的位 BEI 和位 EI(如果使能)和 CANMOD 的位 RM。RM 将许多 CAN 控制器功能复位和禁止。此时发送错误计数器设置成 127,接收错误计数器清零。软件必须在下一步清零 RM 位。这样,发送错误计数器将递减 计数总线释放条件(11 个连续的隐性位)的第 128 个事件。软件可通过读取 Tx 错误计数器 对计数器递减计数的情况进行监测。当递减计数结束后,CAN 控制器清除 CANSR 的位 BS 和 ES,并置位 CANICR 的位 EI(如果 IER 的 EIE 为 1)。 如果 CANMOD 的 RM 位为 1,Tx 和 Rx 错误计数器可被写入。向 Tx 错误计数器写入 255 将使 CAN 控制器强制进入总线离线状态。如果总线离线(CANSR 的 BS 位)位为 1, 向 Tx 错误计数器写入 0~254 中的任何一个值都可清除总线离线。当通过软件清除 CANMOD 的 RM 后,只需要一个总线释放条件(11 个连续的隐性位)就可恢复操作。 重要提示: 在一般情况下,只有当总线发生严重故障的情况下才有可能发生总线脱离。这些现象有 TX、RX 与收 发器之间的连接断路、收发器的 CAN_H、CAN_L 之间短路等。所以 CAN 总线上的错误,仅仅当发生总线 离线时才有必要去处理,而其他的错误可以不用处理。如果不是硬件复位,而是软件将 RM 清零,在总线 离线清除后,这时 CANSR 寄存器的 TCS(发送成功)位仍然为 0 来表示上次发送不成功。除非再次启动 发送,数据发送成功后,TCS 位才会标志为 1。 程序清单 1.3 是该错误处理的操作示例。 程序清单 1.3 错误处理的操作 // 方法 1,等待 CAN 控制器清除总线离线 UINT32 i; …… if(0 != CANGSR(CAN1).Bits.BS) { CANMOD(CAN1).Bits.RM =0; for(i=0;i<2000000;i++) { if(CANGSR(CAN1).Bits.TXERR == 0) { break; } } } …… // 方法 2,快速清除总线离线 if(0 != CANGSR(CAN1).Bits.BS) { CANGSR(CAN1).Bits.TXERR =0; CANMOD(CAN1).Bits.RM =0; } …… // 总线脱离 // 清除 RM 位 // 如果总线故障没解决,超时退出 // 清除总线脱离 // 总线脱离 // 手动清零错误计数器 // 清除 RM 位 17 广州周立功单片机发展有限公司 www.zlgmcu.com 1.6.2 睡眠模式 如果 CAN 模式寄存器的 SM 位为 1 且无中断等待和 CAN 总线活动,CAN 控制器将进 入睡眠模式。当 CAN 模式寄存器的 RM 为 0 时,软件只能置位 SM;也可通过软件来置位 CAN 中断使能寄存器的 WUIE 位以使能唤醒中断。 CAN 控制器唤醒(并置位 CAN 中断寄存器的 WUI 位,只要 CAN 中断使能寄存器的 WUIE 位为 1)来响应 a) CAN 总线出现一个显性位,或 b) CAN 模式寄存器的 SM 位通过软 件清零。为了响应总线活动而被唤醒的休眠 CAN 控制器并不能接收初始信息,直到它检测 到总线释放条件(11 个连续的隐性位)。如果在软件置位 SM 时中断挂起或 CAN 总线激活, 则 CAN 控制器立刻被唤醒。 关于睡眠模式的注意事项: 在 LPC2119/2129 芯片错误报告(版本 V1.1,发布日期为 04 年 6 月 1 日)中,“A”版 LPC2119/2129 芯片的 CAN 模块在测试中发现睡眠模式存在以下问题。 CAN.2 No wake up from CAN sleep mode using SM bit Introduction: The CAN Controller will enter sleep mode if the SM bit in the CAN Mode register is 1, no CAN interrupt is pending, and there is no activity on the CAN bus. The CAN Controller wakes up (and sets WUI in the CAN Interrupt register if WUIE in the CAN Interrupt Enable register is 1), in response to a dominant bit on the CAN bus or software clearing the SM bit in the CAN Mode register. Problem: Clearing the SM bit does not cause the CAN module to wakeup from CAN sleep mode. work-around: None, the SM bit cannot be used as a source of CAN wakeup. 解释: 处于睡眠模式的 CAN 模块不能够通过软件清除 SM 位(CAN 模式寄存器)来唤醒这个 CAN 模块,但可以由外部 CAN 报文唤醒。因此,在需要主动发送 CAN 报文的应用场合, 不可以置位 SM 位,导致这个 CAN 模块进入睡眠模式。 1.6.3 中断 每个 CAN 控制器可产生 3 种中断请求:接收、发送和“其它状态”。发送中断是 3 个 Tx 缓冲区发送中断“或”的结果。每个控制器的各个接收和发送中断请求在向量中断控制器 (VIC)中分配有不同的通路并拥有各自的中断服务程序。所有 CAN 控制器的“其它状态” 和验收过滤器 LUTerr 条件相或到一个 VIC 通道。根据“LPC2119/2129/2194/2292/2294 USER MANUAL”中关于 CAN 中断通道的描述如表 1.23。 表 1.23 CAN 中断通道的描述(原文) Block Flag(s) CAN and Acceptance Filter(1 ORed CAN, LUTerr int) VIC 通道号 19 CAN1 Tx 20 CAN2 Tx 21 CAN3 Tx(仅支持 LPC2194/2294 芯片) 22 CAN CAN4 Tx(仅支持 LPC2194/2294 芯片) 23 CAN1 Rx 26 CAN2 Rx 27 CAN3 Tx(仅支持 LPC2194/2294 芯片) 28 CAN4 Tx(仅支持 LPC2194/2294 芯片) 29 18 广州周立功单片机发展有限公司 www.zlgmcu.com 经过在 EasyARM2119 开发板上测试,各中断正常。 测试程序如程序清单 1.4。 程序清单 1.4 中断测试(初始化部分) VICVectAddr8 = (INT32U)CANIntPrg; VICVectCntl8 = (0x20|26); VICIntEnable |=(1<<(26+ CanNum)); CANIER(CanNum).Word= 0x01; //中断服务程序 CANIntPrg //26 通道中断为向量 IRQ //使能 26 通道中断 //只开放接收中断 1.6.4 发送优先级 如果 CANMOD 寄存器的 TPM 位为 0,多个使能的 Tx 缓冲区根据各自的 CAN 标识符 (TID)来竞争信息发送权。如果 TMP 为 1,则它们根据各自的 CANTFS 寄存器位 7:0 的 PRIO 字段值来竞争。两种情况下都是最小的二进制值拥有优先权。如果 2(或 3)个发送使 能的缓冲区具有同样的最小值,则先发送编号小的缓冲区的数据。CAN 控制器先对多个使 能的 Tx 缓冲区进行动态选择,再发送信息。 1.7 组合 CAN 寄存器 3 个只读寄存器将 CAN 控制器的状态寄存器的所有位组合在一起便于共同访问。如果 器件定义了更多或更少的 CAN 控制器,寄存器中有效字节的位数也随之改变。下列寄存器 中每个定义的字节的 LS 位都是对应于一个 CAN 控制寄存器的特定状态位。 1.7.1 集中发送状态寄存器(CANTxSR – 0xE004 0000) 集中发送状态寄存器具体功能见表 1.24。 表 1.24 CAN 集中发送状态寄存器(CANTxSR – 0xE004 0000) CANTxSR 名称 功能 复位值 3:0 7:4 11:8 15:12 19:16 31:20 TS4:1 1:CAN 控制器正在发送信息(同于 CANGSR 的 TS) TS4:3 仅用于 LPC2294。它们在其它器件中是保留位。 保留 保留,用户软件不要向其写入 1。从保留位读出的值未被定义。 1:3 个 Tx 缓冲区均可供 CPU 使用(同于 CANGSR 的 TBS) TBS4:1 TBS4:3 仅用于 LPC2294。它们在其它器件中是保留位。 保留 保留,用户软件不要向其写入 1。从保留位读出的值未被定义。 1:所有请求发送都已成功处理(同于 CANGSR 的 TCS) TCS4:1 TCS4:3 仅用于 LPC2294。它们在其它器件中是保留位。 保留 保留,用户软件不要向其写入 1。从保留位读出的值未被定义。 0 NA 全为 1 NA 全为 1 NA 19 广州周立功单片机发展有限公司 www.zlgmcu.com 1.7.2 集中接收状态寄存器(CANRxSR – 0xE004 0004) 集中接收状态寄存器具体功能见表 1.25。 表 1.25 CAN 集中接收状态寄存器(CANRxSR – 0xE004 0004) CANRxSR 名称 功能 复位值 1:CAN 控制器正在接收数据(同于 CANGSR 的 RS) 3:0 RS4:1 0 RS4:3 仅用于 LPC2294。它们在其它器件中是保留位。 7:4 保留 保留,用户软件不要向其写入 1。从保留位读出的值未被定义。 NA 1:CAN 控制器接收到可用的信息(同于 CANGSR 的 RBS) 11:8 RBS4:1 0 RBS4:3 仅用于 LPC2294。它们在其它器件中是保留位。 15:12 保留 保留,用户软件不要向其写入 1。从保留位读出的值未被定义。 NA 1:由于前面传输到 CAN 控制器的数据未被尽快读出而引起信息丢 19:16 DOS4:1 失(同于 CANGSR 的 DOS) 0 DOS4:3 仅用于 LPC2294。它们在其它器件中是保留位。 31:20 保留 保留。用户软件不要向其写入 1。从保留位读出的值未被定义。 NA 1.7.3 集中其他状态寄存器(CANMSR – 0xE004 0008) 集中其他状态寄存器具体功能见表 1.26。 表 1.26 CAN 集中其他状态寄存器(CANMSR – 0xE004 0008) CANMSR 名称 功能 复位值 1:Tx 和 Rx 错误计数器两者或其中之一的计数值达到 EWL 寄存器 3:0 ES4:1 设定的阈值(同于 CANGSR 的 ES) 0 ES4:3 仅用于 LPC2294。它们在其它器件中是保留位。 7:4 保留 保留。用户软件不要向其写入 1。从保留位读出的值未被定义。 NA 1:CAN 控制器正在处理总线活动(同于 CANGSR 的 BS) 11:8 BS4:1 0 BS4:3 仅用于 LPC2294。它们在其它器件中是保留位。 31:12 保留 保留。用户软件不要向其写入 1。从保留位读出的值未被定义。 NA 20 广州周立功单片机发展有限公司 www.zlgmcu.com 1.8 全局验收过滤器 该模块为所有 CAN 控制器提供了接收标识符的查询功能(CAN 术语称之为验收过滤)。 它包含一个 512×32bit(2k 字节)的 RAM,通过软件处理,可在 RAM 中存放 1~5 个标识 符表格。整个 RAM 可容纳 1024 个标准标识符或 512 个扩展标识符或两种类型混合的标识 符。 如果在应用中使用的是标准标识符(11 位),则 3 个表格中至少有一个必定不为空。如 果“fullCAN 模式”选项使能,第 1 个表格存放标准标识符,用于 fullCAN 模式中接收的处理。 第 2 个表格存放单个标准标识符,第 3 个表格存放标准标识符的范围,使信息通过 CAN 控 制器接收。FullCAN 的单个标准标识符表格必须按升序排列,每半字为 1 个标识符,每个字 包含 2 个标识符。由于每个 CAN 总线都有自身的地址映射,因此表格的每个条目都必须包 含使用的 CAN 控制器的编号(001-110)。FullCAN 下单个标准帧标识符表格单元结构如图 1.1 所示。 图 1.1 单个标准标识符表单元结构 标识符范围表格包含标识符的一对上下边界(边界值包含在内),一对范围占用一个字。 按升序排列,其结构如图 1.2 所示。 图 1.2 标准标识符范围表格单元结构 标准标识符单元的禁能位提供了一种开/关特定 CAN 标识符或范围标识符响应的方法。 当验收过滤器功能被使能,验收过滤器 RAM 中只有禁能位可通过软件来改变。通过向 RAM 中相应的字内写入 32 位 0 来使能对标准地址范围的响应,并且,通过写入 32 位 1(0xFFFF FFFF)来关闭该响应。在整个过程中只有禁能位被改变。 如果在应用中使用的是扩展标识符(29 位),验收过滤器 RAM 其它 2 个表格中至少有 1 个必定不为空,两个表格一个用来存放单个扩展标识符,一个用来存放扩展标识符的范围。 单个扩展标识符表格必须按升序排列。图 1.3 为单个扩展标识符表格单元结构。 图 1.3 扩展标识符表格单元结构 扩展标识符范围表格必须含有偶数个行,其格式与单个扩展标识符表格相同。和单个扩 展标识符的表格一样,扩展范围必须按升序排列。表中的第 1 和第 2 行(第 3 和第 4 行…) 形成一对,作为包括边界在内的扩展地址范围。这样,包含在地址范围内(含边界)的地址 就一定能接收到。要求编写的软件必须保证表格由一对一对的字组成。 使用 fullCAN 方法来接收扩展标识符信息实现起来并不容易。 有 5 个地址寄存器用来指向验收过滤器 RAM 中的表格:fullCAN 标准地址、标准单个 地址、标准地址范围、扩展单个地址和扩展地址范围。这些表格在存储器中必须是连续的。 后 4 个表格的起始地址分别是各自相邻的前一个表格的终止地址。扩展地址范围表格的终止 地址在表格终止寄存器中给出。如果一个表格的起始地址等于下一个表格的起始地址或表格 终止寄存器的值,则该表格为空。 21 广州周立功单片机发展有限公司 www.zlgmcu.com 当 CAN 控制器的接收端已接收到一个完整的标识符,它将通知验收过滤器。验收过滤 器响应这个信号,并读出控制器编号、标识符尺寸,以及来自控制器本身的标识符。然后, 验收过滤器搜索 RAM 中的表格,以决定接收或放弃这一帧信息。 如果 fullCAN 模式使能且 CAN 控制器告知当前信息包含一个标准标识符,则验收过滤 器首先查询标识符表格,以便接收可在 fullCAN 模式下处理。另外,如果 AF 未在 fullCAN 表格中发现合适的匹配,它将接着查询单个标识符表格,以获取 CAN 控制器给出的标识符 长度。只要发现相等的匹配,AF 就通知 CAN 控制器保存信息,并提供一个 ID 索引值使之 保存到接收帧状态寄存器(CANRFS)中。 如果验收过滤器未在单个标识符表格中找到相等的匹配,它便接着查询标识符范围表 格,以获取 CAN 控制器给出的标识符长度。如果 AF 在表格的范围中发现了合适的匹配, 它就通知 CAN 控制器保存信息,并提供一个 ID 索引值使之保存到接收帧状态寄存器 (CANRFS)中。如果在单个标识符表格或范围表格中,AF 都未找到与接收到的标识符长 度相匹配的值,AF 便通知 CAN 控制器丢弃/忽略接收到的信息。 1.8.1 验收过滤器寄存器 验收过滤寄存器的功能如表 1.27。 表 1.27 验收过滤器模式寄存器(AFMR – 0xE003 C000) AFMR 名称 功能 复位值 1:如果 AccBP 为 0,验收过滤器不工作。所有 CAN 总线上的 0 AccOff 1 Rx 信息均被忽略。 1:所有 Rx 信息被使能的 CAN 控制器接收。软件必须先置位该 位,再修改以下各个寄存器的内容和查询表格 RAM 的内容(但 1 AccBP 0 不能置位或清零标准标识符行的禁能位)。如果该位和 AccOff 都 为 0,验收过滤器就将接收到的 CAN 标识符屏蔽。 1:由验收过滤器自身来处理所选 CAN 总线上指定标准 ID 值的 信息的接收和保存。见“FullCAN 模式”。 2 eFCAN 0 0:通过软件从接收 CAN 控制器中读出所有使能 CAN 总线上的 ID 被使能的全部信息。 1.8.2 标准帧单个起始地址寄存器(SFF_sa – 0xE003 C004) 标准帧单个起始地址寄存器功能如表 1.28。 表 1.28 标准帧起始地址寄存器(SFF_sa – 0xE003 C004) SFF_sa 10:2 名称 功能 复位值 AF 查询 RAM 中单个标准标识符表格的起始地址。如果表格为 空,该寄存器和下面的 SFF_GRP_sa 寄存器必须写入相同的值。 为了兼容未来的器件,该寄存器的位 31:11 和 1:0 应当写入 0。如 0 果 AFMR 的 eFCAN 位为 1,SFF_sa 的值就指明了标准 ID 表格 的规格,这也是验收过滤器将要查询的值,一旦发现该值,验收 过滤器自动将接收信息存放到验收过滤器 RAM 中。 22 广州周立功单片机发展有限公司 www.zlgmcu.com 1.8.3 标准帧组起始地址寄存器(SFF_GRP_sa – 0xE003 C008) 标准帧组起始地址寄存器功能如表 1.29。 表 1.29 标准帧组起始地址寄存器(SFF_GRP_sa – 0xE003 C008) SFF_GRP_sa 11:2 名称 功能 AF 查询 RAM 中标准标识符组表格的起始地址。如果表格为 空,该寄存器和下面的 EFF_sa 寄存器必须写入相同的值。当 只有标准单个标识符被使用并且 AF 查询表格 RAM 的最后一 个字(地址 0x7FC)被使用时,该寄存器允许写入的最大值是 0x800。为了兼容未来的器件,该寄存器的位 31:12 和 1:0 应当 写入 0。 1.8.4 扩展帧起始地址寄存器(EFF_sa – 0xE003 C00C) 扩展帧起始地址寄存器功能如表 1.30。 复位值 0 表 1.30 扩展帧起始地址寄存器 EFF_sa – 0xE003 C00C) EFF_sa 10:2 名称 功能 AF 查询 RAM 中单个扩展标准标识符表格的起始地址。如果表 格为空,该寄存器和下面的 EFF_GRP_sa 寄存器必须写入相同的 值。当扩展表格为空并且 AF 查询表格 RAM 的最后一个字(地 址 0x7FC)被使用时,该寄存器允许写入的最大值是 0x800。为 了兼容未来的器件,该寄存器的位 31:11 和 1:0 应当写入 0。 1.8.5 扩展帧组起始地址寄存器(EFF_GRP_sa – 0xE003 C010) 扩展帧组起始地址寄存器功能如表 1.31。 复位值 0 表 1.31 扩展帧组起始地址寄存器(EFF_GRP_sa – 0xE003 C010) EFF_GRP_sa 11:2 名称 功能 复位值 AF 查询 RAM 中扩展标识符组表格的起始地址。如果表格为 空,该寄存器和下面的 ENDofTable 寄存器必须写入相同的值。 当该表格为空并且 AF 查询表格 RAM 的最后一个字(地址 0 0x7FC)被使用时,该寄存器允许写入的最大值是 0x800。为 了兼容未来的器件,该寄存器的位 31:12 和 1:0 应当写入 0。 1.8.6 AF 表格终止寄存器(ENDofTable – 0xE003 C014) AF 表格终止寄存器功能如表 1.32。 表 1.32 AF 表格终止寄存器(ENDofTable – 0xE003 C014) ENDofTable 11:2 名称 功能 最后一个有效 AF 表格中最后有效的地址的上个地址。为了兼容 未来的器件,该寄存器的位 31:12 和 1:0 应当写入 0。 如果 AFMR 的 eFCAN 位为 0,该寄存器允许写入的最大值是 0x800,使得 AF 查询表格 RAM 的最后一个字(地址 0x7FC) 可被使用。 如果 AFMR 的 eFCAN 位为 1,该值是用来标注收滤波器 RAM 区的起始位置,在该区域内,验收过滤器将自动接收所选 CAN 总线上被指定 ID 的信息。这种情况下,该寄存器被写入的最大 值为 0x800-(6×SFF_sa 的值)。使该地址和验收过滤器 RAM 终止地址之间允许保存 12 个字节的信息,每个标准 ID 被指定 在验收过滤器 RAM 起始地址和下一个有效 AF 表格之间。 复位值 0 23 广州周立功单片机发展有限公司 www.zlgmcu.com 1.8.7 LUT 错误地址寄存器(LUTerrAd – 0xE003 C018) LUT 错误地址寄存器功能如表 1.33。 表 1.33 LUT 错误地址寄存器(LUTerrAd – 0xE003 C018) LUTerrAd 名称 功能 复位值 如果 LUT 错误位(下面)为 1,该只读字段包含一个 AF 查询表 10:2 0 格 RAM 的地址,在该地址处验收过滤器遇到表格内容错误。 1.8.8 LUT 错误寄存器(LUTerr – 0xE003 C01C) LUT 错误寄存器功能如表 1.34。 表 1.34 LUT 错误寄存器(LUTerr – 0xE003 C01C) LUTerr 0 名称 功能 复位值 当验收过滤器遇到 AF RAM 表格内容错误时该只读位置位。该 位通过软件读取 LUTerrAd 寄存器清零。验收过滤器 LUTerr 条件 0 与 CAN 控制器的“其它 CAN”中断相或来产生一个 VIC 通道的 中断。 1.8.9 验收过滤器表格和 ID 索引值举例 假设 5 个验收过滤器地址寄存器包含的值在下表 1.35 的第 3 列中给出。表格的第 4 和 第 5 列分别是字和行的编号(十进制表示)。如果 CAN 信息的标识符与表中行的编号相匹 配,CANRFS 的 ID 索引字段将返回表格最右边一列的值。 表 1.35 验收过滤器表格和 ID 索引值举例 表格 标准单个标识符 寄存器 SFF_sa 值 0x040 #字 810 #行 1610 ID 索引 0-1510 标准标识符组 SFF_GRP_sa 0x060 410 410 16-1910 扩展单个标识符 EFF_sa 0x070 3610 3610 20-5510 扩展标识符组 EFF_GRP_sa 0x100 410 210 56-5710 ENDofTable 0x110 图 1.4 是地址寄存器、表格分布和 ID 索引值的详细图例。它列出了: 标准单个标识符表格,位于验收过滤器 RAM 起始位置,包含 26 个标识符; 标准标识符组表格,包含 12 组标识符; 扩展单个标识符表格,包含 3 个标识符; 扩展标识符组表格,包含 2 组标识符。 24 广州周立功单片机发展有限公司 www.zlgmcu.com SFF_sa PB BASE+ Address 00d = 00h 04d = 04h 0 d := 000 h := 0 0000 000 b 44d = 2Ch 48d = 30h 52d = 34h SFF_GRP_sa 52 d := 034 h := 0 0011 010 b 84d = 54h 88d = 58h 92d = 5Ch Look-up Table RAM column_lower column_upper 0 1 2 3 22 23 24 25 26 ID Index # 0 1 2 3 22 23 24 25 26 d lower_boundary 3 4 upper boundary lower_boundary 3 5 upper boundary lower_boundary 3 6 upper boundary 34 d 35 d 36 d EFF_sa 100d 64h 104d 68h 100 d := 64 h := 0 0110 010 b 38 38 d 39 39 d EFF_GRP_sa 112 d := 70 h := 0 0111 000 b 112d 70h 116d 74h 120d 78h 124d 7Ch lower_boundary 41 upper_boundary lower_boundary 42 upper_boundary 41 d 42 d ENDofTable 128 d := 080 h := 0 1000 000 b 图 1.4 验收过滤器表格和 ID 索引值详细举例 1.8.10 FullCAN 模式 当 FullCAN 模式使能时,验收过滤器以“FullCAN”控制器的身份来处理所选 CAN 总 线上指定标准帧 ID 值的信息的接收和保存。为了置位 eFCAN 位和使用 FullCAN 模式,验 收过滤器 RAM 和指针的内容必须满足其它 2 个条件: 1. 标准帧单个起始地址寄存器(SFF_sa)的内容必须大于或等于 ID 值,以便自动执行 接收保存操作,SFF_sa 一般是 2 的倍数。如果必要的话,SFF_sa 还可为 4 的倍数。 2. EndOfTable 寄存器必须小于或等于 0x800-6×SFF_sa,允许每个 ID 保存 12 字节的 信息,以便自动执行接收保存操作。 当上述条件都满足且 eFCAN 被置位时: 验收过滤器 RAM 和 SFF_sa 地址之间的区域用作单个标准 ID 表格和 CAN 控制器/ 总线的识别,这部分区域按升序排列,格式与单个标准 ID 表格相同(见图 1.2)。它 的行和其它标准表格一样可以标识为“禁能”。如果存在奇数个“FullCAN”ID。则表格 中至少有一行被标识为“禁能”。 第一个(SFF_sa)/2 索引值分配给这些自动存储 ID。这也就是说,当 eFCAN 为 0 时,ID 不能再在 FullCAN 模式下处理时,Rx 帧状态寄存器的索引值可在原值的基 础上增加(SFF_sa)/2。 25 广州周立功单片机发展有限公司 www.zlgmcu.com 当接收到标准 ID 时,验收过滤器在标准单个标识符和标识符组表格前查询相应的 表格。 当在表格中查询到接收信息的控制器编号和 ID 值,验收过滤器将信息从 CAN 控 制器中读出并存放到验收过滤器 RAM 中(起始地址为(EndOfTable)+它的 ID 索 引*12)。 信息的格式见表 1.36。 表 1.36 自动保存 Rx 信息的格式 地址 31 24 23 16 15 10 87 0 0 F F R T R 0000 SEM 0000 DLC 00000 ID +4 Rx Data 4 Rx Data 3 Rx Data 2 Rx Data 1 +8 Rx Data 8 Rx Data 7 Rx Data 6 Rx Data 5 表中 FF,RTR 和 DLC 字段的描述见表 1.13。当信息更新时硬件将 SEM 字段设定为 01, 信息更新结束后 SEM 字段被设定为 11。对信息进行访问时,软件应当清零 SEM 字段。软 件必须以特定的方式来访问一条信息中的三个字以确保它们都来自同一条接收信息。图 1.5 所示为软件是如何使用 SEM 字段来确保访问的字来自同一信息的。 开始 读第1个字 yes SEM == 01? SEM == 11? no 上次校验后还 未接收到信息 清除 SEM, 回写 第1个字 读第2和第3个字 读第1个字 no SEM == 00? yes 最近读出的第1,2和3个字都来自同一条信息 图 1.5 FullCAN 自动存储帧的读取 26 广州周立功单片机发展有限公司 www.zlgmcu.com 关于 FullCAN 验收过滤功能的问题: 在 LPC2119/2129 芯片错误报告(版本 V1.1,发布日期为 04 年 6 月 1 日)中,“A”版 LPC2119/2129 芯片的 CAN 模块在测试中发现 FullCAN 验收过滤器存在以下问题。 CAN.3 FullCAN Mode Inoperative Introduction: In FullCAN mode CAN messages are automatically compared to the acceptance filter look-up table and, if the message ID is found, automatically stored. Problem: A conflict exists such that the ARM core and the CAN peripheral state machine may try to access the message ID look-up table at the same time. In this situation the semaphore bits in the message may be corrupted and the application code may fail. Alternatively the application may continue to run yet CAN messages will be missed. work-around: None, do not use FullCAN mode. 解释:由于 ARM 内核与 CAN 外围状态机存在冲突,在 FullCAN 模块大数据量过滤接 收 CAN 报文时,FullCAN 模块会将已过滤的报文转存到查询表(AF RAM)的起始 3 个字节空 间。 因此,在出现错误的“A”版芯片中,不可以使用 FullCAN 模块,以避免发生此类情况。 除 FullCAN 验收过滤功能外,ARM-CAN 的其他验收过滤功能可以正常工作。 “CANstarter-II开发套件”中有一份文档详细说明了LPC2000芯片的验收过滤功能,请 查看《LPC2000系列32位ARM微控制器的CAN接收过滤设置》。 27 广州周立功单片机发展有限公司 www.zlgmcu.com 第2章 CAN 控制器驱动程序的编写 为了快速利用内嵌 CAN 控制器的 ARM7 微处理器 LPC2xxx 来设计你自己的 CAN 产品, 我们提供一个 LPC2xxx 中 CAN 控制器的驱动程序。驱动程序的源代码以及如何利用该驱动 程序的示例,可以使你快速而方便对这些源代码进行修改,以适合特别的需要。但是在进行 驱动程序开始之前,我们假设用户已经对 PHILIPS 的 ARM7 微处理器有相当的了解,并对基 于 ARM7 微处理器的开发流程有一定的基础。 本驱动采用中断方式完成,如果在不需要中断的场合,稍加修改即可成为查询方式,使 您的应用更加方便。如果你要立即使用该驱动,也不想修改驱动的结构,可以参考我们的示 例程序:一个简单的 RS232 数据与 CAN 数据的透明转换器。 接下来将对该驱动程序的结构和源代码进行详细的介绍。 2.1 驱动程序的结构 对于微处理器来说,CAN 控制器完全是基于事件触发的,即 CAN 控制器会在本身状态 发生改变时,会将状态变化的结果告诉微处理器。所以微处理器处理 CAN 控制器时,可以 采用中断的方式,也可以采用轮询查看 CAN 控制器状态的方式来对 CAN 控制器作出相应 的处理。图 2.1 是一个 CAN 控制器的状态图,通过该状态图我们可以很容易的理解这种基 于事件触发的驱动程序的结构。 CAN控制器复位 CAN控制器挂起状态 BusOff=1、接收到清零RM 事件 CAN控制器错误锁定状 态 手动清除总 线离线后等 待11个隐性 位,或者等 待128*11 个隐性位 SM=0、 BusOff= 0、接收 到清零 RM事件 接收到 置位RM 事件 CAN控制器运行状态 SM=1、总线空 闲、无中断等待 睡眠模式唤醒脉冲 CAN控制器进入休眠状 态 发送数据 发送完成 接收完成 其他节点发送 CAN控制器发送状态 仲裁丢失 CAN控制器接收状态 总线离线 错误 非总线离 线错误 发送错误 接收错误 CAN控制器出错状态 图 2.1 CAN 控制器状态图 事实上,微处理器对于 CAN 控制器的操作是非常简单的,但是为了更明白的说明问题, 我们还是来看一下整个 CAN 数据通讯的流程。图 2.2 描述了 CAN 节点结构,通过该图可以 看到驱动程序所在的位置以及所具有的功能。 28 广州周立功单片机发展有限公司 用户应用程序 www.zlgmcu.com CAN驱动程序 ARM7中CAN模块 CAN收发器 CAN总线 图 2.2 CAN 固件编程层次结构图 对于用户程序来说,不需要关心驱动代码是如何对 CAN 模块进行操作的。用户程序只需 要通过调用驱动程序提供的接口,来实现数据的发送和接收即可。但是由于微处理器中, CAN 模块提供了非常灵活的操作方式,所以要实现一个统一的兼顾一切的方法是不可能的。 为此在驱动程序中专门留出了可以由用户自主配置的选项,以更好的适应不同的应用领域。 根据 CAN 控制器的特性、微处理器的特性我们将 CAN 的驱动程序分为 3 个层次: 硬件抽象层:将 CAN 控制器的硬件特性用数据类型进行抽象,并提供 CAN 控制 器硬件操作的接口。在该层有 2 个文件 CANREG.H 和 CANIORAW.H,在这 2 个文 件中分别定义了 CAN 控制器寄存器的数据类型和对寄存器的操作方法。 功能函数层:CAN 控制器各种功能的实现函数,该层的函数利用硬件抽象层中对 寄存器操作的接口来访问 CAN 控制器来实现各种 CAN 控制器所能提供的功能。 在该层中包含 2 个文件 CANFUNC.C 和 CANFUNC.H。 应用程序接口层:在该层中的主要提供给用户 3 个函数,初始化 CAN 控制器、发 送数据、接收数据。该层的文件有 CANAPP.H 和 CANAPP.C。 由于在用户实际的应用中,真正关心的是应用程序接口层部分,所以在这里也重点的介 绍接口层。 对于用户来讲向 CAN 总线发送数据具有主动权,而接收数据是被动的,所以在此使用 一个环形缓冲区来保存 CAN 接收的数据。对于发送数据,在驱动程序里不作干涉而是将发 送数据的权力完全交给用户处理,当然为了方便用户,仍然提供给用户一个发送数据的函数。 对于发送函数怎样调用,这完全由用户来处理。而对于接收数据则驱动程序直接将 CAN 的 数据放到接收缓冲区里,同时提供给用户 1 个应用接收数据的函数。这样整个驱动便非常的 明晰和简单。因为底层的用户可以不用关心,只是调用这 3 个简单的接口函数即可。程序清 单 2.1 描述了 CAN 接收环形缓冲区的数据结构,图 2.3 描述了用户应用 CAN 驱动程序的简 单过程。 程序清单 2.1 stcRcvCANCyBuf /******************************************************************************************* ** 驱动程序占用用户 RAM――环形缓冲区 ** ******************************************************************************************/ typedef struct _RcvCANDataCycleBuf_ { 29 广州周立功单片机发展有限公司 www.zlgmcu.com UINT32 WritePoint1 :8; (1) UINT32 WritePoint2 :8; (2) UINT32 WritePoint3 :8; (3) UINT32 WritePoint4 :8; (4) UINT32 ReadPoint1 :8; (5) UINT32 ReadPoint2 :8; (6) UINT32 ReadPoint3 :8; (7) UINT32 ReadPoint4 :8; (8) UINT32 FullFlag1 :8; (9) UINT32 FullFlag2 :8; (10) UINT32 FullFlag3 :8; (11) UINT32 FullFlag4 :8; (12) stcRxBUF RcvBuf[CAN_MAX_NUM][USE_CAN_RCV_BUF_SIZE]; (13) }stcRcvCANCyBuf,*P_stcRcvCANCyBuf; 注:stcRcvCANCyBuf(1)~(4) 环型缓冲区写指针。 stcRcvCANCyBuf(5)~(8) 环型缓冲区读指针。 stcRcvCANCyBuf(9)~(12) 环型缓冲区满标志。当写指针追上读指针此时表示环形缓冲区已满,此时 相应的满标志置位。 以上的指针、标志的操作不需要用户干预。用户仅仅只需调用接口函数即可。 stcRcvCANCyBuf(13) 环型缓冲区定义。 用户代码 初始化CAN控制器 CAN驱动代码启动 用户CAN数 据处理 要发送数据调用 CanSendData() CAN总线异常处理 要使用CAN数据调 用 ReadCANRcvCyBuf Y 函数返回 成功启动 发送? N 继续程序的发送 函数返回 缓冲区内 N 有效数据 指针? Y 接收到的数据处理 CAN数据发送 成功 CAN总线异常 处理 接收到CAN总 线数据 用户在此添 加自己的代 码。 如发送 成功标志、 继续下一次 的发送等 将接收到CAN 数据压入接 收环形缓冲 区, 如果环 形缓冲区 满, 当前数 据抛弃。 图 2.3 DriverApp 30 广州周立功单片机发展有限公司 www.zlgmcu.com 2.2 驱动程序使用方法 对于本驱动程序的使用,我们尽可能的考虑到如何让用户用最小的改动来适应不同的应 用范围。因此在驱动程序中除了上面所说的的与 CAN 控制器直接相关的文件外,还额外的 提供一个用户配置文件 Custom.H,其中有一些选项需要用户根据自己的需要来进行配置。 另外还有与编译器有关的数据类型转换头文件 DATATYPETRS.H 和整合在一起的引用 CAN 驱动代码文件 IncludeCAN.H 文件。在 DATATYPETRS.H 中重新定义了许多与编译器有关的 数据类型,如:int、unsigned char 等数据类型,如果用户编译器的这些数据类型的范围不 同,请根据实际情况修改。在 IncludeCAN 头文件中将 CAN 驱动代码中所有的头文件集合 在了一起,这样用户在自己的程序中,只需引用一个 IncludeCAN.H 文件即可。 但是对于用户来说,真正关心的是如何利用 CAN 控制器来与 CAN 网络上的其它节点 进行数据通讯。而正常的通讯无非是向总线上发送数据和从总线上接收数据。但是在正常通 讯之前必须要对 CAN 控制器进行初始化,以便让 CAN 控制器的工作方式、总线波特率、 验收过滤器等各个功能与实际的工作相符。因此本驱动程序在使用时应该按下面的步骤: 1. 首先检查自己编译器数据类型是否与 DATATYPETRS.H 中定义的数据类型相符合, 如果不符合请修改 DataTypeTrs.H,以使数据类型与编译器一致。 2. 根据自己的需要,修改 Custom.H 文件中的各项定义,使 CAN 控制器工作在自己需 要的工作模式、波特率、验收过滤方式、中断使能等条件下。 3. 由于 CAN 控制器的中断分为 CAN 发送、CAN 接收、CAN 异常 3 大类,如果在具 有 4 个 CAN 控制器的微处理器中将这些中断独立出来则会占用 9 个中断资源。所 以在本驱动中将 CAN 的中断全部统一在一起,构成一个微处理器非向量方式的中 断。如果用户有更好的中断结构请根据实际的需要修改 CANAPP.C 文件中的 CAN 中断处理函数。 4. 在使用 CAN 控制器发送、接收数据之前,请先调用 CANAPP.C 文件中的 InitCAN 函数。 5. 如果要发送数据请调用 CANSendData 函数。 6. 如果要使用 CAN 接收到的数据请调用 ReadCANRcvCyBuf 函数。 7. 默认情况下,对于异常的处理本驱动已经有了默认处理,但如果用户要特别处理还 请修改相关的异常处理函数。 8. 在使用 CAN 驱动的文件中引用“IncludeCAN.H”,并将 CANAPP.C,CANFUNC.C 文件添加到自己的工程里面。 9. 在编译器中指定 CAN 驱动文件的路径,与自己的项目文件一起进行编译即可。 10. 在调用了初始化 CAN 控制器函数后,用户不得关闭 CAN 中断。 更快捷的方法是用户直接参考驱动程序应用示例的程序结构,只要在 Castom.H 中修改 定义一些相关的参数即可。 2.3 驱动程序各文件介绍 2.3.1 用户配置文件 用户在应用本驱动程序之前,应该首先查阅配置文件中的某些配置选项是否符合自己特 别的需要。程序清单 2.2 描述了用户需要配置哪些选项,以及应该怎样配置这些选项。 程序清单 2.2 Custom.H /******************************************************************************************* ** 用户配置文件 ** *******************************************************************************************/ #ifndef _ CUSTOM _H_ 31 广州周立功单片机发展有限公司 www.zlgmcu.com #define _CUSTOM_H_ //当 VPB 时钟为 11059200Hz 时,常用波特率与总线时序器对照表,如果 VPB 时钟不等,请自己计算出总线 时序器的值 #define BPS_250K 0x0017C003 //CAN 的波特率 250Kbps 时总线时序器的值 //全局应用定义 #define CAN_MAX_NUM 4 (1) #define CAN_OFFSET_ADR 0x4000 //CAN 各模块寄存器之间的线性差异 (2) #define USE_CAN_RCV_BUF_SIZE 0x10 (3) //各路 CAN 独立应用定义 //工作模式定义,正常方式=0;只听模式=1; #define USE_MODE_CAN1 0x00 (4) #define USE_MODE_CAN2 0x00 (5) #define USE_MODE_CAN3 0x00 (6) #define USE_MODE_CAN4 0x00 (7) //错误报警寄存器的值 #define USE_EWL_CAN1 0x60 (8) #define USE_EWL_CAN2 0x60 (9) #define USE_EWL_CAN3 0x60 (10) #define USE_EWL_CAN4 0x60 (11) //中断使能定义 #define USE_INT_CAN1 0x7FF (12) #define USE_INT_CAN2 0x7FF (13) #define USE_INT_CAN3 0x7FF (14) #define USE_INT_CAN4 0x7FF (15) //发送优先级模式定义 #define USE_TPM_CAN1 0x01 (16) #define USE_TPM_CAN2 0x01 (17) #define USE_TPM_CAN3 0x01 (18) #define USE_TPM_CAN4 0x01 (19) //总线波特率定义 #define USE_BTR_CAN1 BPS_250K (20) #define USE_BTR_CAN2 BPS_250K (21) #define USE_BTR_CAN3 BPS_250K (22) #define USE_BTR_CAN4 BPS_250K (23) #endif 各项说明: CASTOM.H(1)~(3) 用来定义驱动程序所有 CAN 模块的应用定义。 CASTOM.H(1) 用来定义微处理器中所包含的 CAN 模块的数目。如果微处理器 有 2 个 CAN 模块则此处应定义为 2,如果微处理器有 4 个 CAN 模块则此处应定义 为 4。 CASTOM.H(2) CAN_OFFSET_ADR,该值不需要修改。 CASTOM.H(3) 该处用来定义驱动程序接收环形缓冲区的大小。对于 CAN 总线 数据的接收由驱动程序自动接收到该环形缓冲区。用户如果要使用接收的 CAN 数 据,直接访问该缓冲区即可。 CASTOM.H(4)~(23) 用来定义驱动程序中独立的各个 CAN 模块的应用定义。 32 广州周立功单片机发展有限公司 www.zlgmcu.com CASTOM.H(4)~(7)该处定义 CAN 控制器工作时的工作方式,如果使用正常工作模 式则 USE_CAN_MODE 的值定义为 0。如果使用只听工作模式则 USE_CAN_MODE 的值定义为 1。 CASTOM.H(8)~(11)该处定义错误报警的界限值,当 CAN 控制器的错误计数器达 到 USE_EWL_VAL 时,如果报警中断使能则会产生报警中断信号,同时错误状 态寄存器中的 ES 置位。 CASTOM.H(12) ~(15)该处用来设置用户使用 CAN 的中断值,默认情况下 CAN 中断全部使能。 CASTOM.H(16)~(19)该处用来设置 CAN 控制器中 3 个发送缓冲区发送数据时的发 送优先级。当 USE_TPM_MODE 定义为 0 时 3 个发送缓冲区的发送优先级按帧 ID 的优先级;当 USE_TPM_MODE 定义为 1 时 3 个发送缓冲区的发送优先级按 TPIO 的优先级。 CASTOM.H(20)~(23)定义总线时序寄存器的值,按照上面的介绍计算出相应的波 特率的值。 2.3.2 CAN 驱动应用接口层文件 应用接口层包括 CANAPP.H 和 CANAPP.C 两个文件。在文件中主要是定义了用户可以 直接使用或修改的初始化 CAN 控制器函数 InitCAN、发送数据函数 CANSendData、应用接 收数据函数 ReadCANRcvCyBuf 以及中断处理函数 CANIntPrg。 2.3.2.1 初始化 CAN 模块函数 InitCAN CAN 控制器初始化函数主要用来实现 CAN 工作时的参数设置,如果 CAN 控制器不经 过初始化是不能进行工作的。这些初始化的内容包括,硬件使能 CAN、设置 CAN 报警界限、 设置总线波特率、设置中断工作方式、设置 CAN 验收过滤器的工作方式、设置 CAN 控制 器的工作模式等。程序清单 2.3 和图 2.4 描述了初始化 CAN 控制器的过程。 程序清单 2.3 InitCAN /* ******************************************************************************************** **函数原型 : void InitCAN(eCANNUM CanNum) **参数说明 : CanNum -->> CAN 控制器,值不能大于 CAN_MAX_NUM 规定的值 **返回值 **说 明 :无 ; 本函数用于初始化 CAN 控制器 *******************************************************************************************/ void InitCAN(eCANNUM CanNum) { HwEnCAN(CanNum); (1) SoftRstCAN(CanNum); (2) CANEWL(CanNum).Bits.EWL_BIT = USE_EWL_CAN[CanNum]; (3) //初始化波特率 CANBTR(CanNum).Word = USE_BTR_CAN[CanNum]; (4) //初始化中断为非向量中断 VICDefVectAddr =(UINT32)CANIntPrg; (5) VICIntEnable |=(1<<19)|(1<<(20+ CanNum))|(1<<(26+ CanNum)); (6) CANIER(CanNum).Word= USE_INT_CAN[CanNum]; (7) //配置验收滤波器(旁路状态) 33 广州周立功单片机发展有限公司 CANAFMR.Bits.AccBP_BIT =1; //初始化模式 CANMOD(CanNum).Bits.TPM_BIT = USE_TPM_CAN[CanNum]; CANMOD(CanNum).Bits. LOM_BIT = USE_MOD_CAN[CanNum]; //初始化接收环形缓冲区 CANRcvBufApp.FullFlag1=CANRcvBufApp.FullFlag2= CANRcvBufApp.FullFlag3=CANRcvBufApp.FullFlag4=0; CANRcvBufApp.ReadPoint1=CANRcvBufApp.ReadPoint2= CANRcvBufApp.ReadPoint3=CANRcvBufApp.ReadPoint4=0; CANRcvBufApp.WritePoint1=CANRcvBufApp.WritePoint2= CANRcvBufApp.WritePoint3=CANRcvBufApp.WritePoint4=0; //启动 CAN SoftEnCAN(CanNum); } 确 定 CAN控 制 器 硬 件 硬 件 使 能 确 定 CAN控 制 器 复 位 初始化错误报警界限 初始化总线波特率 初始化中断 初始化验收滤波 初始化工作模式 www.zlgmcu.com (8) (9) (10) (11) (12) (13) (14) 进入工作状态 图 2.4 InitCAN InitCAN(1) 硬件使能 CAN 控制器,该函数在 CAN 功能层文件 CANFUNC.C 中 定义。 InitCAN(2) 软件复位 CAN 控制器,该函数在 CAN 功能层文件 CANFUNC.C 中 定义。 InitCAN(3) 初始化 CAN 控制器的错误报警界限,如果采用默认值为 0x60。 InitCAN(4) 初始化 CAN 总线时序寄存器。 InitCAN(5)~(7)进行 CAN 中断处理的初始化操作。 34 广州周立功单片机发展有限公司 www.zlgmcu.com InitCAN(8)设置模验收过滤器(设置为旁路状态)。 InitCAN(9)~(10)配置工作模式。 InitCAN(11)~(13)初始化接收环形缓冲区 InitCAN(14)退出初始化前要使 CAN 进入工作状态。向 CAN 总线发送数据函数 CANSendData 在用户将本地数据经过打包成符合 CAN 发送帧格式的数据后,可以调用本函数进行数 据的发送。程序清单 2.4 和图 2.5 描述了 CAN 发送数据函数。 程序清单 2.4 CANSendData /******************************************************************************************* **函数原型 : UINT32 CANSendData(eCANNUM CanNum,UINT32 Cmd,P_stcTxBUF Buf) **参数说明 : CanNum < CAN_MAX_NUM ** Cmd 发送命令字 ** **返回值 **说 明 Buf 要发送的一帧 CAN 数据 : =0;成功写入缓冲区并成功启动发送; !=0,写发送缓冲区失败。 : CAN 发送数据函数,该函数的返回值只能表示数据是否已写入 CAN 发送缓冲区,并启 动发送,但是否发送成功,并不知道.要想明确的知道是否发送成功请在调用该函数后 查询 TCS 状态位,或配合发送成功中断来判断。 *******************************************************************************************/ UINT32 CANSendData(eCANNUM CanNum,UINT32 Cmd,P_stcTxBUF Buf) { UINT32 i,status=0; if(0 != CANSR(CanNum).Bits.TBS1_BIT) (1) { i=SEND_TX_BUF1; } else if(0 != CANSR(CanNum).Bits.TBS2_BIT) (2) { i=SEND_TX_BUF2; } else if(0 != CANSR(CanNum).Bits.TBS3_BIT) (3) { i=SEND_TX_BUF3; } else { i=0xFF; } status=WriteCanTxBuf(CanNum,i, USE_TPM_MODE, Buf); (4) if(status == 0) { if(CANMOD(CanNum).Bits.SM_BIT != 0) (5) { CanQuitSM(CanNum); } 35 广州周立功单片机发展有限公司 CanSendCmd(CanNum,Cmd,i); } return (status); } 进入发送函数 www.zlgmcu.com (6) 判断是否有发 N 送缓冲区空闲? Y 选择空闲的发送缓冲区 将要发送的数据写入发 送缓冲区 写入成功? N Y 启动发送命令 返回成功启动发送 返回失败 图 2.5 CanSendData CANSendData(1)~(3)判断是否有空闲的发送缓冲区 TxBUF。 CANSendData(4) 将要发送的数据写入选定的发送缓冲区。 CANSendData(5) 启动 CAN 数据发送。发送命令可以选择。 在使用发送函数时有一点必须注意,因为在启动发送数据的命令后,CAN 控制器要将 缓冲区内的数据发送完毕后,才会将该帧数据是否发送成功的状态返回。这样如果在函数里 一直等待数据发送完毕,会使整个微处理器的性能下降,所以为了避免这种情况,该函数在 启动发送后便立即返回,如果用户想要得到成功发送的事件,请用户配合发送中断或利用查 询 TCS 状态位的方法来处理。 2.3.2.2 使用 CAN 驱动接收到的 CAN 数据函数 ReadCANRcvCyBuf 用户可以在自己的程序中调用该函数,对从 CAN 总线上接收的数据进行特殊的处理。 程序清单 2.5 和图 2.6 描述了用户如何使用由驱动接收的 CAN 总线数据。 36 广州周立功单片机发展有限公司 www.zlgmcu.com 程序清单 2.5 ReadCANRcvCyBuf /******************************************************************************************* **函数原型 : UINT32 ReadCANRcvCyBuf(eCANNUM CanNum, stcRxBUF *Buf) **参数说明 : CanNum < CAN_MAX_NUM Buf 将环形缓冲区中接收的 1 帧数据放到 Buf 里 **返回值 : !=0 Buf 数据无效 ** **说 明 =0 Buf 数据有效 : 该函数用来使用环形缓冲区中 1 帧有用的数据 ******************************************************************************************/ UINT32 ReadCANRcvCyBuf(eCANNUM CanNum,stcRxBUF *Buf) { UINT32 status=0; switch(CanNum) { case CAN1: if((0 != CANRcvBufApp.FullFlag1) || (CANRcvBufApp.ReadPoint1 != CANRcvBufApp.WritePoint1)) (1) { *Buf=CANRcvBufApp.RcvBuf[CAN1][CANRcvBufApp.ReadPoint1]; if(++CANRcvBufApp.ReadPoint1 >= USE_CAN_RCV_BUF_SIZE) (2) (3) { CANRcvBufApp.ReadPoint1 =0; } CANRcvBufApp.FullFlag1=0; } else { status=1; (4) } break; case CAN2: if((0 != CANRcvBufApp.FullFlag2) || (CANRcvBufApp.ReadPoint2 != CANRcvBufApp.WritePoint2)) (5) { *Buf=CANRcvBufApp.RcvBuf[CAN2][CANRcvBufApp.ReadPoint2]; if(++CANRcvBufApp.ReadPoint2 >= USE_CAN_RCV_BUF_SIZE) (6) (7) { CANRcvBufApp.ReadPoint2 =0; } CANRcvBufApp.FullFlag2=0; } else { status=1; (8) 37 广州周立功单片机发展有限公司 www.zlgmcu.com } break; case CAN3: if((0 != CANRcvBufApp.FullFlag3) || (CANRcvBufApp.ReadPoint3 != CANRcvBufApp.WritePoint3)) { *Buf=CANRcvBufApp.RcvBuf[CAN3][CANRcvBufApp.ReadPoint3]; if(++CANRcvBufApp.ReadPoint3 >= USE_CAN_RCV_BUF_SIZE) { CANRcvBufApp.ReadPoint3 =0; } CANRcvBufApp.FullFlag3=0; } else { status=1; } break; case CAN4: if((0 != CANRcvBufApp.FullFlag4) || (CANRcvBufApp.ReadPoint4 != CANRcvBufApp.WritePoint4)) { *Buf=CANRcvBufApp.RcvBuf[CAN4][CANRcvBufApp.ReadPoint4]; if(++CANRcvBufApp.ReadPoint4 >= USE_CAN_RCV_BUF_SIZE) { CANRcvBufApp.ReadPoint4 =0; } CANRcvBufApp.FullFlag4=0; } else { status=1; } break; default: status=1; break; } return status; } ReadCANRcvCyBuf(1)(5)(9)(13) 判断环形缓冲区是否有数据。 ReadCANRcvCyBuf(2)(6)(10)(14) 返回有效的缓冲区数据。 ReadCANRcvCyBuf(3)(7)(11)(15) 环形缓冲区读操作处理。 ReadCANRcvCyBuf(4)(8)(12)(16) 标志环形缓冲区无可用数据。 (9) (10) (11) (12) (13) (14) (15) (16) 38 广州周立功单片机发展有限公司 应用CAN接收环形缓冲区 www.zlgmcu.com 判断缓冲 区是否有 数据 将当前的有效数据 读出,并标志读出 的数据有效 标志环形缓冲区无 数据 环形缓冲区读处理 函数退出 图 2.6 ReadCANRcvCyBuf 驱动程序中断处理过程 该程序主要是对 CAN 所有状态变化进行监控,但该程序的运行还需要用户在开始前进 行中断的设置使能。如果中断不使能则该程序不会工作,整个驱动程序便不能使用。程序清 单 2.6 和图 2.7 描述了 CAN 中断处理过程。 程序清单 2.6 CANIntPrg /******************************************************************************************* **函数原型 : void CANIntPrg(void) **参数说明 : 无 **返回值 :无 **说 明 : CAN 中断处理函数,所有 CAN 处理均在中断中完成 ******************************************************************************************/ void __irq CANIntPrg(void) { UINT32 j; uCANICR k; if(CANLUTerr.Word != 0 ) (1) { //可在此修改添加 LUT 错误处理代码 j=CANLUTerrAd.Word; } for(j=0;j
更多简介内容

评论

下载专区


TI最新应用解决方案

工业电子 汽车电子 个人消费电子

$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })