【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: