DWM1000 MAC层

DWM1000 MAC层

MAC层

概述

MAC层,即媒体访问控制层,是数据通信协议栈中的一个重要部分,位于链路层的下半部分,紧邻物理层。在OSI模型中,它属于第二层,即数据链路层的一部分。MAC层的主要职责是控制如何在物理媒介上进行数据的传输,它涉及的内容包括地址标识、帧的封装和处理、访问媒介的方法以及错误检测和更正等。以下是MAC层的详细解释:

主要职责:
  1. 帧封装与解封装:

    • MAC层负责在网络数据包上加上头和尾,形成一个完整的数据帧,在接收方进行相应的解封装处理。帧头通常包含源地址和目的地址。
  2. 地址管理:

    • MAC地址,也称为物理地址,是网络设备在局域网环境中的唯一标识。每个接口都有一个全球唯一的MAC地址。MAC层负责处理这些地址,确保数据能正确地从源传送到目的地。
  3. 访问控制:

    • MAC层控制设备对共享媒介的访问。在多个设备需要共享同一通信媒介时(如以太网),MAC层决定哪个设备何时可以发送数据,这涉及到复杂的协调机制,例如CSMA/CD(用于以太网)或CSMA/CA(用于无线局域网)。
  4. 错误检测:

    • MAC层通常包含某种形式的错误检测,如循环冗余检查(CRC)。这有助于检测数据在传输过程中是否出现错误,并通常标记那些错误的帧,以便上层协议可以决定如何处理。
工作方式:
  • 单播、广播和多播:

    • MAC层支持单播(一对一)、广播(一对全部)和多播(一对多)通信。
  • 帧类型识别:

    • MAC层能识别不同类型的帧,例如在以太网中区分IP数据包、ARP请求等。
  • 流量管理:

    • 在网络拥塞时,MAC层可以执行流量管理和控制策略,如退避算法。
MAC层在不同网络技术中的应用:
  • 以太网(Ethernet):

    • 以太网中的MAC层处理帧的封装,提供MAC地址,并使用CSMA/CD为帧提供访问控制。
  • 无线局域网(WLAN,如Wi-Fi):

    • 在Wi-Fi中,MAC层处理信道访问,支持SSID到MAC地址的映射,并控制帧的重传。
  • 蓝牙(Bluetooth):

    • 蓝牙技术中的MAC层处理设备配对、信道跳变等复杂的访问和通信控制。
重要性:

MAC层对于实现可靠、高效的网络通信至关重要。它不仅确保数据准确无误地从一个节点传输到另一个节点,还管理网络访问,防止数据冲突和传输错误。在设计网络设备和通信协议时,MAC层的设计和实现是优化性能、增强安全和提升用户体验的关键。

MAC消息格式

在这里插入图片描述

这张图是一个IEEE 802.15.4 MAC层数据帧的结构示意图,详细展示了一个完整MAC帧的各个部分:

  1. MAC头部(MHR, MAC Header)
  • 帧控制:占用2个八位组(octets),定义了帧的类型、安全性、帧序列的控制和地址字段的相关信息。
  • 序列号:占用1个八位组,用于识别帧的序列,以便追踪和确认。
  • 目的地PAN标识符:可能是0、2个八位组,指定目的地PAN(个人区域网络)的唯一标识符,如果使用。
  • 目的地地址:可能是0、2个八位组或8个八位组,指定帧的目的地设备的地址。地址可以是短地址(16位)或长地址(64位)。
  • 源PAN标识符:可能是0、2个八位组,指定源PAN的唯一标识符,如果与目的地PAN标识符不同,则需要。
  • 源地址:可能是0、2个八位组或8个八位组,指定帧来源设备的地址。
  1. 辅助安全头部(Auxiliary Security Header)
  • 占用0、5、6、10或14个八位组,包含与帧安全相关的信息,如加密密钥标识符和帧计数器。
  1. MAC有效载荷(MAC Payload)
  • 包含帧的主要内容,其长度是可变的,根据传输的数据量而定。
  1. MAC尾部(MFR, MAC Footer)
  • 帧校验序列(FCS):占用2个八位组,用于检测帧在传输过程中是否出现错误。

这个结构是为了确保MAC层能够正确处理帧的传输、接收和确认。每个字段都有其特定的作用,例如,帧控制字段告诉接收设备如何解析帧,序列号用于追踪传输状态,PAN标识符和地址字段确定帧的发送者和接收者,安全头部包含保护帧不被未授权访问的信息,而FCS用于确保数据的完整性。

假设我们有一个基于IEEE 802.15.4的家庭自动化网络,其中包括多个设备,如智能灯泡、温度传感器和中央控制器。每个设备都有一个唯一的16位短地址,并且都在同一个PAN中工作。现在,温度传感器将定期发送其读数到中央控制器。

这里是一个典型的MAC帧实例,用于温度传感器发送数据:

  1. 帧控制字段:0x8861
  • 数据帧类型(位0-2为0x1)
  • 安全启用(位3为0x0,表示禁用)
  • 帧待处理(位4为0x0,表示否)
  • ACK请求(位5为0x1,表示请求)
  • PAN ID压缩(位6为0x1,表示源和目的PAN ID相同)
  • 目的地址模式(位10-11为0x2,表示16位短地址)
  • 源地址模式(位14-15为0x2,表示16位短地址)
  1. 序列号:0x02
  • 假设这是第二个发送的帧。
  1. PAN ID:0x1234
  • 网络的唯一标识符。
  1. 目的地地址:0x9ABC
  • 控制器的16位短地址。
  1. 源地址:0x5678
  • 温度传感器的16位短地址。
  1. MAC有效载荷:例如,0x07D0
  • 温度值,假设为2000(十六进制0x07D0),表示20.00摄氏度。
  1. FCS:这通常由硬件计算,这里假设为0x4E2B。

因此,整个MAC帧的十六进制表示如下:

8861 02 1234 9ABC 5678 07D0 4E2B

在这个实例中,控制器将监听这类帧,并且当检测到有帧到达时,它会检查PAN ID和目的地地址,确认这是发给它的帧,然后提取温度值。如果帧请求ACK,控制器还会发送一个确认帧回传感器。FCS由硬件计算和检查,以确保数据传输的完整性。

媒体访问控制(MAC)层是数据链路层的一部分,负责管理协议数据单元(PDU)的传输。在不同的通信协议中,MAC消息的格式可以有所不同,但大多数都遵循一定的基本结构。以IEEE 802.15.4(一种用于低速率无线个人区域网络的标准,常用于物联网设备)为例,下面解释了MAC消息格式的一般构成,并给出一个具体实例。

MAC消息格式(以IEEE 802.15.4为例):
  1. 帧控制字段

    • 描述帧的类型(如数据帧、确认帧、MAC命令帧)、安全设置、帧待处理、ACK请求等信息。
  2. 序列号

    • 用于标识帧的唯一序列号,以便于接收方识别重复的帧。
  3. 地址字段

    • 包括PAN ID和地址信息。地址可以是短地址(16位)或长地址(64位),取决于网络配置。
  4. 帧载荷

    • 实际传输的数据或命令信息。
  5. 帧校验序列(FCS)

    • 用于检测帧在传输过程中是否发生错误。
具体实例:

假设有一个IEEE 802.15.4网络,其中一个设备需要向另一个设备发送一条简单的数据消息。

  1. 帧控制字段

    • 假设我们使用数据帧类型,不需要安全功能,不请求ACK,并且使用短地址模式。帧控制字段可能被设置为0x8841(二进制表示为1000 1000 0100 0001)。
  2. 序列号

    • 假设这是第一个发送的帧,序列号可以设置为0x01
  3. 地址字段

    • 假设发送方和接收方都在同一个PAN中,PAN ID为0x1234。发送方的短地址为0x5678,接收方的短地址为0x9ABC
  4. 帧载荷

    • 假设我们发送的消息是“Hello”,则帧载荷将是这个字符串的ASCII编码。
  5. 帧校验序列(FCS)

    • FCS通常由硬件计算。假设在这个例子中,计算得到的FCS是0x3F2A

因此,完整的MAC帧可能看起来像这样:

帧控制序列号PAN ID源地址目的地址载荷FCS
884101123456789ABCHello3F2A

请注意,实际的帧格式会根据具体的协议规范和网络配置有所不同。这个例子仅仅是为了演示MAC层消息格式的一般结构。在实际应用中,FCS是自动计算的,且帧控制字段的具体值将取决于多种因素,如是否需要ACK、是否使用安全特性等。

帧控制字段

MAC报头中的帧控制字段是一个关键的组成部分,它定义了一个MAC帧的性质和结构。帧控制字段通常由几个不同的位组成,每一位或位组指定了不同的信息。在IEEE 802.15.4标准中,帧控制字段通常是16位宽,并包含了以下信息:

  1. 帧类型(Frame Type):

    • 指定了MAC帧的类型。它可以是数据帧、确认帧、信标帧或MAC命令帧。
  2. 安全启用(Security Enabled):

    • 表明该帧是否使用了安全特性,如加密。
  3. 帧待处理(Frame Pending):

    • 指示发送设备有更多的数据待发送给接收设备。
  4. 需要确认(Acknowledgment Request):

    • 表示发送设备是否请求接收设备在接收到帧后发送一个确认帧。
  5. PAN ID压缩(PAN ID Compression):

    • 当源和目的PAN ID相同时,此位被设置,以减少帧的大小。
  6. 序列号抑制(Sequence Number Suppression):

    • 指示是否在帧中包含序列号。
  7. 信息元素存在(Information Elements Present):

    • 表明帧是否包含信息元素。
  8. 目的地址模式(Destination Addressing Mode):

    • 指定目的地址字段是否被包含以及使用的是短地址还是长地址。
  9. 帧版本(Frame Version):

    • 指明了MAC帧头的版本,这对于确保帧的兼容性很重要。
  10. 源地址模式(Source Addressing Mode):

    • 指定源地址字段是否被包含以及使用的是短地址还是长地址。
具体例子

假设有一个MAC帧控制字段的二进制表示为1000100010000011,这个16位的字段可以这样解析:

  • 帧类型:100 (位0-2) - 表示该帧是MAC命令帧。
  • 安全启用:0 (位3) - 表明安全特性未启用。
  • 帧待处理:0 (位4) - 表明没有更多的帧要发送。
  • 需要确认:1 (位5) - 请求接收确认。
  • PAN ID压缩:0 (位6) - 源和目的PAN ID不同,或者没有使用PAN ID压缩。
  • 序列号抑制:0 (位7) - 序列号未被抑制,将包含在帧中。
  • 信息元素存在:0 (位8) - 帧中不包含信息元素。
  • 目的地址模式:10 (位10-11) - 使用16位短地址。
  • 帧版本:00 (位12-13) - 使用2006版的MAC帧头。
  • 源地址模式:10 (位14-15) - 使用16位短地址。

根据这个帧控制字段,我们可以得知这是一个需要对方确认的MAC命令帧,帧中包含了序列号以及使用了16位的短地址作为源地址和目的地址,但没有使用安全特性。这样的帧可能用在设备请求加入网络,或者网络协调器请求设备进行某些操作时。

在这里插入图片描述

这张图展示了IEEE 802.15.4标准中定义的MAC帧控制字段的布局。该字段是MAC层帧结构的一部分,用来定义帧的属性和行为。帧控制字段通常是16位宽,不同的位或位组定义了不同的帧属性。以下是各个部分的详细解释:

  1. 帧类型(Frame Type)
  • 位0到2:用来定义MAC帧的类型。例如,数据帧、确认帧、MAC命令帧或信标帧等。
  1. 安全启用(Security Enabled)
  • 位3:指示该帧是否启用了安全特性,如加密和完整性检查。
  1. 帧待处理(Frame Pending)
  • 位4:告诉接收设备发送设备有更多数据待发送,这通常用于通知接收设备保持活跃以接收后续数据。
  1. ACK请求(ACK Request)
  • 位5:表示发送方是否请求接收方在接收到帧后发送一个确认(ACK)帧。
  1. PAN ID压缩(PAN ID Compress)
  • 位6:如果源和目的PAN ID相同,则可以设置此位以省略其中一个,从而减少帧的大小。
  1. 保留位(Reserved)
  • 位7到9:保留位,通常为特定用途保留或未使用。
  1. 目的地址模式(Destination Address Mode)
  • 位10和11:指定目的地址字段的类型。可能的值包括不包括地址、使用短地址或使用长地址。
  1. 帧版本(Frame Version)
  • 位12和13:定义了帧头的版本,这允许对MAC帧头进行版本控制和未来的扩展。
  1. 源地址模式(Source Address Mode)
  • 位14和15:指定源地址字段的类型,与目的地址模式相同,也是定义地址长度的。

每个位的设置会影响帧的处理和网络设备之间的交互。例如,如果一个设备需要确认,那么在接收到帧后它必须发送一个确认帧。如果PAN ID压缩是激活的,那么在整个帧中只会有一个PAN ID出现,从而减少了帧头的大小。

这种布局允许设备快速解析帧控制字段,并确定如何处理接收到的帧。这对于效率和网络的正确功能至关重要。

在这里插入图片描述

这张图表展示了IEEE 802.15.4 MAC层帧控制字段中帧类型部分的具体编码和相应的帧类型名称。帧类型是位于帧控制字段中的前三位(位0到位2),用于定义MAC层帧的类型。这三位的不同组合指定了不同的帧类型:

  1. 0,0,0:表示这是一个信标帧(Beacon Frame),通常用于同步网络、传递网络信息,如PAN ID和通道。

  2. 0,0,1:表示这是一个数据帧(Data Frame),用于传输用户数据和控制信息。

  3. 0,1,0:表示这是一个确认帧(Acknowledgement Frame),用于确认成功接收前一个帧。

  4. 0,1,1:表示这是一个MAC命令帧(MAC Command Frame),用于执行网络控制操作和设备配置。

  5. 1,0,01,0,11,1,01,1,1:这些都是保留的值,意味着在当前的标准中它们没有被分配给特定的帧类型,但可能在未来的标准中用于新的帧类型或特殊用途。

这种编码允许接收设备快速解析接收到的帧,并决定如何处理它。例如,当设备收到一个带有前三位为0,0,1的帧时,它知道这是一个数据帧,并将按照相应的方式来处理它。如果是0,1,0,则知道需要发送ACK回应。这种分类方法使得通信协议既结构化又灵活,能够适应不同的通信需求和扩展。

PAN ID

在无线通信领域,PAN ID是一个用于识别特定个人区域网络(Personal Area Network, PAN)的唯一标识符。这个概念在许多无线通信标准中使用,包括但不限于IEEE 802.15.4,它是许多低功耗无线技术(如ZigBee、Thread和某些类型的Bluetooth)的基础。

PAN ID的作用:
  1. 网络标识

    • PAN ID是一个通常为16位的数字,用于区分同一物理区域中的不同无线网络。这可以防止数据帧被错误地发送到非目标网络。
  2. 避免地址冲突

    • 即使两个网络中的设备使用相同的短地址,只要它们的PAN ID不同,它们就可以在物理上相同的区域内操作而不会相互干扰。
  3. 帧过滤

    • 在设备的MAC层,PAN ID通常用于帧过滤,帮助设备识别和处理只属于自己网络的帧,而忽略其他网络的通信。
  4. 简化通信

    • 在一个网络中,所有设备共享相同的PAN ID,这简化了通信协议,因为设备只需要检查PAN ID就能确认通信是否针对它们。
PAN ID在实际应用中的使用:

在一个家庭自动化网络中,例如,可能有多个独立的网络,如灯光控制网络、安全系统和家庭娱乐系统。每个系统都可以有自己的PAN ID,即使它们在同一个家庭中并且覆盖范围重叠。

  • 灯光控制网络可能有一个PAN ID,比如0x001A
  • 安全系统可能有一个不同的PAN ID,比如0x004B
  • 家庭娱乐系统再有一个不同的PAN ID,比如0x00F2

当一个灯泡接收到一个帧时,它会检查该帧的PAN ID。如果PAN ID与灯光控制网络的PAN ID匹配,灯泡就知道这个帧是给它的,并且会相应地处理它。如果PAN ID不匹配,灯泡会忽略该帧。

PAN ID的配置:
  • 静态配置:网络管理员可以在网络设置时手动分配PAN ID。
  • 动态配置:一些网络允许设备在加入时动态选择PAN ID,以避免冲突。
安全性和管理:
  • PAN ID必须谨慎管理,以确保网络的安全性和有效性。在开放或公共区域,确保不同的网络有不同的PAN ID是很重要的,以避免数据泄漏或无意间的交叉通信。

总的来说,PAN ID是无线个人区域网络中一个关键的组件,它允许多个网络在同一个物理区域内共存,同时保持通信的独立性和安全性。

短地址

在无线通信的MAC层中,短地址(Short Address)是分配给设备的一个简短的标识符,用于在个人区域网络(PAN)内部标识各个设备。与长地址(通常是64位的IEEE地址)相比,短地址只有16位长,这可以减少每个数据包的头部开销,节约带宽和设备处理能力,特别是在数据包大小有限的低速率无线通信中。

短地址的特点和用途:
  1. 简洁性

    • 16位的长度提供了足够的地址空间(最多65536个设备),在大多数小型到中型网络中是充分的。
  2. 效率

    • 使用短地址可以减小数据帧的大小,提高网络传输效率,尤其是在数据量较小和电池供电的设备中。
  3. 网络管理

    • 短地址在网络配置期间由协调器(如中心控制器或路由器)分配给加入网络的设备,使得网络管理更加集中和简单。
  4. 能耗

    • 在资源受限的无线传感器网络中,减少每个数据包的大小可以降低设备的能耗,延长电池寿命。
  5. 可扩展性

    • 虽然短地址的地址空间比长地址小,但它在很多情况下仍足够使用,并且允许网络根据需要进行灵活扩展。
短地址的配置和分配:
  • 静态分配:网络管理员可以手动设置和分配短地址,这在网络设备数量较少且固定的场景中是可行的。
  • 动态分配:在更复杂的网络中,短地址可以由网络的协调器动态分配。例如,在ZigBee网络中,设备在加入网络时会从协调器获取一个短地址。
使用场景举例:

在一个智能家居系统中,各种设备(如灯泡、传感器、开关)都会被分配一个短地址。例如:

  • 温度传感器可能被分配短地址 0x0010
  • 客厅的灯泡可能被分配短地址 0x0011
  • 门锁传感器可能被分配短地址 0x0012

当中心控制器需要控制这些设备时,它会在数据帧中指定目标设备的短地址,确保命令正确送达。例如,要关闭客厅的灯泡,控制器会发送一个帧,其目标地址字段设置为 0x0011

注意事项:

短地址的使用有助于优化网络性能,但也要注意避免地址冲突,并确保网络中没有重复的短地址。在网络规模较大时,可能需要转向使用长地址来保证地址的唯一性和可扩展性。

DW1000 中的 MAC 级别处理

这段话描述的是DW1000芯片(一款用于超宽带通信的集成电路)在发送和接收数据帧时与IEEE 802.15.4标准相关的操作。DW1000负责处理帧的某些物理层面的功能,但它不执行所有MAC层级的处理。以下是该描述的详细解释:

发送端操作:

  1. 发送帧控制

    • DW1000根据寄存器文件0x08中的TFLENTFLE字段指定的长度发送数据。这些字段定义了从TX_BUFFER发送的数据的长度。
  2. 帧校验序列(FCS)

    • 在发送数据时,DW1000会在数据有效载荷的末尾自动插入一个2字节的FCS。FCS用于在接收端验证数据的完整性。
  3. MAC层处理

    • DW1000不执行其他MAC层级的传输处理。这意味着,如果需要创建一个符合IEEE 802.15.4标准的完整MAC帧,这需要由主机系统的软件来完成。

接收端操作:

  1. 接收帧的验证

    • DW1000在接收端验证接收帧的FCS,以确保数据的正确性。
  2. 帧解析

    • DW1000能够解析符合IEEE 802.15.4-2011标准的帧,检查目的地址是否是广播地址,或者是否与设备配置的地址匹配。
  3. 地址信息寄存器文件

    • 接收帧的目的地址与寄存器文件0x01中的扩展唯一标识符和寄存器文件0x03中的PAN标识符和短地址进行匹配。
  4. 响应确认请求

    • DW1000可以选择对设置了确认请求位的数据帧或MAC命令帧作出响应,通过发送一个兼容IEEE 802.15.4-2011标准的确认帧。
  5. 数据帧的传送

    • DW1000将接收到的数据帧放入RX_BUFFER,并且数据长度由RXFLENRXFLE字段报告,这些字段位于寄存器文件0x10(接收帧信息寄存器)中。

额外的MAC级接收处理:

  • DW1000不执行除上述提到的以外的任何MAC级别的接收处理。因此,主机系统软件需要根据IEEE 802.15.4标准MAC定义正确解析接收到的帧,并执行任何必要的附加动作,如地址解析、重传逻辑或其他MAC命令的处理。

简而言之,DW1000提供基础的物理层发送和接收处理,但完整的MAC层功能,包括构建完整的MAC帧和执行标准规定的MAC层逻辑,需要由主机系统的软件实现。

CRC校验(循环冗余校验)

概述

CRC(循环冗余校验)是一种用于检测数据传输或存储中的错误的常用技术。它利用除法和余数的概念来检测错误,具体操作如下:

原理:
  1. 多项式表示

    • 数据和CRC均以多项式的方式表示。例如,二进制数 1101 可表示为多项式 (x3 + x2 + 1)。
  2. 生成多项式

    • 定义一个称为“生成多项式”的多项式。这是一个预先定义的多项式,用于生成CRC。
  3. 附加零

    • 在待校验数据后附加适当数量的零。这些零的数量通常等于生成多项式的阶数减一。
  4. 除法操作

    • 将扩展后的数据除以生成多项式。这里的除法是模2除法,即不考虑进位。
  5. 计算余数

    • 得到的余数即为CRC。余数的位数与生成多项式的阶数相同。
  6. 发送数据

    • 将原始数据和计算得到的CRC一起发送。
检测错误:

接收方收到数据后,会采取类似的步骤来检测错误:

  1. 除法

    • 将接收到的完整数据(包含CRC)除以同样的生成多项式。
  2. 判断余数

    • 如果余数为零,通常认为传输没有错误。
    • 如果余数不为零,则表明数据在传输过程中出现了错误。
特点:
  • 高效性:CRC能有效检测常见的错误类型,如单比特错误、双比特错误、奇数比特的错误等。
  • 易于实现:CRC可以通过硬件(如FPGA、ASIC)和软件实现。
  • 多样性:不同的生成多项式可用于不同的应用场景,以提高错误检测的特定性能。
应用:

CRC广泛应用于数据通讯、网络协议(如Ethernet、USB)和存储设备中,以确保数据的完整性和正确性。

实例

当然,我可以提供一个简单的CRC校验实例。让我们使用一个常见的CRC标准,比如CRC-8,它使用8位长的校验和。CRC-8有许多变种,但为了简单起见,我们将使用一个基本的版本,其生成多项式为 ( x8 + x2 + x + 1 )(通常表示为0x07)。

实例步骤:

  1. 选择生成多项式

    • 我们使用0x07作为生成多项式(在二进制中表示为0000 0111)。
  2. 选择原始数据

    • 假设我们要发送的数据是0xA5(在二进制中表示为1010 0101)。
  3. 附加零

    • 因为我们使用的是CRC-8,所以在数据的末尾附加8个零。现在数据变成了1010 0101 0000 0000。
  4. 执行除法

    • 使用模2除法将扩展后的数据(1010 0101 0000 0000)除以生成多项式(0000 0111)。
  5. 计算CRC

    • 得到的余数就是CRC值。假设余数是0011 0101(在十六进制中表示为0x35)。
  6. 发送数据

    • 最后,将原始数据和CRC一起发送。所以发送的完整数据是0xA5 0x35。
接收端校验:
  1. 接收数据

    • 假设接收端接收到的完整数据是0xA5 0x35。
  2. 计算CRC

    • 接收端同样使用生成多项式0x07对接收到的数据(不包括最后的CRC部分)进行CRC计算。
  3. 比较CRC

    • 如果计算出的CRC与接收数据中的CRC部分(0x35)相匹配,则认为数据传输无误。
  4. 处理结果

    • 如果CRC匹配,数据被接受;如果不匹配,数据被丢弃或请求重传。

这个例子非常基础,实际中CRC算法可能会有更多的变种和复杂性,例如不同的初始值、反转位序等。但基本原理是相似的:通过特定的生成多项式计算出一个校验值,然后用它来检测数据的完整性。

DWM1000中的CRC校验

这段话描述的是DW1000芯片(一种用于超宽带(UWB)通信的微波收发器)中内置的CRC(循环冗余校验)功能。这个功能对于确保数据传输的可靠性非常重要。以下是对这段话的详细解释:

  1. CRC生成功能

    • 在每次发送帧(即一组数据)的末尾,DW1000自动计算并附加一个16位的CRC帧校验序列(FCS)。这个CRC值是基于帧的内容计算的,用于检测数据在传输过程中是否发生了更改或错误。
  2. CRC校验功能

    • 在接收帧(接收到的数据)的过程中,DW1000同样会计算一个16位的CRC校验序列。然后,它会将这个计算出的CRC值与接收帧末尾的最后两个八位组(即原始发送方计算并附加的CRC)进行比较。
    • 如果计算出的CRC与接收帧中的CRC匹配,表示数据未被更改,接收数据是完整和正确的。
    • 如果CRC不匹配,通常意味着接收到的帧包含错误,这通常通过丢弃接收的帧来处理。
  3. 状态位报告

    • 在接收帧的过程结束后,DW1000会通过改变特定的状态位来报告CRC的比较结果。这些状态位包括RXDFR(表示帧接收结束),RXFCG(表示CRC匹配)或RXFCE(表示CRC不匹配)。
    • 这些状态位位于系统事件状态寄存器(0x0F)中。
  4. 关闭CRC功能

    • 在某些情况下,如果不需要CRC校验,可以通过设置系统控制寄存器(0x0D)中的SFCST位来禁用CRC的传输。
    • 这种情况可能发生在使用不同的MAC(媒体访问控制)层协议时,或者在需要最大化吞吐量(最小化响应时间)的情况下。

总之,DW1000芯片内置的CRC功能是为了确保数据在UWB通信过程中的完整性和正确性。自动计算和比较CRC值是检测和防止数据传输错误的关键步骤。

帧过滤

概述

帧过滤是网络设备用来确保只处理相关数据帧的一种机制,特别是在包含多个节点和复杂通信模式的网络中。这种机制在无线通信和以太网中尤为重要,可以大大提高网络效率和数据处理的准确性。下面是对帧过滤的详细解释:

基本概念
  1. 目的

    • 帧过滤的主要目的是让网络设备(如路由器、交换机、无线接收器)仅处理对它们来说重要的数据帧,同时忽略那些不相关或不符合特定条件的帧。
  2. 操作方式

    • 网络设备检查每个传入帧的头部信息,如源地址、目的地址、帧类型、安全设置等,以决定是否处理该帧。
帧过滤的关键因素
  1. 地址过滤

    • 最基本的帧过滤是基于MAC地址的。设备会检查每个帧的目的MAC地址,如果地址与设备的MAC地址不匹配,帧就被丢弃。
  2. 类型过滤

    • 设备可以根据帧中指示的协议或服务类型来决定是否接受该帧,例如,是否接受ARP请求、IP数据包、或其他特定类型的数据。
  3. 安全性过滤

    • 在某些配置中,帧过滤还会涉及到安全性检查,比如检查加密设置或身份验证信息是否符合网络策略。
实施帧过滤的设备
  1. 以太网交换机

    • 交换机使用帧过滤来确定哪个端口应该转发哪个帧。这依赖于目的地址和交换机的MAC地址表。
  2. 无线接入点

    • 无线网络中的接入点使用帧过滤来确保只处理发送到或来自其网络的帧,阻止其他网络的数据干扰。
  3. 路由器和安全设备

    • 路由器和防火墙等安全设备使用更复杂的帧过滤规则来控制网络流量,阻止不安全或不合规的数据传输。
帧过滤的重要性
  1. 提高效率

    • 通过仅处理相关的帧,网络设备可以减轻处理负担,提高数据传输效率。
  2. 增强安全性

    • 帧过滤有助于防止未授权访问和数据泄漏,提高网络安全。
  3. 流量管理

    • 帮助管理网络流量,确保数据流向正确的目的地,减少网络拥堵。

帧过滤是确保网络设备高效运行的关键功能,它通过筛选出无关的网络流量来减轻设备的处理负担,同时提高整个网络的性能和安全性。不同类型的网络设备和环境可能采用不同的帧过滤策略,但目标都是确保有效和安全地处理网络流量。

  • 这段话描述的是DW1000 IC(一种超宽带(UWB)微波收发器)中的帧过滤功能,这是一种重要的网络功能,尤其适用于遵循IEEE 802.15.4-2011标准的设备。以下是对这段话的详细解释:

帧过滤功能概述:

  1. 功能作用

    • DW1000 IC的帧过滤功能使设备能够解析接收数据中符合IEEE 802.15.4-2011标准的MAC编码的帧。它可以识别帧的类型和目标地址字段,并根据IC自身的地址信息进行比较,只接受符合过滤规则的帧。
  2. 接收模式和中断处理

    • 当帧过滤启用时,IC会进入接收模式,并且只有当符合帧过滤标准的帧到达时,才会中断主处理器。这减少了无关帧的处理,提高了效率。
  3. 禁用帧过滤的行为

    • 如果帧过滤被禁用,所有具有良好CRC的帧都会被接受。在这种情况下,主机通常会被具有事件状态的帧中断,这表明已经接收到具有良好CRC的帧。相关事件状态位(如RXDFR和RXFCG)在系统事件状态寄存器(0x0F)中被设置。

配置和控制:

  1. 帧寄存器配置

    • FFEN(Frame Filtering Enable)配置位在系统配置寄存器(0x04)中启用帧过滤。启用此功能后,帧过滤规则就会生效。
  2. 精细过滤控制

    • 除了FFEN位之外,系统配置寄存器还包含七个额外的配置位(FFAB、FFAD、FFAA、FFAM、FFAR、FFA4和FFA5)。这些位用于帧类型的精细过滤控制,允许用户更详细地指定哪些类型的帧应该被接受或忽略。

应用重要性:

  • 这种帧过滤机制对于确保在诸如UWB通信这类应用中的数据效率和安全性至关重要。它允许设备只处理相关的通信,从而提高了性能,并减少了不必要的数据处理和潜在的安全风险。

总结来说,DW1000 IC的帧过滤功能是一个强大的工具,用于确保设备只处理对其自身网络操作相关的帧。这不仅提高了网络通信的效率,也增强了安全性和可靠性。通过精细的过滤控制,用户可以精确地指定哪些类型的帧应被处理,哪些应被忽略。

  • 这段话描述的是在DW1000 IC中实现的帧过滤功能的具体规则。这些规则定义了在启用帧过滤时,哪些类型的帧将被接受或拒绝。帧过滤是基于一系列的条件,这些条件涉及帧的类型、版本、目的地PAN ID、目的地地址、源PAN ID以及帧校验序列(FCS)的正确性。下面是对这些规则的详细解释:

1. 帧类型接受规则:

- **FFAB配置位**:必须设置以允许接收信标帧。
- **FFAD配置位**:必须设置以允许接收数据帧。
- **FFAA配置位**:必须设置以允许接收确认帧。
- **FFAM配置位**:必须设置以允许接收MAC命令帧。
- **FFAR配置位**:允许接收IEEE 802.15.4保留类型4到7的帧,但这些帧可能会因帧长度检查而被拒绝。
- **FFA4和FFA5配置位**:分别允许接收保留类型4和5的帧,但同样可能因帧长度检查而被拒绝。

注意,保留帧类型4到7的处理有特殊性。如果帧被识别为类型0到3,将根据帧的实际长度进行处理。如果帧长度不符合预期,它将被拒绝。

2. 帧版本字段:

- 帧版本字段必须是0x00或0x01,这是对帧格式版本的要求。

3. 目的地PAN ID:

- 目的地PAN ID(如果存在)必须是广播PAN ID(0xFFFF),或者与设备配置中的PAN_ID匹配。

4. 目的地地址:

- 目的地地址(如果存在)可以是广播地址(0xFFFF),或者是与设备配置中的SHORT_ADDR匹配的短地址,或者是与设备配置的长地址匹配。

5. 源PAN ID:

- 如果帧是信标帧,源PAN ID必须与设备配置中的PAN_ID匹配(或者是0xFFFF)。
- 在数据帧或MAC命令帧中,如果只有源地址存在,且IC被配置为协调器(通过FFBC配置位设置),则源PAN ID也必须与设备配置中的PAN_ID匹配。

6. FCS(帧校验序列):

- FCS(通常是CRC)必须正确,以确保帧的完整性和正确性。

这些规则确保了DW1000 IC能够有效地处理传入的帧,只接受那些符合其配置和网络协议要求的帧,从而提高了网络的效率和安全性。通过这种方式,设备可以过滤掉不相关或潜在有害的网络流量,只处理对其操作有意义的数据。

这段话进一步详细说明了DW1000 IC的帧过滤功能,特别是它如何处理安全启用字段和对非法帧的处理方式。下面是对这些方面的详细解释:

安全启用字段的处理:

  1. 帧过滤与安全信息
  • 在帧控制过程中,帧过滤机制不会注意到安全启用字段。这意味着任何与安全相关的信息(如加密和身份验证数据)不会由DW1000 IC的硬件帧过滤功能处理。
  • 相反,这些安全信息需要由主机软件来解码。主机软件负责处理安全信息,并根据这些信息决定接受或拒绝帧。
  1. 启用安全性字段的详细信息
  • 有关启用安全性字段的更多细节可以在相关文档的特定部分(如11.2.2节)中找到。

非法帧控制的处理:

  1. 帧控制八比特组的解码
  • 对于接收到的帧,其合法性是在前两个八位组(即帧控制字段)的数据解码之后进行判断的。
  • 这个判断是在接收到所有与地址有关的字段之后进行的,这些地址字段由帧控制八比特组指定。
  1. 帧被拒绝的情况
  • 如果一个帧因不符合帧过滤规则而被判定为非法,其接收会立即中止。
  • 这种拒绝情况会通过系统事件状态寄存器(0x0F)中的AFFREJ事件位来报告。

能源效率考虑:

  • 尽管帧过滤可以减少主机系统的工作负载,但使用DW1000 IC进行长时间的监听是一个相对耗电的活动。因此,最好只在连接到主电源的设备上使用此功能。

帧过滤相关配置:

  • 与帧过滤相关的所有配置位都位于系统配置寄存器文件(0x04)中。这意味着用户可以通过修改这个寄存器来自定义帧过滤的行为,以适应特定的应用需求。

总之,DW1000 IC提供的帧过滤功能是一个强大的工具,它可以根据预设的规则自动处理接收到的帧。然而,对于安全相关的内容,如加密和身份验证,需要主机软件介入进行处理。此外,虽然帧过滤有助于减轻主机处理负担,但长时间使用接收功能可能会增加能源消耗。因此,使用此功能时需要权衡能源效率。

实例

在一个使用UWB(Ultra-Wideband)技术和DWM1000模块的应用中,帧过滤功能可以用来确保设备只处理来自特定源或符合特定标准的数据。这对于提高网络效率和减少不必要的数据处理非常重要。让我们通过一个具体的例子来了解这个概念。

场景假设:

假设您正在开发一个基于UWB技术的室内定位系统,该系统由多个锚点(Anchor)和标签(Tag)组成。锚点固定在已知位置,而标签附着在需要追踪的对象上。DWM1000模块用于这些锚点和标签之间的通信。

目标:
  • 系统的目的是让锚点只处理来自特定标签的数据,从而计算它们与这些标签之间的距离。
帧过滤配置:
  1. 帧类型过滤

    • 锚点配置为只接收数据帧。这是因为在定位系统中,重要的信息(如距离测量)通常包含在数据帧中。
  2. 地址过滤

    • 每个锚点配置为只接收来自已知标签的帧。这可以通过在帧过滤配置中指定标签的短地址或长地址来实现。
  3. PAN ID过滤

    • 锚点配置为只接收具有系统PAN ID的帧,以确保它们只处理来自同一网络内设备的数据。
实例操作:
  • 标签定期发送包含其位置数据的数据帧。
  • 当锚点收到帧时,它们首先检查帧是否符合其帧过滤设置:是否是数据帧,是否包含已知标签的地址,以及是否具有正确的PAN ID。
  • 如果帧满足所有这些条件,锚点则处理该帧并使用其中的数据来计算与标签的距离。
  • 任何不符合这些条件的帧(如来自未知标签、错误类型的帧或错误PAN ID的帧)都会被锚点忽略。

通过这种方式,UWB室内定位系统中的帧过滤功能有助于确保锚点只处理对定位计算有用的数据,同时忽略所有不相关或潜在干扰的信号。这不仅提高了系统的整体效率,还减少了错误数据处理的可能性。

自动确认

这段代码是一个基于DW1000 IC的UWB(超宽带)通信的应用实例。在这个代码片段中,MAC(媒体访问控制)层的特征体现在几个关键部分,主要涉及到数据帧的构建、配置和处理。下面是这些部分的详细解释:

帧结构和初始化

  1. 帧结构设置 (BPhero_UWB_Message_Init 函数):
  • 在这个函数中,设置了数据帧(msg_f_send)的不同字段,这是MAC层处理的一个关键方面。这包括帧控制字段(frameCtrl)、序列号(seqNum)、PAN ID(panID)、目标地址(destAddr)和源地址(sourceAddr)。这些字段都是MAC头部的一部分,它们在帧传输和接收过程中起着关键作用。
  1. 安全设置
  • 虽然代码中没有直接体现安全设置,但MAC层通常负责处理帧中的安全特性,如加密和认证。

网络配置

  1. DWM1000配置 (BPhero_UWB_Init 函数):
  • 这个函数中包含DWM1000模块的初始化和配置,这涉及到物理层(PHY)的配置,如信道设置、脉冲重复频率、前导码长度等。虽然这些主要属于物理层,但它们对MAC层的性能和行为有直接影响。
  1. 中断设置
  • 配置中断来处理接收到的帧(如通过dwt_setinterrupt函数)是MAC层的一个重要功能,它确保了在接收到有效帧时能及时响应。

功率计算

  • calculatePowerdwGetReceivePower 函数涉及到接收信号的功率计算。这更偏向于物理层的处理,但是在MAC层中,接收到的信号强度有时也用于做出决策,如信号质量评估和链路质量指示(LQI)。

MAC层的作用

  • 在UWB通信和类似的无线技术中,MAC层主要负责管理如何在共享媒体上发送和接收数据帧。这包括决定何时发送帧、如何处理接收到的帧、帧的地址处理、重传机制和可能的冲突避免策略。
  • MAC层也会与物理层紧密协作,以确保数据的有效传输和接收。

总之,虽然这段代码主要涉及到帧的结构和物理层配置,但它也展示了MAC层的一些基本功能,特别是在帧的构建和基础网络配置方面。

在这段代码中,虽然没有直接实现整个MAC层,但有几个地方体现了MAC层的相关功能:

  1. 帧过滤 (dwt_enableframefilter):
dwt_enableframefilter(DWT_FF_DATA_EN);

这一部分的代码启用了DW1000的帧过滤功能,这是MAC层的一个典型特性。帧过滤用于确定哪些接收到的帧是有效的,需要处理,哪些应该被忽略。

  1. 回调函数设置 (bphero_setcallbacks):
bphero_setcallbacks(Simple_Rx_Callback);

在这里,代码设置了一个接收回调函数Simple_Rx_Callback,这在MAC层通常用于处理接收到的帧。

  1. 处理接收到的帧 (Simple_Rx_Callback 函数):
    这个回调函数处理接收到的帧,执行了一些MAC层可能执行的任务,如读取帧长度,解析帧内容,并对不同类型的消息进行不同的处理。例如,它检测帧类型,提取和发送时间戳,以及计算飞行时间(ToF),这些都是在MAC层进行的操作。

  2. 读取和清除状态寄存器:

status_reg = dwt_read32bitreg(SYS_STATUS_ID);
dwt_write32bitreg(SYS_STATUS_ID, (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR));

这里的代码通过读取和写入状态寄存器来检查帧传输和接收状态。在MAC层,这是用来确定是否成功接收帧和是否需要处理错误。

  1. 传输控制:
dwt_starttx(DWT_START_TX_IMMEDIATE);

这个命令使DW1000开始发送数据。在MAC层,控制何时开始发送数据是一个重要的功能。

  1. 序列号和地址处理:
msg_f_send.seqNum = msg_f->seqNum;

这部分代码涉及到MAC地址和序列号的处理,这是MAC层负责的帧头信息的一部分。

  1. 时间戳管理 (get_rx_timestamp_u64):
poll_rx_ts = get_rx_timestamp_u64();

时间戳在UWB通信中至关重要,尤其是在时基准准确性要求极高的定位应用中。在MAC层,时间戳通常用于帧同步和延迟测量。

这段代码主要围绕着DW1000设备的驱动和接口进行,而MAC层的实现通常依赖于此类底层驱动来执行其功能。这里的实现更多的是在应用层面上,利用DW1000提供的接口来模拟MAC层的某些行为,而不是一个完整的MAC层协议栈。

在提供的代码中,MAC(媒体访问控制)层的特性主要体现在以下几个方面:

  1. 帧过滤 (dwt_enableframefilter):
dwt_enableframefilter(DWT_FF_RSVD_EN);//disable recevie
dwt_enableframefilter(DWT_FF_DATA_EN);

这些调用启用或禁用DW1000的帧过滤功能。帧过滤是MAC层功能之一,用于决定设备应接收还是忽略传入的无线帧。

  1. 状态寄存器检查 (dwt_read32bitreg):
status_reg = dwt_read32bitreg(SYS_STATUS_ID);

状态寄存器的检查用于识别是否有有效的帧被接收或是否有传输完成的情况,这与MAC层管理帧的发送和接收状态有关。

  1. 回调函数 (bphero_setcallbacks):
bphero_setcallbacks(Tx_Simple_Rx_Callback);

这个函数设置了一个接收回调函数,这是MAC层常用的机制,用于在接收到数据帧后执行特定的处理过程。

  1. 处理和响应MAC帧 (Tx_Simple_Rx_Callback 函数):
    在这个回调函数中,代码处理接收到的帧,并根据帧内容(如消息类型标记)执行相应的动作。例如,它会检查SYS_STATUS_RXFCG标志来确定是否收到正确的帧,这类似于MAC层的行为。

  2. 发送和接收时间戳的管理:
    诸如poll_tx_tsresp_rx_tsfinal_tx_ts这些变量和相关的函数(如get_tx_timestamp_u64get_rx_timestamp_u64)管理与时间戳相关的操作,这在实现同步通信时是MAC层的重要功能之一。

  3. 发送帧的准备和启动:

dwt_writetxdata(12,(uint8 *)&msg_f_send, 0);
dwt_writetxfctrl(12, 0);
dwt_starttx(DWT_START_TX_IMMEDIATE);

这部分代码负责准备数据帧并启动传输,这在MAC层中是发送数据的基础活动。

  1. 清除状态标志并重新启用接收:
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);

在数据传输完成后,代码清除传输标志并重新启用接收,以准备下一个接收过程,这是MAC层控制媒体访问的例子。

这些元素并没有实现一个完整的MAC层协议,但它们确实反映了MAC层在管理无线通信过程中的角色,尤其是在DW1000这类UWB设备中的应用。

MAC层消息——代码示例

超宽带(UWB)通信的MAC层消息

void BPhero_UWB_Message_Init(void)
{
    // 初始化UWB消息的函数
    // 设置帧控制字段的类型、安全启用、帧待处理、需要确认、PAN ID压缩
    msg_f_send.frameCtrl[0] = 0x1 /* 帧类型为数据帧 */ | 0x40 /* 启用PAN ID压缩 */ | 0x20 /* 请求ACK */;
    // 设置源地址和目的地址的模式以及帧版本
    msg_f_send.frameCtrl[1] = 0x8 /* 目的地址为16位 */ | 0x80 /* 源地址为16位 */;
    // 设置PAN ID
    msg_f_send.panID[0] = 0xF0;
    msg_f_send.panID[1] = 0xF0;

    // 设置序列号
    msg_f_send.seqNum = 0;
    // 设置消息数据中的测距编号
    msg_f_send.messageData[POLL_RNUM] = 3; // 设置新的测距编号
    // 设置消息功能代码为锚点轮询
    msg_f_send.messageData[FCODE] = RTLS_DEMO_MSG_ANCH_POLL; // 消息功能码(指定消息是轮询、响应还是其他类型)
    // 计算PSDU长度
    psduLength = (TAG_POLL_MSG_LEN + FRAME_CRTL_AND_ADDRESS_S + FRAME_CRC);
    // 再次设置序列号,并准备递增
    msg_f_send.seqNum = 0; // 复制序列号然后递增
    // 设置源地址
    msg_f_send.sourceAddr[0] = SHORT_ADDR & 0xFF; // 复制地址的低8位
    msg_f_send.sourceAddr[1] = (SHORT_ADDR >> 8) & 0xFF; // 复制地址的高8位

    // 设置目的地址
    msg_f_send.destAddr[0] = 0x01;  // 设置目的地址(广播地址为0xffff)
    msg_f_send.destAddr[1] = 0x01;  // 设置目的地址(广播地址为0xffff)
}

这段代码是一个函数,用于初始化一个用于超宽带(UWB)通信的MAC层消息,特别是在使用16位地址的距离测量(ranging)应用中。函数BPhero_UWB_Message_Init设置了消息的不同参数,包括帧控制字段、PAN ID、序列号、消息数据、PSDU长度和地址信息。这里是每一步的详细解释:

  1. 帧控制字段的设置

    • msg_f_send.frameCtrl[0]:设置帧类型为数据帧(0x01),启用PAN ID压缩(0x40),表示源和目的PAN ID相同,并请求接收方发送ACK(0x20)。
  2. 地址模式和帧版本

    • msg_f_send.frameCtrl[1]:设置目的地址模式为16位(0x08),源地址模式也为16位(0x80)。这表明帧中将包含16位的源和目的地址。
  3. PAN ID的设置

    • msg_f_send.panID:设定PAN ID为0xF0F0。这是网络的唯一标识符。
  4. 序列号

    • msg_f_send.seqNum:初始化序列号为0。在后续通信中,每发送一个帧,这个序列号通常会增加。
  5. 消息数据的设置

    • msg_f_send.messageData[POLL_RNUM]:将测距编号设为3,这个值用于标记测距过程中的特定步骤或轮次。
    • msg_f_send.messageData[FCODE]:设置帧的功能代码为锚点轮询(RTLS_DEMO_MSG_ANCH_POLL),这表明该帧是一个用于测距过程的轮询帧。
  6. PSDU长度的计算

    • psduLength:计算整个PSDU的长度,包括标签轮询消息长度、帧控制和地址大小以及帧校验序列(FCS)的长度。
  7. 地址的设置

    • msg_f_send.sourceAddr:设置源地址。这里使用了宏SHORT_ADDR,它应该是定义在其他地方的源设备的16位地址。源地址被分成两部分,每部分一个字节,低字节先行。
    • msg_f_send.destAddr:设置目的地址。此处代码将目的地址设置为0x0101,但注释中提到广播地址为0xffff,可能表示这里应该是用于特定设备的地址或者这是一个示例值。

综上,这个函数的目的是设置一个MAC层数据帧,用于在UWB网络中发起距离测量过程。代码中设定的参数和值将根据实际应用的需要进行调整。

,并请求接收方发送ACK(0x20)。

  1. 地址模式和帧版本

    • msg_f_send.frameCtrl[1]:设置目的地址模式为16位(0x08),源地址模式也为16位(0x80)。这表明帧中将包含16位的源和目的地址。
  2. PAN ID的设置

    • msg_f_send.panID:设定PAN ID为0xF0F0。这是网络的唯一标识符。
  3. 序列号

    • msg_f_send.seqNum:初始化序列号为0。在后续通信中,每发送一个帧,这个序列号通常会增加。
  4. 消息数据的设置

    • msg_f_send.messageData[POLL_RNUM]:将测距编号设为3,这个值用于标记测距过程中的特定步骤或轮次。
    • msg_f_send.messageData[FCODE]:设置帧的功能代码为锚点轮询(RTLS_DEMO_MSG_ANCH_POLL),这表明该帧是一个用于测距过程的轮询帧。
  5. PSDU长度的计算

    • psduLength:计算整个PSDU的长度,包括标签轮询消息长度、帧控制和地址大小以及帧校验序列(FCS)的长度。
  6. 地址的设置

    • msg_f_send.sourceAddr:设置源地址。这里使用了宏SHORT_ADDR,它应该是定义在其他地方的源设备的16位地址。源地址被分成两部分,每部分一个字节,低字节先行。
    • msg_f_send.destAddr:设置目的地址。此处代码将目的地址设置为0x0101,但注释中提到广播地址为0xffff,可能表示这里应该是用于特定设备的地址或者这是一个示例值。

综上,这个函数的目的是设置一个MAC层数据帧,用于在UWB网络中发起距离测量过程。代码中设定的参数和值将根据实际应用的需要进行调整。

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YRr YRr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值