S32K14X CAN

📅 2026/7/8 2:13:45
S32K14X CAN
一、CAN总线工作原理CAN电平标准CAN总线采用差分信号即两线电压差VCAN_H-VCAN_L传输数据位高速CAN规定电压差为0V时表示逻辑1隐性电平电压差为2V时表示逻辑0显性电平低速CAN规定电压差为-1.5V时表示逻辑1隐性电平电压差为3V时表示逻辑0显性电平在发送数据帧之前总线必须处于空闲状态空闲状态时总线是隐形电平1随后数据帧开始数据帧第一位表示是显性电平0它的意思是SOF帧起始。与串口波形的起始位一样帧起始的作用是“打破宁静”因为空闲是隐形1所有设备都不去碰总线那你要开始发数据帧第一位就必须得张开总线发送显性0。一位帧起始之后首先发送的是报文ID标准格式是11位报文ID可以表示后面数据的功能因为总线上各种报文信息都有如果没有ID加以区分那肯定就搞混了。同时报文ID还用于区分优先级当多个设备同时发送时根据仲裁规则ID小的报文优先发送ID大的报文等待下一次总线空闲再重新发送不同功能的数据帧其ID都不同。报文ID后紧跟着的是RTR占据1位在数据帧里必须为显性0RTR的意思是远程请求标志位用于区分数据帧还是遥控帧数据帧必须为显性0遥控帧必须为隐形1。报文IDRTR位可以称为仲裁段仲裁主要靠ID来实现RTR也加入进来的目的是相同ID的数据帧和遥控帧数据帧的优先级大于遥控帧。之后进入控制段控制段首先是IDE意思是ID拓展标志位用于区分标准格式还是拓展格式标准格式固定为显性0拓展格式固定为隐形1。之后下一位是r0必须为显性0r0意思是保留位目前还没有用到。后面四位是DLC意思是表示数据段的长度CAN总线一帧数据可以有1~8个字节有效载荷并且可以灵活指定就靠这个DLC指定如果想发一个字节DLC就给0001如果想发8个字节DLC就给1000DLC要配合后面数据段使用。数据段就是有效载荷的数据了根据DLC的指定数据段可以有多个字节DLC指定几个字节数据段就发几个字节。数据段长度是0~64位最大64位即8个字节这里位数是8的倍数。数据段之后是CRC段有15位CRC是高效的校验算法。从SOF到Data这些数据位计算得到的校验码附在这后面接收方收到数据和校验码也会调用CRC算法进行计算。下一个是CRC界定符1位必须是隐形电平.之后就是ACK段里面有ACK槽和ACK界定符都是1位ACK槽的作用就是应答发送方发送一帧数据到底有没有设备接收到呢就靠ACK位来实现这里的应答设计和I2C的应答异曲同工它的基本思想就是当发送方发完一帧数据的主要内容后在应答这一位时发送方释放总线总线回归默认状态隐形1如果接收方收到数据了它就会在ACK槽这一位主动出击把总线再拉开时总线呈现显性0的状态发送方释放总线后在ACK槽会读取总线状态如果发送方读取为显性0那就是数据被接收了如果发送方读取为隐形1就说明发送失败发送方可以配置自动重发。可以看到在ACK槽这一位操作总线的权力是有一个短暂的交接的前面所有波形都只有发送方有权操作总线在ACK槽这一位变为接收方操作总线为了给权力交接流出时间ACK槽前后就要留两个界定符在CRC界定符时发送方必须发隐形1除了做一个分隔另一个作用就是在ACK槽之前发送方必须释放总线发送隐形1就是释放总线之后在ACK槽的时间点接收方会拉开总线ACK槽接收后接收方不能一直拉着不放所以在ACK界定符时接收方必须及时释放总线交出控制权。这里有两个注意事项第一个是ACK槽时可以允许多个接收方共同拉开总线因为一个报文消息可以被多个设备同时接收所以多个设备可以在这里同时拉开多个设备同时操作总线输出显性0是没问题的。第二个是我没要知道并不是发送方把一段波形完整发出去然后在接收应答的而是发送方和接收方共同完成一整个波形发送方每发出一位接收方就立刻接收到这一位了所以在这条时序的最后整个数据帧还没结束接收方其实已经收完了也就是应答位夹在发送过程之中。最后应答位结束发送方再发7个隐形1作为EOF帧结束与串口波形里的停止位是一个意思。任何设备检测到连续11个隐性电平即认为总线空闲。SOFStart of Frame帧起始表示后面一段波形为传输的数据位IDIdentify标识符区分功能同时决定优先级RTRRemote Transmission Request 远程请求位区分数据帧和遥控帧IDEIdentifier Extension扩展标志位区分标准格式和扩展格式SRRSubstitute Remote Request替代RTR协议升级时留下的无意义位r0/r1Reserve保留位为后续协议升级留下空间DLCData Length Code数据长度指示数据段有几个字节Data数据段的1~8个字节有效数据CRCCyclic Redundancy Check循环冗余校验校验数据是否正确ACKAcknowledgement应答位判断数据有没有被接收方接收CRC/ACK界定符为应答位前后发送方和接收方释放总线留下时间EOFEnd of Frame 帧结束表示数据位已经传输完毕若多个设备的发送需求同时到来或因等待而同时到来则CAN总线协议会根据ID号仲裁段进行非破坏性仲裁ID号小的优先级高取到总线控制权ID号大的优先级低仲裁失利后将转入接收状态等待下一次总线空闲时再尝试发送实现非破坏性仲裁需要两个要求线与特性总线上任何一个设备发送显性电平0时总线就会呈现显性电平0状态只有当所有设备都发送隐性电平1时总线才呈现隐性电平1状态即0 X X 01 1 1 1回读机制每个设备发出一个数据位后都会读回总线当前的电平状态以确认自己发出的电平是否被真实地发送出去了根据线与特性发出0读回必然是0发出1读回不一定是1回读机制目的是确认自己发出的电平是否真实地发送出去了。因为根据线与特性我发送1如果要别的设备也在发送数据别的设备发送了0那么我读回的数据就不再是1了因为我的数据1被别的设备的数据0损坏了这个现象对仲裁就很重要我发出1但是读回的是0这说明总线上有别的设备我感知到了别的设备和我的冲突所以这时候我就退出不再跟别的设备抢总线资源。位时序为了灵活调整每个采样点的位置使采样点对齐数据位中心附近CAN总线对每一个数据位的时长进行了更细的划分分为同步段SS、传播时间段PTS、相位缓冲段1PBS1和相位缓冲段2PBS2每个段又由若干个最小时间单位Tq构成Tq是程序中自己指定的比如可以确定一个Tq0.5us之后一位包含的四个段SS段固定为1TqPTS段可以由自己指定配置为1~8TqPBS1段也是自己指定配置为1~8TqPBS2段自己指定配置为2~8Tq除了SS段固定为1Tq其他的可以由自己在一个范围内指定。指定好之后在一位中SS、PTS、PBS1、PBS2就会依次排列。SS段意为同步段如果数据跳变沿正好出现在SS段那就说明当前设备与波形达成同步如果数据跳变沿不在SS段那就要调整当前设备的位时序使跳变沿正好出现在同步段。PTS意为传播时间段作业在手册里是这样说的PTS用于吸收网络上的物理延迟网络的物理延迟指发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟。PTS的时间为以上延迟时间的和的两倍。之后两个PBS1和PBS2意为相位缓冲段作用就是确定采样点的位置采样点会在PBS1和PBS2中间。硬件同步硬同步也可以叫硬件同步解决的问题是时接收方第一个采样点与波形的第一位对齐。每个设备都有一个位时序计时周期当某个设备发送方率先发送报文其他所有设备接收方收到SOF的下降沿时接收方会将自己的位时序计时周期拨到SS段的位置与发送方的位时序计时周期保持同步硬同步只在帧的第一个下降沿SOF下降沿有效经过硬同步后若发送方和接收方的时钟没有误差则后续所有数据位的采样点必然都会对齐数据位中心附近波特率 计算波特率 1 / 一个数据位的时长 1 / (TSS TPTS TPBS1 TPBS2)例如SS 1TqPTS 3TqPBS1 3TqPBS2 3TqTq 0.5us波特率 1 / (0.5us 1.5us 1.5us 1.5us) 200kbps二、CAN通讯