STM32 bxCan学习

初学can总线

---------------------STM32 bxCan-----------------------------

bxCAN main features

  • 支持CAN协议的2.0A、B
  • 波特率最高可达到1M/S
  • 支持事件触发通信(supports the time triggered comunication option){不太理解,有机会看看}

Transmission

  • 3个发送邮箱
  • 可配置传输优先级
  • 记录SOF发送的时间戳(Time Stamp on SOF transmission)

Reception

 

  • 三级深度的2个接收FIFO(Two receive FIFOs with three stages) 
  • 有2个3级深度的接收缓冲区:FIFO0和FIFO1,每个FIFO都可以存放3个完整的报文
  • 共享28个过滤器(28 filter banks shared between CAN1 and CAN2)
  • 标识符列表
  • fifo溢出可配置(Configurable FIFO overrun)
  • 记录接收SOF的时间戳

Time-triggered communication option(事件触发通信模式)

     ● Disable automatic retransmission mode(禁止自动重传模式)
     ● 16-bit free running timer(16位的自运行定时器)?
     ● Time Stamp sent in last two data bytes(最后2个字节发送时间戳)

 

Management

● Maskable interrupts(可屏蔽中断)
● Software-efficient mailbox mapping at a unique address space(邮箱占用一块地址空间)

 

Dual CAN

● CAN1: Master bxCAN for managing the communication between a Slave bxCAN and
the 512-byte SRAM memory
● CAN2: Slave bxCAN, with no direct access to the SRAM memory.
● The two bxCAN cells share the 512-byte SRAM memory


bxCAN operating modes

       Initialization mode

  1.sets the INRQ bit 1 in the CAN_MCR register
  2.等待硬件sets the INAK bit 1 in the CAN_MSR register
  3.软件sets the INRQ bit 0 in the CAN_MCR register(请求退出初始化模式)
  4.硬件sets the INAK bit 0 in the CAN_MSR register(退出初始化模式)
初始化模式下,收发报文都被禁用,CANTX 输出高电平。在初始化模式下不允许修改任何配置寄存器。
过滤器的值设置不需要在初始化模式下进行但是,但是过滤器的位宽和模式的设置必须在初始化模式进入正常模式下之前完成。
Normal mode
  1.软件对 CAN_MCR 的INRQ bit 清0
  2.等待硬件对CAN_MSR 的 INAK 位1的确认
  3.后连续采集12个CANRX 输出高电平(等同于总线空闲)
  bcCAN才可正常的收发报文
Sleep mode
1.software request by setting the SLEEP bit in the CAN_MCR register
  bcCAN时钟停止,软件可以访问邮箱寄存器。
  进入初始化模式
  软件设置INRQ位1,同时清SLEEP位0.或硬件者检测CAN总线活动
  进入正常模式
Test mode

  • Silent mode
  • Loop back mode
  • Loop back combined with silent mode

传输处理

1)发送报文
  程序选择一个空的发送邮箱,设置标示符、数据长度和数据。后设置CAN_TIxR register的TXRQ bit 1,来待发送数据。设置后,邮箱的状态不再为空,此时不能在访问邮箱寄存器。同时邮箱会等待获得高优先级,一旦其获得高优先级会从挂号状态转成预定发送状态。当CAN总线获得空闲会立即将其发送。
如果其成功发送,会立更改其状态为空邮箱,硬件设置CAN_TSR register的RQCP and TXOK bits 为1
如果发送失败,.由仲裁引起错误会对应的设置CAN_TSR registe的ALST bit 为1,由错误引起的设置CAN_TSR registe的TERR bit为1.
传输优先级
传输优先级可以由标示符和发送请求顺序决定。
标示符决定
当邮箱状态为挂起且数量大于1个时,传输顺序由邮箱中的标示符决定,标示符越低其权限越高。如果标示符等值,那么序号小的邮箱获得高优先级。
发送请求顺序决定
CAN_MCR register中的TXFP bit为1,发送邮箱配置为FIFO,改情况优先级根据发送次序决定,主要针对分段发送的报文。

2)Abort 终止传输请求
通过设置CAN_TSR register的ABRQ bit 为1来终止传输请求,当发送邮箱处于挂号或者执行状态下,立即响应终止。而当发送邮箱处于传输状态时,有2种结果,一发送成功这时发送邮箱为empty 且设置CAN_TSR register的 TXOK bit 为1,第二种结果,当传输失败是邮箱状态为scheduled,传输请求终止,清除CAN_TSR register的 TXOK bit,同时邮箱为empty。

3)自动重传模式 Nonautomatic retransmission mode
此模式建立在标准CAN基础上的支持时间触发的操作,需要设置 CAN_MCR register 的NART bit为1.
该模式每个传输都只被执行一次,如果第一次发送由于错误或是仲裁丢失发送失败后,硬件自动重传该消息。当第一次发送结束后,硬件认为发送完成并设置CAN_TSR register的RQCP bit 为1,传输结果由CAN_TSR register的 TXOK, ALST and TERR bits 表示。(没太理解)
事件触发模式 Time triggered communication mode
此模式下CAN硬件内部的计时器被激活,用于产生时间戳并被存储与CAN_RDTxR/CAN_TDTxR registers中。内部定时器在每次CAN的位定时后自增,内部时钟在收、发帧的起始位置的采样点被采样,并生成时间戳。(理解欠缺)

 

接收处理

 

前面知道有2个三级深度的FIFO用来接收报文,FIFO完全由硬件管理以节省CPU,简化了软件并保证了数据的一致性,软件只能通过FIFO的输出邮箱来得到最先输出的报文。

1)Valid message 有效报文
当接收的报文通过CAN协议(直到EOF的最后一位都没有错)并且通过了标示符过滤,即被认为有效报文。

2)FIFO management
当第一条有效报文被存储在FIFO里,状态改为becomes pending_1.硬件就会更新CAN_RFR register中的FMP[1:0]位值为01b,如果软件及时从输出邮箱读取报文需要设置CAN_RFR register的RFOM bit 为1,FIFO状态重置为empty。如果没有清空输出邮箱的话,第二条有效报文会继续存在FIFO里,同时状态改为becomes pending_2,硬件就会更新CAN_RFR register中的FMP[1:0]位值为10b,第三条有效报文存储时状态改为becomes pending_3,硬件就会更新CAN_RFR register中的FMP[1:0]位值为11b,此时软件必须读取邮箱中的报文否则有可能照成报文丢失。

3)溢出
当FIFO的becomes pending_3时,这时候吓一条有效报文这时候会产生溢出,溢出条件可以通过设置CAN_RFR register的FOVR bit 来决定丢失哪条报文。

4)接收有关中断
当FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为1,那么就会产生一个中断请求
当邮箱状态becomes pending_3时CAN_RFxR寄存器的FULL位就被置1,并且如果CAN_IER寄存器的FFIE位为1,那么就会产生一个满中断请求。
在溢出的情况下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位为1,那么就会产生一个溢出中断请求



.

猜你喜欢

转载自charlotte.iteye.com/blog/1465995