美文网首页
2020-10-13_CAN模块介绍

2020-10-13_CAN模块介绍

作者: HACHI_8 | 来源:发表于2020-10-17 11:46 被阅读0次

1、CAN通信协议基础知识

(1)两线制:CAN_H、CAN_L,两根信号线以差分电压的形式来传输0、1信息,抗干扰能力强。

(2)CAN虽然没有单独的时钟信号,但为了实现位同步、网络节点中多个设备间的仲裁,须保持主从机使用相同的波特率。

(3)数据传输格式:以“帧”为单位,“帧”中包含ID(标识符)、DATA、帧格式、有效数据长度、标识符类型等信息。网络中不同的节点通过ID来识别和过滤信息。  每帧最多包含8个字节的有效DATA。 “帧”的另一种描述为“报文”。具体组成如下:

IDR0-IDR3(4个字节的ID标识)、DSR0-DSR7(8个字节的数据)、DLR(1个字节的有效数据长度,指明前面8个字节寄存器中有几个数据是有效的)

(4)标识符ID:分为标准标识符(11bit)和扩展标识符(29bit)。

(5)波特率设置:须遵循CAN标准的时段设置(SEG2和SEG1有特定的组合约束),否则即使最终的波特率一致,也不能正常通信。

(6)ID滤波和ID屏蔽设置:为了接收网络中特定的“帧”,CAN控制器使用一套ID过滤机制来判断是否接收数据。包括IDAR(8个标识符接收寄存器)、IDMR(8个标识符掩码寄存器)。IDAR和IDMR分别分为两页,IDAR0-IDAR3、IDAR4-IDAR7、IDMR0-IDMR3、IDMR4-IDMR7。若使用标准ID标识符,则只用到IDAR0和IDAR1,以及对应的IDMR0和IDMR1;扩展标识符则用到整页的IDAR和IDMR。

(标准标识符中IDAR各位含义) (扩展标识符中IDAR各位含义)

举例说明,如果上位机(电脑端)通过CAN向单片机发送一帧数据,其中ID为0x08,若单片机要接收此ID对应的数据,则需要设置IDAR0为0x01,IDAR1为0x00。因为0x08的ID用11bit表示为 0000 0001 000,映射到IDAR寄存器IDAR0和IDAR1,就拆分为0x01,0x00(RTR和IDE设置为0,标准标识符,数据帧;IDAR1中的最低3位不参与过滤识别)。     不必参考网上其它作者繁琐的转换和说明,直接将需要接收的ID对应到IDAR各位,填空,再分割,就得到IDAR应该设置的值了。

IDMR的设置,按照文档说明,对应位为0,则表示接收到的IDR对应位需要通过滤波器过滤识别,为1,则表示不需要过滤(任意数据都不影响接收)。 以上述例子,对应的IDMR0设置为0x00,IDMR1设置为0x07(最低3位无关,可屏蔽)。

2、MC9S12XEP100的CAN模块初始化步骤

(1)CANCTL0的INITRQ位置1,请求进入初始化状态。

(2)查询CANCTL1的INITAK是否为1,为1表示已进入初始化状态,为0表示为正常运行状态。

(3)设置CANCTL1,使能CAN、时钟选择。

(4)设置CANBTR0,CAN的时钟分频系数、同步跳转位宽等参数。

(5)设置CANBTR1,CAN的时段1、时段2等参数。(注意时段1、时段2和同步跳转位宽须满足特定的组合,参考对照表,否则即使波特率正确,也不能正常通信)

(6)设置CANIDAC,CAN的滤波器选择、标识符种类等参数。

(7)设置IDAR、IDMR,须满足主从机的ID对应关系。

(8)CANCTL0的INITRQ位置0,请求退出初始化状态。

(9)查询CANCTL1的INITAK,为0标识已退出初始化,进入正常运行状态。

(10)查询CANCTL0的SYNCH位,为1表示CAN已同步。

(11)使能CAN 的接收或发送中断,CANRIER的RXFIE为接收中断控制位。(这一步不能放在初始化状态中,否则不能开启中断!)

3、初始化程序

; 板卡号设置

BOARD_ID  EQU  1

CAN_init:

          PSHA

          PSHB

          PSHY

          PSHX

          BSET  CAN0CTL0,mCAN0CTL0_INITRQ

          BRCLR CAN0CTL1,mCAN0CTL1_INITAK,*      ; 检测是否进入初始化模式

          MOVB  #$80,CAN0CTL1                    ; CANE=1,  CLKSRC=0(外部晶振) 

          MOVB  #$07,CAN0BTR0                    ; SJW=0,  BRP=7(预分频8)

          MOVB  #$3A,CAN0BTR1                    ; TSEG2=3, TSEG1=10,  波特率=125KHz

          MOVB  #$10,CAN0IDAC                    ; IDAM=1, IDHIT=0, 4个16bit滤波器,标准标识符

          JSR  IDAR_init

          JSR  IDMR_init

          BCLR  CAN0CTL0,mCAN0CTL0_INITRQ

          BRSET CAN0CTL1,mCAN0CTL1_INITAK,*      ; 退出初始化模式 

          BRCLR CAN0CTL0,mCAN0CTL0_SYNCH,*      ; 等待同步

          MOVB  #$01,CAN0RIER                    ; RXFIE=1, 开接收中断, 必须在退出初始化模式后使能!

          PULX

          PULY

          PULB

          PULA

          RTC

      IDAR_init:

                CLRA

                LDAB  #BOARD_ID

                DECB

                LSLD

                LSLD                                    ; 查询表里,每个IDAR占4个字节,所以这里乘以4

                LDX  #Chanel1IDTable

                LEAY  D,X

                LDX  #CAN0IDAR0

                MOVW  0,Y,0,X

                RTS       

      IDMR_init:

                MOVB  #$00,CAN0IDMR0

                MOVB  #$07,CAN0IDMR1

                ;MOVB  #$00,CAN0IDMR2

                ;MOVB  #$07,CAN0IDMR3

                ;MOVB  #$00,CAN0IDMR4

                ;MOVB  #$07,CAN0IDMR5

                ;MOVB  #$00,CAN0IDMR6

                ;MOVB  #$07,CAN0IDMR7

                RTS

4、接收中断程序

       XDEF CAN0RX_ISR

        XREF    can0rx_buff

CAN0RX_ISR:

  ; Write your interrupt code here ...

        MOVB  #$00,CAN0RIER        ; 关中断

        LDY  #CAN0RXDSR0

        LDX  #can0rx_buff

        LDAB  CAN0RXDLR            ; 接收数据长度

        STAB  1,X+

        CMPB  #0

        BHI  rec_data              ; 数据长度 >0

        RTI

        rec_data:

                MOVB  1,Y+,1,X+

                DBNE  B,rec_data

        MOVB  #$01,CAN0RIER        ; 开中断

        MOVB  #$01,CAN0RFLG        ; 清RXF标志

        RTI

相关文章

  • 2020-10-13_CAN模块介绍

    1、CAN通信协议基础知识 (1)两线制:CAN_H、CAN_L,两根信号线以差分电压的形式来传输0、1信息,抗干...

  • 模块介绍

    一、模块介绍 official link:https://docs.python.org/3/tutorial/m...

  • Apache优化--模块优化

    模块优化模块介绍部分模块介绍一、模块介绍apache是一个补丁服务器,在安装apache的时候就为用户提供了很多常...

  • auth 组件

    目录 auth模块介绍 auth模块的常用方法 扩展默认的auth_user表 1. auth模块介绍 用户认证系...

  • Node.js进阶之【14】 : multer模块,post方式

    一、multer模块 一、multer模块介绍 multer 模块需要进行【下载】。 multer 模块可以帮我们...

  • LIN模块介绍

    概述,协议规范及模块实现 一、概述 1、如下图为一个LIN网络,包含了一个Master节点,两个Slave节点: ...

  • Spring 模块介绍

    一、核心容器(Core Container) Spring-Core:核心工具类,Spring其他模块大量使用Sp...

  • pycurl模块介绍

    pycurl是一个用c语言编写的libcurl Python实现,功能非常强大,支持操作协议有FTP,HTTP,H...

  • Javascript 模块介绍

    模块是随着前端工作越来越复杂而产生,为了拆分代码便于开发重用,需要把代码分成更小的块,这样模块就产生了模块能使得前...

  • 4、scrapy内置服务

    本篇介绍scrapy的Logging模块、Stats Collections模块和Sending-email模块。...

网友评论

      本文标题:2020-10-13_CAN模块介绍

      本文链接:https://www.haomeiwen.com/subject/swovpktx.html