Simulink CAN PACK Message总线解包及处理
程序员文章站
2022-04-01 18:42:34
...
Simulink CAN PACK Message总线解包
开发环境:本项目是基于simulink 2019a完成。
项目背景:需要在发出去的CANmessage中加载CRC16数据。
实现方案如下:
项目中要用到pack加载dbc,但data区后两字节需要加载CRC16,CRC16计算的数据为前6字节,而pack前均为信号量,故需要对pack后的封包数据进行提取解封,然后处理CRC然后再合并数据总线成CAN message BUS。网上找了许久也没有相关资源,就自己做了一个示例,验证运行正常。希望可以帮到和我一样对汽车CAN总线解包封包有需求的。
** 模型整体框图如下 **
** CRC子函数展开框图如下 **
模型中用到了BUS selector,create BUS 模块进行解包和封包。
CRC使用的是MATLAB Function实现。语言为M语言。
function CAN_Message = Modbus_CRC16(message)
CAN_Message =uint8(zeros(8,1));
crc_reg = uint16(hex2dec('0000'));
crc_reg_xor = uint16(hex2dec('0000'));
CRC_poly = uint16(hex2dec('C86C'));
for ii = 1:6 %length(message))
CAN_Message(ii)=message(ii);
data_s=uint16(message(ii));
current = bitshift(data_s,8);%左移8位
for jj = 1:8
crc_reg_xor = bitxor(crc_reg,current);
if bitget(crc_reg_xor,16) == 1
crc_reg = bitxor(bitshift(crc_reg,1),CRC_poly);%uint16(51308)
else
crc_reg = bitshift(crc_reg,1);
end
current = bitshift(current,1);
end
end
CAN_Message(7)=bitand( crc_reg, uint16(255));%uint8(mod(crc_reg,1e8));
CAN_Message(8)=uint8(bitshift(crc_reg,-8));
其中新建CAN message BUS 遇到过一点小麻烦,就是BUS总线中再包含data[8],通过对create BUS 设置后解决。
希望以上能帮到和我有一样问题的同学。
代码连接地址:
https://download.csdn.net/download/weixin_43255491/12245007
上一篇: 怎么找到ADC0804的芯片封装
下一篇: TLC549ADC驱动的FPGA实现