Motorola_MSB_LSB

2023-05-16

声明:如果涉及侵权,请联系本人删除侵权内容。
  声明:本文由本人以以往工作经验为依据,总结而得,如果错误,欢迎指正,便于后人参考,少走弯路。 

如果图片加载失败,可访问github查看:Motorola_MSB_LSB

  最近同事给了一份CAN通信矩阵,看到其中"Byte Order"(排列格式)一栏给出的是"Motorola Msb"时比较疑惑,查看相关资料并结合以往项目经验,总结此文。

1. 四个概念

这里需要理解以下四个概念

  • 数据在存储器中的存放顺序
  • 变量
  • 数据在CAN报文中的存放顺序
  • CAN报文数据域传输顺序

为了解释以上四个概念,这里准备一下基础数据:

  • 使用的数据:0x5A5,对应二进制:010110100101b;
  • 使用的存储器地址假设以0地址开始;
  • 使用的变量名:Uint16 gusVal = 0x5A5;Uint8* gpucPtr;

1.1. 数据在存储器中的存放顺序

  数据在存储器中存储分大小端方式,目前用过的一款NXP的MCU采用的是大端方式,具体如下:

  • 字节中位序 - 升序:lsb在一个Byte的最右边,msb在一个Byte的最左边:

    • Byte:b7-b6-b5-b4-b3-b2-b1-b0
  • 字节中位序 - 降序:lsb在一个Byte的最左边,msb在一个Byte的最右边:

    • Byte:b0-b1-b2-b3-b4-b5-b6-b7
  • 小端存储:

    • 对于大于一个字节的数据类型的数据,在存储器中,低字节存储在低地址,高字节存储在高地址;
  • 大端存储:

    • 对于大于一个字节的数据类型的数据,在存储器中,高字节存储在低地址,低字节存储在高地址;

1.2. 变量

  • 如果我们直接在程序中使用一个Uint16的变量,不使用指针时,不会有疑惑,使用方式如下:
    • 获取该变量的低字节:Uint8 Temp = (Uint8)(gusVar & 0xFF)
    • 获取该变量的高字节:Uint8 Temp = (Uint8)((gusVar >> 8) & 0xFF)
    • 将该变量赋给其他变量:Uint16 Temp = gusVar;
  • 如果我们使用指针来获取存储在0和1地址的值"0x5A5",分为一下情况:
    • 存储方式是大端,0地址放0x05,1地址放0xA5:
      
        
      1. gpucPtr = (Uint8*)0;

      2. gusVal |= (Uint16)(*gpucPtr << 8);

      3. gpucPtr = (Uint8*)1;

      4. gusVal |= (Uint16)*gpucPtr;

    • 存储方式是小端,0地址放0xA5,1地址放0x05;
      
        
      1. gpucPtr = (Uint8*)0;

      2. gusVal |= (Uint16)*gpucPtr;

      3. gpucPtr = (Uint8*)1;

      4. gusVal |= (Uint16)(*gpucPtr << 8);

1.3. 数据在CAN报文中的存放顺序

  • CAN报文每个报文可包含8Byte的字节数据域,在报文内数据的字节序和位序如下:
    • 字节序:Byte0、Byte1、Byte2、Byte3、Byte4、Byte5、Byte6、Byte7
    • 位序:bit7、bit6、bit5、bit4、bit3、bit2、bit1、bit0
  • 目前遇到的项目中都是这么排序的,这也应该是CAN2.0标准格式,但未详查,如有出入望纠正;

1.4. CAN报文数据域传输顺序

  • 字节顺序:先传Byte0,最后传Byte7;
  • 字节内位序:先传bit7,最后传bit0;
  • 目前遇到的项目中都是这么排序的,这也应该是CAN2.0标准格式,但未详查,如有出入望纠正;

2. CAN信号映射

  在项目中遇到过CAN报文填充信号时,出现字节序出错的现象,大概总结有三种针对信号和CAN报文中数据域的映射方式:Intel、Motorola_MSB和Motorola_LSB。
  在使用 CANdb++编辑器时发现,对于字节序的选择只有Intel和Motorola两种格式(如下图),通过查看之前的dbc文件,发现这里采用的是Motorola_LSB的方式。

CANoeByteOrder

2.1. 缩写

  • LSB:least significant byte(CAN某个信号的最低字节)
  • MSB:most significant byte(CAN某个信号的最高字节)
  • lsb:least significant bit(CAN某个信号中某个字节的最低有效位)
  • msb:most significant bit(CAN某个信号中某个字节的最高有效位)

2.2. CAN信号映射

  还是以数据"0x5A5"来解释,这里做如下假设:信号值0x5A5,开始位置为第二个字节Byte1的bit4。

2.2.1. Intel(小端)

  • 信号值:0x5A5,二进制:010110100101b
  • 信号起始位:byte1的bit4,在报文中的索引是12
  • 信号长度:12bit

Intel-A

Intel-B

2.2.2. Motorola_LSB(大端)

  • 信号值:0x5A5,二进制:010110100101b
  • 信号起始位:byte1的bit4,在报文中的索引是12
  • 信号长度:12bit

MotorolaLSB-A

MotorolaLSB-B

2.2.3. Motorola_MSB(大端)

  • 信号值:0x5A5,二进制:010110100101b
  • 信号起始位:byte1的bit4,在报文中的索引是12
  • 信号长度:12bit

MotorolaMSB-A

MotorolaMSB-B

3. 刚开始的猜想

  刚开始对Motorola_MSB和Motorala_LSB的理解如下,总结在这里方便有感兴趣的人理解。

3.1. Motorola_MSB(错误!)

  • 信号值:0x5A5,二进制:010110100101b
  • 信号起始位:byte1的bit4,在报文中的索引是12
  • 信号长度:12bit

ErrorMSB-A

ErrorMSB-B

3.1. Motorola_LSB(错误!)

  • 信号值:0x5A5,二进制:010110100101b
  • 信号起始位:byte1的bit4,在报文中的索引是12
  • 信号长度:12bit

ErrorLSB-A

ErrorLSB-B

4. 总结

  Motorola_LSB和Motorola_MSB的区别是某个信号起始位置确定的情况下,在报文中的映射空间不一样,映射顺序一样(低字节放在高字节,高字节放在低地址,位序都是从右到左是b0到b7)。
  而我刚开始的错误理解是,两者的在报文中的映射空间是一样的,映射顺序不一样。

5. 备注

  • 本文中讲到的信号只会占用CAN报文的前三个字节,为了使文档看起来整洁,只保留了CAN报文的前四个字节的截图,不可误以为CAN报文只有4个字节。

(1673条消息) Motorola_MSB_LSB_TCangi的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Motorola_MSB_LSB 的相关文章

  • 解决chkconfig设置开机启动时出现missing LSB的错误

    0x00 主要原因是脚本不符合LSB tags规范 xff0c 在 bin bash下面添加如下代码即可 以tomcat为例 span class hljs preprocessor BEGIN INIT INFO span span cl
  • LSB(Linux Standard Base)通用部分学习自用(1)

    前言 什么是LSB xff08 借用了这位博主的高见 xff09 LSB文档下载 自用 xff0c 如有错误请指出 xff0c 不胜感激 本系列基于LSB Core Generic 5 0 介绍 The LSB defines a bina
  • ubuntu 安装python3.7 以及安装pip3 出现Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 1问题解决

    如果没有安装包 xff0c 请下载 xff1a 1 wget http www python org ftp python 3 7 0 Python 3 7 0 tgz 此链接为python3 7 xff0c 其他版本自行选择 先安装一些依
  • 对于LSB的理解(位的LSB、模数转换的LSB)

    之前对于LSB的理解 xff1a 最高有效位 xff08 MSB xff09 指二进制中最高值的比特 在16比特的数字音频中 xff0c 其第1个比特便对16bit的字的数值有最大的影响 例如 xff0c 在十进制的15389这一数字中 x
  • Motorola_MSB_LSB

    声明 xff1a 如果涉及侵权 xff0c 请联系本人删除侵权内容 声明 xff1a 本文由本人以以往工作经验为依据 xff0c 总结而得 xff0c 如果错误 xff0c 欢迎指正 xff0c 便于后人参考 xff0c 少走弯路 如果图片
  • 硬件MSB最高位优先、LSB最低位优先的CRC计算原理详细解释和程序,正算反算成功等效,DS18B20和HTU31D传感器CRC

    wxleasyland 64 139 com 2022 7 以前写过 我学习CRC32 CRC16 CRC原理和算法的总结 xff08 与WINRAR结果一致 xff09 长篇 经过十几年又忘记了 这次碰到DS18B20进行CRC校验 xf
  • 利用LSB算法隐藏文字信息的MATLAB实现

    LSB算法 隐藏文字信息 LSB Least Significant Bit 最低有效位 指二进制中最低位数值 详见WiKi https en wikipedia org wiki Least significant bit 隐写术 隐写术
  • 关于嵌入式系统的学习路线图

    来源 本文乃同济大学软件学院王院长 JacksonWan 在同济网论坛发表的帖子 谈谈软件学院高年级同学的学习方向 的第二部分 三部分依次为 一 关于企业计算方向 二 关于嵌入式系统方向 三 关于游戏软件方向 嵌入式系统方向 嵌入式系统无疑
  • Big Endian与Little Endian区别

    author skatetime 2010 03 05 Big Endian与Little Endian区别 1 什么是Big Endian和Little Endian 在设计计算机系统的时候 有两种处理内存中数据的方法 一种叫为littl
  • 移动基站

    中国移动的基站采用小区制 覆盖范围几KM 而联通采用大区制 可以覆盖几十KM 辐射的频率大小和能量决定覆盖范围 也从另一角度来看 由能量守恒的角度来分析 手机辐射大的其基站辐射小 GSM 反之手机辐射小的其基站辐射大 CDMA 一般分为以下
  • little endian && big-endian

    java 的ClassFile采用big endian存储数据 Intel x86 采用little endian Motorola采用big endian 0x1234 Intel 地址 0x4000 0000 0x34 0x4000 0
  • BIG Endian 和 Little Endian(small endian)模式的区别

    BIG Endian 和 Little Endian small endian 模式的区别 谈到字节序的问题 必然牵涉到两大CPU派系 那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU PowerPC系列采用b
  • LSB(Least Significant Bit)和MSB(Most Significant Bit)

    LSB Least Significant Bit 意为最低有效位 MSB Most Significant Bit 意为最高有效位 若MSB 1 则表示数据为负值 若MSB 0 则表示数据为正 MSB高位前导 LSB低位前导 谈到字节序的
  • 从python中的字节中提取LSB位

    我在变量 DATA 中有一个字节 我想从中提取 LSB 位并打印它 我对 python 很陌生 我发现很多文章都有复杂的按位加法逻辑 而且所有这些都很难理解 我正在寻找一个简单的逻辑 就像我们对字符串所做的那样 例如 DATA 7 1 请帮
  • Android 2.0 中的分辨率支持

    收到我的第一个 Motorola Droid 用户发来的电子邮件 Android 2 0 中引入的新 480x854 分辨率 而不是 320x480 对我的用户界面造成了严重破坏 一切都变得更小并且位置不佳 我的印象是 如果我们遵循 XML
  • NetlinkListener 和 NetlinkEvent 错误消息

    我的应用程序在运行时不会中断 但是总是出现以下错误信息 NetlinkListener 忽略非内核netlink多播消息 NetlinkEvent NetlinkEvent FindParam 未找到参数 UDEV LOG 我正在开发的应用
  • 将字符嵌入图像中

    这就是我想做的 我对 matlab 完全陌生 我使用它才一天左右 这是我的老师要求我做的一些事情 使用 LSB 算法在图像中嵌入语句或字符串组 该字符串将从文件中读取 到目前为止 我还没有使用过任何文件操作 我正在尝试使用一个角色 但我不知
  • 用C语言从M68k RAM地址获取特定字节

    通过 IDA 反汇编程序我到达了这个地址 0010FD74 00 00 00 00 00 00 03 00 00 00 00 00 82 03 80 02 现在我需要给定地址来获取特定字节 例如第 7 个位置有 03 我尝试过使用C语言来做
  • 如何在linux上设置android SDK进行命令行开发?

    我正在尝试设置 android SDK 在 Linux Ubuntu 9 10 的命令行上开发一个简单的程序 我尝试过 eclipse 但它在 Ubuntu 上运行有问题 所以我放弃了 这是我到目前为止所做的 从下载 android sdk
  • UnsupportedOperationException:尝试从与某个不关联的上下文获取显示

    我在实时应用程序上遇到 UnsupportedOperationException 崩溃 所有崩溃都与 Moto Android 11 设备相关 可以看到它和onKeyUp有某种关系 但仍然不知道如何重现或解决这个问题 任何帮助 将不胜感激

随机推荐

  • 如何用servlet写网页访问量计数器?

    如何用servlet写网页访问量计数器 xff1f 1 原料 l MyEclipse l Tomcat l html 2 步骤 1 新建工程 项目栏鼠标右键 New Web Project xff0c 这里我起名为 xff1a myexm4
  • 提示:请安装TCP/IP协议.error=10106。解决方案

    有朋友使用电脑的时候会出现如下错误 xff0c 如何解决该问题是本文写作的目的 提示错误 xff1a 图 1 解决 方案 xff1a 1 删除两个注册表选项 xff1b 按下windows键 43 R键 xff0c 输入regedit xf
  • 防止头文件被重复包含

    前言 为了避免同一个文件被include多次 xff0c C C 43 43 中有两种方式 xff0c 一种是 ifndef方式 xff0c 一种是 pragma once方式 方式一 xff1a ifndef SOMEFILE H 或写为
  • 有趣的网站分享——pornhub风格生成器

    寄语 要说logo设计 xff0c pornhub的logo设计让人印象深刻 xff0c 黑底白字 xff0c 配上一小撮橙色 xff0c 给人极强的冲击力 这不 xff0c 有一个有意思的程序员弄了一个网站 xff0c 专门生成pornh
  • 大小端存储问题

    1 什么是数据的高低位 数据的高位在左 xff0c 低位在右 2 什么是内存的高低位 2 什么是大端存储 小端存储 简单记就是 xff1a 小端 xff1a 低低 xff08 数据低位在内存低位 xff09 大端 xff1a 高低 xff0
  • 【A星算法的优化方案】

    当地图很大的时候 xff0c 或者使用A星算法的寻路频率很高的时候 xff0c 普通的A星算法就会消耗大量的CPU性能急剧下降 xff0c 普通的A星性能还是不过关 接下来我们讲讲A星寻路在遇到性能瓶颈时的优化方案 一 长距离导航 当距离很
  • Java工具类:String与DateTime类型的相互转换

    1 String 转 DateTime 在转换之前需要引入 hutool 依赖 String datestr 61 34 2022 5 19 34 DateTime datetime 61 DateUtil parse datestr 2
  • Iterator迭代器的一般用法

    Iterator迭代器的一般用法 迭代器 xff08 Iterator xff09 迭代器是一种设计模式 xff0c 它是一个对象 xff0c 它可以遍历并选择序列中的对象 xff0c 而开发人员不需要了解该序列的底层结构 迭代器通常被称为
  • socket编程---fgets和fputs函数使用理解

    这一节是继续上一节socket05的讨论 xff0c 来探讨在使用socket进行通信中遇到的一些函数使用理解误区 1 fgets的使用注意点 在写socket通信 xff08 代码见上一篇中 xff0c 只是将sendbuf和recvbu
  • Tarjan算法详细讲解

    Tarjan算法讲解的博客网上找到三篇比较好的 现在都转载了 个人只研究了第一篇 正如博主所说 讲的标比较详细 清晰 剩下两篇也可以看一下 卿学姐视频讲解 https www bilibili com video av7330663 以下内
  • 中文乱码在线恢复网站

    乱码恢复
  • GCC自带的一些builtin内建函数

    title GCC自带的一些builtin内建函数 date 2021 02 27 18 57 00 description 一些GCC自带的内建 bulitin 函数的接口及实现 一 GCC内建函数 最近在刷 leetcode 的时候遇到
  • Shell脚本实用小技巧-教你屏蔽执行命令的所有显示信息,包含错误信息

    前言 xff1a 在Linux中 xff0c 有个 dev null的东西 xff0c 人们一般称之为黑洞 xff0c 大概的意思就是东西就像黑洞一样 xff0c 任何东西丢进去都会消失 xff0c 那么下面就开始进行一些小案例去认识一下这
  • MPU6050应用详解

    MPU6050应用详解 最近项目上要用到 MPU6050 陀螺仪 xff0c 以前没有接触过它 虽然在网上很容易就可以找到了需要的代码 实现了一部分功能 但是却还是对陀螺仪的工作原理不太了解 xff0c 它的代码也需要分析一下 xff0c
  • protobuf详解

    1 protobuf 简介 protobuf protocol buffer 是谷歌内部的混合语言数据标准 通过将结构化的数据进行序列化 串行化 xff0c 用于通讯协议 数据存储等领域和语言无关 平台无关 可扩展的序列化结构数据格式 我们
  • 白泽知识讲堂 | printf漏洞介绍

    引子 Hello各位小伙伴们 xff0c 白泽又和大家见面了 大家还记得自己写的第一个C语言程序吗 xff1f 那是我们和代码爱情的起点 xff0c 一眼万年 没错 xff0c 就是那个耳熟能详的Hello World 1 include
  • Linux生成core文件相关配置,core文件调试示例

    1 生成core文件系统配置 使用ulimit c命令可以查看当前系统对于core文件的配置 xff0c 0表示不生成core文件 xff1b 不为0的数字a表示限制core文件大小不超过a xff0c 单位是k xff1b unlimit
  • Ubuntu 手动配置DNS

    使用ping命令测试百度域名时发现 xff0c 无法解析这个域名 xff0c 说明当前系统上没有配置DNS服务器 配置DNS服务器的方式主要有以下两种 xff1a 目录 1 修改DNS配置文件 etc resolv conf 2 修改网卡配
  • STM32启动文件详解

    启动文件使用的 ARM 汇编指令汇总 启动程序源码注释 点此下载 1 Stack 栈 Stack Size EQU 0x00000400 AREA STACK NOINIT READWRITE ALIGN 61 3 Stack Mem SP
  • Motorola_MSB_LSB

    声明 xff1a 如果涉及侵权 xff0c 请联系本人删除侵权内容 声明 xff1a 本文由本人以以往工作经验为依据 xff0c 总结而得 xff0c 如果错误 xff0c 欢迎指正 xff0c 便于后人参考 xff0c 少走弯路 如果图片