1 参考OSI的CAN模型
1.1 CAN分层模型
标准CAN网络通信采用分层设计模式,参考OSI基本模型,其分层如下:
编号 |
层架构 |
层架构 |
ISO |
1 |
Application Layer |
应用层 |
ISO-15765-3 |
2 |
Session Layer |
会话层 |
ISO-15765-3 |
3 |
Network layer |
网络层 |
ISO-15765-2 |
4 |
Data Link layer |
数据链路层 |
ISO-11898-1 |
5 |
Physical layer |
物理层 |
生产厂商定义 |
1.2 CAN 软件架构
CAN软件架构(Vector协议栈)如下:
15765-2介绍CAN TP模块的标准,介绍报文在俩个节点网络层之间的数据交换,用于诊断报文的组包,解包。
一个CAN报文一次能传输8个字节的数据,而诊断服务中读取数据标识符服务,读取的数据长度往往超过8个字节,这时候会采用15765-2的标准,发送节点会把数据分割成若干帧报文发送出去,接收节点接收到若干帧报文后,把数据重新组装在一起。如上图的所示,只有诊断报文才会通过CANTp模块处理。
2 网络层协议
网络层服务协议指定不同节点之间的网络层数据传输协议,网络层协议允许传输/接收数据长度最高达4095个字节的数据,并反馈传输/接收的结果给相对应的层。
报文数据长度不超过7个字节(正常寻址下)时,报文通过单帧发送/接收;当报文数据长度大于7个字节时,网络层会对数据进行组包(接收报文)及解包(发送报文),并通过首帧,流控帧,续帧配合完成数据的发送。
2.1.1 单帧传输数据
单帧用于传输数据长度低于7(正常寻址下)的数据传输。
如请求诊断会话服务的请求默认会话子服务:
2.1 .2多种帧混合传输数据
如发送一个数据长度为54个字节的数据,其发送流程如下:
其流程是:
- 发送节点发送首帧,
- 接收节点接收到首帧后反馈一帧流控帧(流控帧用于协调传输能力,BS =3 ),
- 发送节点持续发送3帧续帧(连续帧表明当前BS =3)后,接收端再次反馈一帧流控帧,发送节点发送剩下的续帧。(各帧详细介绍,见PCI)
2.2 网络层协议数据单元N_PDU
N_PDU用于实现不同节点间的网络层实体的通讯。
N_PDU有SF N_PDU, FF N_PDU, CF N_PDU, FC N_PDU四种类型。
2.2.1 N_PDU格式
网络协议数据单元由地址信息,协议控制信息,数据域构成。其格式如下:
Address Information |
Protocol Control Information |
Data Field |
N_AI |
N_PCI |
N_Data |
2.2.1.1 N_AI
地址信息由源地址,目标地址,目标地址类型,网络地址扩展信息组成。
当Message Type为Diagnostic时,N_AI由N_SA, N_TA, N_TAtye组成。
当Message Type为Remote Diagnostic时,N_AI由四个组成。
N_SA |
N_TA |
N_TA type |
N_AE |
1 byte |
1 byte |
Physical/functional |
1 byte |
物理寻址与功能寻址
N_TAtype参数是N_TA的扩展,用于选择通信模式:
物理寻址:1对1通信,适用于所有格式N_PDU。
功能寻址:1对N通信,仅适用于单帧通信。
2.2.1.2 N_PCI(重要内容)
N_PCI详细标准如下:
- Signal Frame单帧
SF N_PCItype为0,代表单帧;SF_DL 代表当前的数据长度,范围1~7.
如上的单帧报文解析,0代表单帧,3数据长度为3;3E 00 代表传输的数据,后五位为填充数据。
注意:如果一帧报文的数据不足8字节,生于部分要用特定数据(自定义)进行填充。
如果接收到的SF_DL为0或大于7,网络层要忽略本次接收;
- First Frame首帧
FF PCItype为1,代表首帧,FF_DL占12个比特其范围为1~4095,表明网络层能处理最大的数据长度为4095各字节;
如上的首帧报文解析,1 代表首帧报文,02C代表数据总长度为44字节,62 F1 AE 05 88 91为传输数据,这里传输了6字节数据,剩下的38字节数据将通过单帧传输过来。
如果FF_DL小于8(正常寻址)或小于7(扩展或混合寻址),网络层要忽略本次接收。
如果FF_DL大于目前数据缓存区的容量,认为当前出现错误,并反馈发送节点停止后续报文传输(设置流控帧的FS = OverFlow)。
- Consecutive Frame续帧
CF PCItype为2,SN为帧序列号。
多帧传输时,首帧后第一个续帧的SN为1,默认首帧 的SN为0(该SN不体现在PCI中)。如下图没有data 7 中没有20这个数据。
当SN达到15后且数据未传完的情况时,接收端会发送一帧流控帧,然后发送端的下一个续帧的SN 为 0.
一次续帧连续传输的帧数由流控帧的BS参数限定(最大为15);
多帧传输的最后一帧时续帧,其的SN可能时0到BS中的任意整数值。
- Flow Control Frame流控帧
流控帧由FS,BS,Stmin三个参数组成。
FS |
流控制状态 |
ContiuneToSend(0x00):表明接收端做好接收BS个续帧的准备 Wait(0x01):让接收端等待接收新的流控帧 OverFlow(0x02):表明当前接收能力不足,让发送端停止后续发送 |
BS |
快大小 |
表明接收端要求一次接收续帧的能力大小 |
Stmin |
最小时间间隔 |
接收端同志发送端自己的接收能力,让发送端调整发送报文的时间。 范围(0~127)代表(0~127)ms 范围(0xF1~0xF9)代表(100~900)us |
byte7中:3代表当前为流控帧,0代表ContiuneToSend(0x00):表明接收端做好接收BS个续帧的准备;
byte6中:F代表当前要求续帧的快大小为15,即需连续发送15帧续帧。
byte5中:5代表续帧之间传输的时间间隔为5ms。
流控帧的作用:
因不同节点的传输及数据处理能力不一样,流控帧接受节点就是告诉发送节点自身的接受能力与状态,防止出现发送节点发送过快,接受节点处理不过来的情况。
最大等待流控帧等待传输(N_WFTmax)(需确认):
当FC 的 FS 为Wait时,表示接受节点希望发送节点暂停发送,等待FS 为CTS时,再继续发送。等待过程中,会定期发送流控帧,
如果后续流控帧的FD一直为Wait咋处理呢:
FC.WT报文发送的最大次数为N_WFTmax,当接受到N_WFTmax次等待流控帧后,忽略本次传输。
2 网络层定义参数(待更新)