2020-10-13_CAN模块介绍

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,961评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,444评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,009评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,082评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,101评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,271评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,738评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,395评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,539评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,434评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,481评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,160评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,749评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,816评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,038评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,548评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,140评论 2 341