近期学习嵌入式过程中混淆了大小端和高位先行、低位先行的区别,现总结如下。

首先地址信号的顺序:

一个地址信号是一个16位的二进制数字,最右边的是第1位,最左边的是第16位。低8位指的是第1位到第8位,高8位指的是9-16位。

首先解释大端小端模式。大端模式即高位字节存放在低地址中,低位字节存放在高地址中;小端模式相反,高位字节存放在高地址中,低位字节存放在低地址中。用图表示更加容易理解。如下图,我们将数据0x01020304分别按照大端模式和小端模式存放在芯片中。

内存地址 0x00000004 0x00000003 0x00000002 0x00000001
大端 0x04 0x03 0x02 0x01
小端 0x01 0x02 0x03 0x04

注意芯片在取数据时,都是从低地址位开始取数据,这就是为什么要注意大小端的原因。用下面代码作解释:

int main()
{int a=0x01020304;printf("%x",(int)(*((char*)(&a))));//看输出的是0x01还是0x04
}

由于芯片都从低地址位开始取数据,那么如果上述代码输出0x01,表示高位字节0x01存放在低地址位,则此芯片采用大端模式;如果上述代码输出0x04,表示低位字节0x04存放在低地址位,则此芯片采用小端模式。

大小端模式是一种存储方式,是针对芯片来说的,每一个芯片在出厂时都已经规定好了大小端,用户不可以更改。

然后解释高位先行(MSB)和低位先行(LSB)。高位先行即在传输一个字节的时候先传输高位;低位先行即在传输一个字节的时候先传输低位。高位先行和低位先行是针对串行数据传输方式来说的。常见的串行传输方式有串口(UART)、I2C、SPI等。以串口传输方式为例,标准的串口传输方式是低位先行,如下图所示,芯片在通过TX引脚发送数据时,依次发送位0、位1……位7。

一般的芯片都集成串口外设,大家在使用串口时直接配置就行,可能体会不到高位先行和低位先行。下面以常用的模拟I2C为例,从代码上更加直观的看一下高位先行和低位先行。

I2C在数据传输时,协议规定了数据传输必须是高位先行,以下代码为I2C发送一个字节:

void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL=0;              //拉低时钟开始传输数据for(t=0;t<8;t++)        //循环8次,即发送一个字节{              IIC_SDA=(txd&0x80)>>7;//每次左移7位,即将最高位移到最低位,发送出去txd<<=1;     delay_us(2);   IIC_SCL=1;delay_us(2); IIC_SCL=0;    delay_us(2);}
}

从第8行和第9行代码中可以看到,在发送一个字节时,先将最高位发送出去,然后是第6位……第0位;同样在接收一个字节时,接收到的第1位认为是最高位,接收一个字节代码如下:

u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDAÉèÖÃΪÊäÈëfor(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;   //每次左移一位,循环8次后,第1次接收的位移到了最高位,依次类推if(READ_SDA)receive++;   delay_us(1); }                     if (!ack)IIC_NAck();//发送非应答elseIIC_Ack(); //发送应答 return receive;
}

所有使用I2C的设备必须遵循I2C协议,必须都是高位先行的,这样才能实现通用性。

大小端与高位先行、低位先行相关推荐

  1. C语言中的大小端转换与高低位颠倒

    在说大小端高低位之前,肯定要说明数据在计算机内是如何存储的.在计算机中,我们将数据分割成了一个一个的字节(byte),而每个字节又有8位(bit). 一个字节,可以声明为unsigned char型数 ...

  2. c语言高低位拷贝_C语言中的大小端转换与高低位颠倒

    总结一下最近工作学到的东西,主要是关于大小端与高低位. 在说大小端高低位之前,肯定要说明数据在计算机内是如何存储的.在计算机中,我们将数据分割成了一个一个的字节(byte),而每个字节又有8位(bit ...

  3. .pgr照片文件解析,C++与Java存储数据差别大小端模式

    一..pgr是什么? .pgr文件是二进制的图像文件,可以用普通的文本文件打开,或者查看十六进制的文本信息: 读取需要了解~~~非常重要 !!! 基本数据类型的大小端存储模式 表头Header 详细信 ...

  4. Linux系统的大小端模式

    大端模式 所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数 ...

  5. 大小端字节序介绍以及判断当前环境字节序的程序【C语言】

    文章目录 1.大小端字节序介绍 2. 判断当前环境的字节序程序 1.大小端字节序介绍 首先我们先来介绍什么是大端字节序,什么是小端字节序: 大小端字节序指的是数据在电脑上存储的字节顺序 小端字节序存储 ...

  6. C 语言编程 — 大小端区分

    目录 文章目录 目录 大端.小端 区分方式 1 区分方式 2 大端.小端 大端:高位字节放在内存的低地址端,低位字节放在内存的高地址端,CPU 对操作数的存放方式从高字节到低字节. 小端:低位字节放在 ...

  7. 计算机存储的大小端模式解析

    ---------------------------------------------------------------------------------------------------- ...

  8. 【一雪前耻!】两种方法判断大小端模式

    废话不多说,直接上代码. 法一:指针法 #include <stdio.h>int main(){int a = 1;char p = *((char *) &a); ///< ...

  9. 大小端模式 判断方法

    大端模式(Big-endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; ...

最新文章

  1. Java 中字符串的格式化
  2. 星梦缘陈彦妃_还记得《星梦缘》的女主吗,她现在变成这样了
  3. 涂抹功能_贴片面膜、水洗面膜、涂抹面膜这三款怎么选?
  4. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法
  5. python怎么输入文件数据库_python学习日记——文件及数据库
  6. MT6580启动流程
  7. HDU2021多校第五天 1009 Array-树状数组求二阶前缀和
  8. python ks值计算_利用Python计算KS的实例详解
  9. 接口测试基础一--HTTP请求
  10. RPC简介以及冲击波介绍
  11. Oracle Analyze
  12. 小白入门web前端360必问--Html标签语义化可能最全,越段位之神器;
  13. AVX钽电解电容参数指标
  14. 三菱FX系列PLC以太网连接西门子wincc软件
  15. win10修改user用户名,完美解决,亲试无bugs
  16. 西安思源中学2021高考成绩查询入口,2021年西安高考各高中成绩及本科升学率数据排名及分析...
  17. 唐太宗 李世民 (599-649)
  18. python中answer是什么意思_用Python实现的quot;石头,剪刀,布quot; - The answer to everything - ITeye博客...
  19. Bootstrap进阶四:jQuery插件详解
  20. hbw-utils - 基本数据类型的toString()实现

热门文章

  1. EasyExcel使用详解与源码解读
  2. 查看oracle是否open,Oracle查看已被使用的open_cursorssession_cached_cursors
  3. 万维网、因特网、互联网区别
  4. input表单所有属性【web前端】
  5. OpenJudge NOI 1.8 20:反反复复
  6. 华为机试真题 Java 实现【开心消消乐】【2022.11 Q4 新题】
  7. python百度地图标注,Python+百度地图实现地址多点标注--用上BMap了
  8. 中标麒麟v7服务器宕机问题分析
  9. 神操作!“AI程序员”走进偶像剧,网友:我服!
  10. matlab cvx