①硬件构成:
高速CAN:两线电压相同、闭环网络 (120Ω电阻作用:防止回波反射、总线空闲时收紧两根信号线【恢复1状态】)
低速CAN:两线电压不同、开环网络(2.2kΩ电阻作用:防止回波反射)
②电平规范:
【高速CAN】
压差为0V:逻辑1(隐性电平)
压差为2V:逻辑0(显性电平)
【低速CAN】
压差为-1.5V:逻辑1(隐性电平)
压差为3V:逻辑0(显性电平)
③数据帧:
标准格式:
SOF[0] 报文ID[11bit] RTR[1bit] IDE[1bit] 保留位[1bit] DLC[4bit] 载荷[0-64] CRC[15bit] CRC界定符[0] ACK槽[1bit] ACK界定符[1bit] EOF[7bit个1]
SOF:因为总线默认为1所以帧起始为0表示帧开始
报文ID:区分消息类型、划分仲裁优先级
RTR:远程请求标志位[数据帧0、遥控帧1] 数据帧优先级高于遥控帧
IDE:区分标准格式[0]还是扩展格式[1]
DLC:数据段长度,单位为字节
ACK应答:发送方发1,接收方发0(收紧) 可被多从机应答(广播、线与特性)
界定符设计目的:为操作电平留出时间
EOF:结束标志
帧类型:
①数据帧
②遥控帧:RTR为1
③错误帧:位错误、填充错误、CRC错误、格式错误、应答错误时总线上的设备会发出错误帧来破坏数据,同时终止当前的发送【发送六个相同电平的bit】
主动错误:立刻发送6bit逻辑0 + 8bit 逻辑1错误标识
被动错误:立刻发送6bit逻辑1 + 8bit 逻辑1错误标识
根据线与特性,发送被动错误的设备不会影响其他设备【防止因单设备故障传染整个总线】
④过载帧:接收方接收到大量数据无法及时处理时发出过载帧,延缓发送方的数据发送
位填充:发送方每发送五个相同电平的位后,自动追加一个相反电平的填充位;接收方检测到填充位时,自动移除填充位,恢复出原始数据。如果填充后才出现五个相同的电平,则需要继续添加位填充
作用:①增加波形的定时信息,防止波形长时间无变化
②将正常数据流与错误帧和过载帧区别开来
③保持总线活跃状态【大于11个1状态即认定总线空闲】
④位同步:
①CAN将每个bit的时长进行了更细致的划分,划分的最小单位是Tq(可指定)
SS【1Tq】 | PTS【1~8Tq】 | PBS1【1~8Tq】 | PBS2【2~8Tq】 |
SS:同步段,如果条边沿在SS端内则说明达成同步
PTS:用来抵消物网络的物理延迟【=(发送单元的输出延迟+传播延迟+输入延迟)*2】
PBS端:相位缓冲段,采样点在PBS1和PBS2之间,调整二者长度即可改变采样点
②硬同步:以SOF为准,将第一个采样点与第一位对齐【进入SS段】【仅发生在EOF】
③再同步:SJW【最大补偿的Tq数量(1-4个Tq)】 【发生在除SOF的每个跳变沿】
·跳变沿在SS之后:接收方时钟比发送方快,在PBS1后添加SJW位以延后采样
·跳变沿在SS之前:接收方时钟比发送方慢,将PBS2减少SJW位以提前采样(让下一帧恢复正常)
④波特率=1/bit时长(即SS+PTS+PBS1+PBS2)
⑤仲裁
①先占先得:如果当前总线已被占用,则其他任何设备都不能再开始发送数据帧或遥控 帧(错误帧、过载帧破坏数据例外)
②非破坏性仲裁:若多个设备的发送请求同时到来,则CAN协议会根据仲裁段进行仲裁,ID号小点优先发送 (实现要求:线与、回读(每个设备发送一位数据后都会回读总线当前电平,确认已发出))
位填充不会改变优先级:如果原本A>B,要使填充后B>A,那么A和B前面的位都要进行填充,那么就不会影响优先级了
标准格式11位ID号和扩展格式的高11位一致时,标准格式的优先级更高(标准格式RTR为0,扩展格式SRR为1)
⑥错误处理
①错误类型
①位错误:回读时比较输出电平和总电平(不含填充位)不一致时(范围SOF-EOF)
②填充错误:在需要位填充的段(SOF-CRC)内检测到6位电平相同
③CRC错误:收到的crc码和计算出的不同
④格式错误:检测到与固定格式(CRC界定符、ACK界定符、EOF标志)电平状态相反 的位时
⑤ACK错误:发送方未等到ACK应答(即发送方释放总线后总线没有被拉开到状态‘0’)
②错误状态
①主动错误状态:正产参与通信、可以发送主动错误。每个设备初始都为主动错误状态
②被动错误状态:正常参与通信、但只能发送被动错误。设备发送过多主动错误后进入 被动错误状态
③总线关闭状态:不能参与通信、设备处于被动错误状态后依然频繁发送被动错误时进 入该状态【stm32f103添加了用来开关总线关闭状态的设备是否能自动返回主动错误状态】
Can如何实现错误状态切换?
每个设备维护TEC(Transmit Error count)和REC(Receive Error count)
发送或接收失败一次,对应的变量值+1;发送或接收成功一次,对应的变量值也会-1
主动错误状态 —[TEC或REC>127时]—> 被动错误状态 —[TEC>255]—> 总线关闭态
^ |
|______________总线上检测到128次连续的11bit隐形位_____________|
⑦STM32f103中的can资源
发送邮箱状态机示意图:
RQCP:请求完成
TXOK:发送成功
TME:当前邮箱空
空 | 挂号1 | 挂号2 | 挂号3(溢出) |
FMP=0b FOVR=0 | FMP=01b FOVR=0 | FMP=10b FOVR=0 | FMP=11b FOVR=0(1) |
FMP:报文数量
FOVR:FIFO溢出
NART自动重传:发送失败后再次进入预定状态(开启)发送还是直接进入空置状态(关闭)
TXFP优先级配置:发送优先级设置。置0:按标识符大小发送;置1:FIFO
RFLM锁定:置1:FIFO锁定,丢弃新数据;置0:FIFO不锁定,新数据总是覆盖最后收到的报文(邮箱2)
标识符过滤器:
共14个过滤器,每个过滤器具备两个32位寄存器
①列表模式:将需要的ID号写入,每个过滤器可选两个扩展id或四个标准id
②掩码模式:接收特定范围id的报文
测试模式:
①静默模式:用来分析总线的互动,不会对总线造成影响
②回环模式:自发自收,rx断开,但可以在tx上看到信息
③静默回环模式:自发自收,rx、tx均断开
工作模式:
①初始化模式:用于配置can外设,该模式下禁用报文的收发
②正常模式:收发报文
③睡眠模式:can外设时钟停止,可软件或硬件唤醒
④AWUM:置1:总线活动时自动唤醒;置0:手动唤醒
Stm32f103的can控制器位时序:
SS(1Tq) | PBS1(1-16Tq) | PBS2(1-8Tq) |
波特率=时钟频率/SS+PBS1+PBS2
Stm32f103的can控制器中断:
①发送中断:发送邮箱空时进入
②FIFO 0中断:收到一个报文、FIFO 0满、FIFO 0溢出时进入
③FIFO 1中断:收到一个报文、FIFO 1满、FIFO 1溢出时进入
④状态改变及错误中断:ERROE、唤醒、进入睡眠时进入