【STM】CAN通信

CAN协议特点:

1、多主控制:

  所有单元都可以发送消息,两个以上单元同时发消息时,根据标识符(ID)决定优先级。两个以上单元同时发送消息的时候,对各消息的ID逐位比较,胜利的单元继续发送消息,失败的单元停止发送转入接受工作。

2、系统灵活性:

  连接总线的单元没有类似地址的信息,在总线上添加新的单元时不需要改变原先的单元

3、速度快距离远:

4、具有错误检测、错误通知、错误恢复功能:

  所有单元都能检错,发现错误会通知其他所有单元,发现错误会反复发送直到成功

5、故障封闭功能:

  CAN可以判断出是总线上暂时的数据错误还是持续的数据错误,发生持续错误时会将故障单元从总线上隔离出去

6、连接节点多:

 

物理层特征:

1、CAN控制器根据CAN_H和CAN_L上的电位差判断总线电平,总线电平分为显性电平和隐性电平,两者必居其一,通过使总线电平变化将消息发送给接收方

2、显性电平对应逻辑0,隐性电平对应逻辑1。显性电平有优先权,只要一个单元输出显性电平,总线就是显性电平,只有所有单元输出隐性电平,总线上才是隐性电平

3、CAN总线起止端都有一个120Ω的终端电阻,作为阻抗匹配减少回波反射

4、CAN通信以帧进行通信,分为以下5种类型:数据帧、遥控帧、错误帧、过载帧和间隔帧,数据帧和遥控帧有标准(11位ID)和扩展(29位ID)两种格式

 

数据帧:

1、帧起始:表示数据帧开始的段,标准帧和扩展帧都是由1个位的显性电平表示帧起始

2、仲裁段:表示该帧优先级的段,标准帧和扩展帧在本段有所区别

  ID都是高位在前,低位在后,基本ID禁止高7位均为隐性(ID不能取1111111XXXX)

  RTR是远程请求位,显性电平(0)代表数据帧,隐性电平(1)代表远程帧

  SRR替代远程请求位,相当于RTR位为0时是RTR,为1时是SRR

  IDE是标识符选择位,为0是标准标识符,为1是扩展标识符(标准格式的IDE位于控制段,扩展格式的IDE位于仲裁段)

3、控制段:表示数据的字节数及保留位的段,标准帧和扩展帧的控制段稍有不同

  r0、r1是保留位,必须以显性电平发送,但接受可以是隐性电平

  DLC是数据长度码,0~8表示发送/接收的数据长度(字节)

  IDE标识符选择位,只有标准格式有,扩展格式的在仲裁段

4、数据段:数据内容,一帧可以发送0-8个字节的数据,从最高位MSB开始输出,标准帧和扩展帧在这个段的格式完全相同

5、CRC段:检查帧的传输错误的段,用于检查帧传输错误,由15个位的CRC顺序和1位的CRC界定符组成,两种格式相同

  CRC的值计算范围包括:帧起始+仲裁段+控制段+数据段,通过对比发送方和接受方的CRC值来判断传输是否正确

6、ACK段:判断是否正常接收,由ACK槽和ACK界定符两个位组成

  发送单元ACK段发送两个隐性位

  接收单元ACK段接收到正确的消息在ACK槽发送显性位,通知发送单元,接受结束

7、帧结束:表示数据帧结束的段,由7个位的隐性位组成

 

总线仲裁:

1、总线空闲时,最先发送的单元获得发送优先权,一旦发送其他单元无法抢占

2、如果有多个单元同时发送,则连续输出显性电平多的单元具有较高的优先级(从ID开始比较,如果ID相同还会比较RTR和SRR等位)

 

位时序:

位速率:由发送单元在非同步情况下发送的每秒钟的位数称为位速率

一位可以分为以下四个段,每一段又由若干可称为Tq的最小时间单位构成,称为位时序

  同步段(SS):

  传播时间段(PTS):

  相位缓冲段1(PBS1):

  相位缓冲段2(PBS2):

 位时间=1/波特率,知道位时间我们就可以知道波特率

 

控制器工作模式:

工作模式:(通过CAN_MCR寄存器控制INRQ和SLEEP)

  初始化模式:(INRQ=1,SLEEP=0),设置寄存器,调整波特率

  正常模式:(INRQ=0,SLEEP=0),正常收发工作模式

  睡眠模式:(SLEEP=1),降低功耗

测试模式:(通过CAN_BTR寄存器控制LBKM和SILM)

  静默模式:(LBKM=0,SILM=1),仅接受信息,不发送,用来监控总线上的信息

  环回模式:(LBKM=1,SILM=0),只发送信息,不接收

  环回静默模式:(LBKM=1,SILM=1),自发自收

调试模式:

 

CAN发送流程:

程序选择一个空置的邮箱(TME=1)→设置标识符(ID)、数据长度和发送数据→设置CAN_TIxR的TXRQ位为1,请求发送→

邮箱挂号(等待成为最高级)→预定发送(等待总线空闲)→发送→邮箱空置

 

CAN接收流程:

FIFO为空→收到有效报文→挂号_1(存入FIFO的一个邮箱,这个由硬件控制,不需要理会)→收到有效报文→挂号_2→收到有效报文→挂号_3→收到有效报文→溢出

CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文

报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将替代老数据

CAN位时序:

STM32F103,设TS1=8、TS2=7、BRP=3,波特率=36000/[(9+8+1)*4]=500Kbps
STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kbps

 

CAN控制寄存器:

主控制寄存器(CAN_MCR):仅设置INRQ位用来控制初始化请求,CAN初始化时先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器必须在CAN正常工作前设置),之后再设置INRQ=0,进入正常工作模式

  设置INRQ=0,使CAN初始化模式进入正常工作模式

  设置INRQ=1,使CAN从正常工作模式进入初始化模式

位时序寄存器(CAN_BTR):

  BRP[9:0]:波特率预分频器,定义一个时间片的长度,tq=(BRP[9:0]+1)*tpclk

  TS1[3:0]:定义时间段1中时间片的数目

  TS2[2:0]:定义时间段2中时间片的数目

  SJW[1:0]:再同步跳转宽度,定义CAN硬件在执行再同步时最多可以将位加长或缩短的时间片数目

接收FIFO寄存器(CAN_RF0R/CAN_RF1R):

  FMP[1:0]FIFO消息挂起,用于指示接收FIFO中挂起的消息数,硬件每向FIFO中存储一条新消息,FMP就会增加,软件每次通过RFOM位置1来释放输出邮箱,FMP就会减小,即通过RFOM位间接控制

  FULL:满,FIFO中存储三条消息后由硬件置1

  FOVR:上溢,FIFO填满时,如果接收到新消息并且通过筛选器,此位将由硬件置1,此位由软件清零

  RFOM:释放FIFO输出邮箱,由软件置1,用于释放FIFO的输出邮箱,FIFO中至少有一条消息挂起时才能释放输出邮箱,FIFO为空时此位置1没有任何作用,如果FIFO中至少有两条消息挂起,软件必须释放输出邮箱,才能访问下一条消息,输出邮箱释放,后此位由硬件清零

发送邮箱标识符寄存器(CAN_TIxR):

  TXRQ:发送邮箱请求,由软件置1,用于请求发送相应邮箱的内容,邮箱变空后此位由硬件清零

  RTR:远程发送请求,0为数据帧,1为遥控帧

  IDE:标识符扩展,用于定义邮箱中消息的标识符类型,0为标准标识符,1为扩展标识符

发送邮箱数据长度和时间戳寄存器(CAN_TDTxR):

  DLC[3:0]:数据长度代码,该字段定义数据帧或遥控帧请求中的数据字节数,一条消息可以包含0到8个数据字节,具体取决于DLC字段的值

发送邮箱数据寄存器(CAN_TDL/CAN_TDH):前者存储低4个字节的数据,后者存储高4个字节的数据,发送的数据就存储在这两个寄存器中

接收邮箱标识符寄存器(CAN_RlxR):

接收邮箱数据长度和时间戳寄存器(CAN_RDTxR):

接收FIFO邮箱数据寄存器(CAN_RDL/CAN_RDH):

筛选器模式寄存器:

筛选器尺度寄存器:

筛选器FIFO关联寄存器:

筛选器激活寄存器:

筛选器组i寄存器x:

 

posted @ 2016-03-22 22:02  喜闻乐见小逗逗  阅读(1900)  评论(0编辑  收藏  举报