公司动态

AM572x高速SD/eMMC接口时序详解:SDR50/SDR104/DDR50模式配置与调试

📅 2026/7/24 17:25:54
AM572x高速SD/eMMC接口时序详解:SDR50/SDR104/DDR50模式配置与调试
1. 项目概述与核心价值在嵌入式系统尤其是基于TI AM572x这类高性能异构处理器的设计中高速存储接口的稳定性往往是决定产品成败的关键细节之一。很多工程师在调试SD卡或eMMC时会遇到一些“玄学”问题在低速模式下一切正常一旦切换到SDR50、SDR104或DDR50等高速模式系统就变得不稳定时而读写失败时而甚至无法识别设备。这些问题十有八九根源于接口的时序参数没有配置正确。AM572x的数据手册Datasheet里关于MMC接口的时序章节内容详实但信息密度极高对于不常接触高速信号设计的工程师来说就像一本天书。里面充斥着各种以“SDR50x”、“DDR50x”命名的参数以及建立时间Setup Time、保持时间Hold Time、时钟脉冲宽度等专业术语。如果只是照猫画虎地填几个寄存器值而不理解这些数字背后的物理意义和约束条件那么在复杂的PCB板级环境下几乎必然会踩坑。这篇文章我就结合自己多次在AM572x平台上调试高速SD卡和eMMC的经验把MMC1接口在SDR50、SDR104和DDR50这三种关键高速模式下的时序参数掰开揉碎了讲清楚。我们不止看手册上“是什么”更要深究“为什么”这么规定以及在实际的硬件设计和软件配置中“怎么做”才能满足这些要求。无论你是正在画AM572x核心板的硬件工程师还是负责底层驱动开发的软件工程师理解这些内容都能帮助你从根本上规避信号完整性问题让你的存储系统跑得既快又稳。2. 高速MMC接口时序基础概念解析在深入AM572x的具体参数之前我们必须先建立一套关于数字接口时序的基础认知框架。这就像学武功要先扎马步基础不牢后面看任何参数表格都只是雾里看花。2.1 核心时序关系建立时间与保持时间所有同步数字接口通信的基石就是建立时间tsu, Setup Time和保持时间th, Hold Time这两个概念。它们定义了一个数据信号或命令信号相对于采样时钟边沿必须保持稳定的时间窗口。想象一下时钟信号mmc1_clk是一个严格的考官它只在上升沿或下降沿那一刻“阅卷”——也就是采样数据线mmc1_dat或命令线mmc1_cmd上的电平。为了保证采样正确数据必须在考官到来之前就已经准备好并保持稳定这个提前准备好的时间就是建立时间。考官阅卷后数据还不能立刻改变需要再保持稳定一小段时间以确保采样电路能可靠地锁存这个值这段时间就是保持时间。在AM572x的语境下作为主机Host的处理器和作为从设备Device的SD卡/eMMC它们互为信号的发送者和接收者。因此时序要求是双向的接收模式Receiver ModeAM572x作为接收方SD卡发送数据。此时AM572x对SD卡发出的数据和命令信号有建立时间和保持时间的要求。手册中的tsu(cmdV-clkH)这类参数就是描述这个要求。发送模式Transmitter ModeAM572x作为发送方SD卡接收数据。此时AM572x需要保证自己发出的信号在SD卡的输入端能满足SD卡规格书所要求的建立和保持时间。手册中的td(clkL-cmdV)这类输出延迟参数就是用来调整AM572x自身发送时序的。2.2 时钟信号的关键参数时钟是同步系统的节拍器它的质量直接决定了通信的极限。操作频率fop(clk)这是最直观的参数如SDR50是96MHzSDR104是192MHzDDR50是48MHz。但要注意DDR50虽然时钟频率是48MHz但由于是在时钟的上升沿和下降沿都采样数据其有效数据传输率等同于96MHz SDR故名DDR双倍数据速率。脉冲宽度tw(clkH)/tw(clkL)指时钟信号高电平和低电平的持续时间。手册中通常给出一个基于时钟周期P的计算公式例如0.5*P - 0.185 ns。这个公式意味着在一个理想的50%占空比时钟基础上允许有一个微小的偏差这里是0.185ns。这个偏差来自于芯片内部PLL和时钟树产生的抖动Jitter以及输出驱动器的性能限制。2.3 延迟参数与IO延迟补偿这是AM572x等现代处理器中非常关键且强大的一个功能。参数如td(clkL-cmdV)表示从时钟下降沿到命令信号有效跳变之间的延迟。这个值可以是负的如-3.66ns这意味着命令信号的跳变可以发生在时钟下降沿之前这听起来有违直觉但却是解决高速时序问题的核心手段。它通过芯片内部的可编程延迟单元通常称为DLL或可配置延迟线来实现。我们可以主动在数据/命令路径上插入延迟A_DELAY针对输出或在采样时钟路径上插入延迟G_DELAY针对输入以此来“挪动”信号在时间轴上的位置从而让信号的边缘精准地落入接收端的采样窗口中央。AM572x手册中提到的Virtual IO Timing Modes和Manual IO Timing Modes其本质就是提供不同颗粒度和灵活性的延迟配置方式来满足不同速度等级模式下的时序裕量要求。不理解这一点就无法真正驾驭高速接口的配置。2.4 SDR与DDR的本质区别这是选择模式时必须理解的概念。SDRSingle Data Rate仅在时钟的上升沿对于MMC接口采样数据。SDR50和SDR104都属于此类区别主要在于时钟频率和对应的时序严格程度。DDRDouble Data Rate在时钟的上升沿和下降沿都采样数据。DDR50模式就是典型代表。这带来一个关键变化时序参数参考的时钟边沿从单一的上升沿clkH变成了时钟的跳变沿clk包括上升和下降。因此在DDR模式下建立和保持时间的要求是相对于任何一个时钟跳变沿来定义的这对信号完整性特别是时钟的占空比提出了更高要求。3. AM572x MMC1接口三大高速模式时序详解有了前面的理论基础我们现在可以直面AM572x数据手册文档号ZHCSG49F中那些令人望而生畏的表格了。我会把表格中的关键参数提取出来并附上我的解读和实战注意事项。3.1 SDR50模式时序剖析SDR50模式是UHS-I SD卡支持的第一档高速模式时钟频率为96MHz周期约10.42ns。在这个速度下时序窗口已经变得很窄需要仔细对待。表7-98. MMC1 - SD卡SDR50模式时序要求接收模式参数编号参数描述模式最小值 (ns)最大值 (ns)单位SDR503tsu(cmdV-clkH)命令建立时间-1.72-nsSDR504th(clkH-cmdV)命令保持时间-1.6-nsSDR507tsu(dV-clkH)数据建立时间-1.72-nsSDR508th(clkH-dV)数据保持时间Pad/Internal Loopback1.6-ns解读与实战要点接收方视角这张表定义了当SD卡发送数据/命令给AM572x时AM572x作为接收方要求信号必须满足的条件。SDR503要求命令信号在时钟上升沿到来前至少稳定1.72nsSDR504要求命令信号在时钟上升沿之后至少保持1.6ns。关键挑战在96MHz下一个时钟周期才10.42ns。留给数据稳定的有效窗口周期减去建立保持时间非常短。这意味着PCB走线的长度偏差、过孔阻抗不连续等因素引入的微小延迟都可能导致时序违规。Loopback模式SDR508提到了“Pad Loopback Clock”和“Internal Loopback Clock”。这是AM572x用于采样输入数据的时钟源选项。Internal Loopback是使用芯片内部产生的时钟直接采样延迟最小但对时钟质量要求高。Pad Loopback是使用从引脚反馈回来的时钟采样可以抵消一部分PCB走线延迟常用于更高速度或信号完整性较差的情况。在SDR50下两者保持时间要求相同。表7-99. MMC1 - SD卡SDR50模式开关特性发送模式参数编号参数描述最小值 (ns)最大值 (ns)单位SDR501fop(clk)时钟频率96MHzSDR502Htw(clkH)时钟高脉冲宽度0.5*P - 0.185nsSDR502Ltw(clkL)时钟低脉冲宽度0.5*P - 0.185nsSDR505td(clkL-cmdV)命令输出延迟-3.661.46nsSDR506td(clkL-dV)数据输出延迟-3.661.46ns解读与实战要点发送方视角这张表定义了AM572x作为发送方时其输出信号的特性。SDR505和SDR506是核心可配置参数。它告诉我们AM572x可以调整其命令和数据信号相对于时钟下降沿的延迟范围从提前3.66ns到推后1.46ns。负延迟的意义为什么可以提前这利用了时钟和数据在PCB走线上传播速度相同的原理。如果我将数据信号提前发出而时钟信号在PCB上走线更长延迟更大那么到达SD卡接收端时数据信号可能刚好满足SD卡所需的建立时间。这个调整能力是解决时序问题的关键。如何配置这个延迟范围就是通过配置前面提到的A_DELAY值来实现的。我们需要根据实际的PCB布局和SD卡型号在这个范围内找到一个最优值。通常建议从默认值可能是0附近开始通过读写压力测试逐步调整。3.2 SDR104模式时序剖析SDR104是UHS-I SD卡的巅峰性能模式时钟频率高达192MHz周期仅约5.21ns。此时时序裕量已经非常紧张对硬件设计和软件配置的要求都极为苛刻。表7-100. MMC1 - SD卡SDR104模式开关特性参数编号参数描述最小值 (ns)最大值 (ns)单位SDR1041fop(clk)时钟频率192MHzSDR1042H/Ltw(clkH/L)时钟脉冲宽度0.5*P - 0.185nsSDR1045td(clkL-cmdV)命令输出延迟-1.090.49nsSDR1046td(clkL-dV)数据输出延迟-1.090.49ns解读与实战要点更严苛的窗口对比SDR50SDR104的时钟周期缩短了一半。虽然输出延迟的可调范围-1.09ns ~ 0.49ns也变小了但这意味着每一步调整的精度要求更高。可用的时序窗口Skew Budget被极度压缩。必须使用Manual/Virtual Mode在192MHz下几乎必须启用AM572x的Manual IO Timing Mode或Virtual IO Timing Mode并精细配置延迟参数。依赖芯片的默认设置很难稳定工作。硬件要求极高PCB设计必须严格控阻抗通常50ΩMMC_CLK与MMC_CMD/DATA走线必须等长误差建议控制在5mil约0.127mm以内。需要完整的参考平面避免跨分割。电源质量为MMC接口供电的LDO噪声必须极低纹波要小。时钟信号的抖动Jitter会成为性能瓶颈。器件选型SD卡座本身的质量、连接器的触点电阻都会产生影响。务必选择品牌好、结构稳定的卡座。3.3 DDR50模式时序剖析DDR50模式时钟频率为48MHz但通过双边沿采样实现96Mbps的有效数据率。其时序分析思维需要从SDR的“单一边沿”切换到“双边沿”。表7-101. MMC1 - SD卡DDR50模式时序要求接收模式参数编号参数描述模式最小值 (ns)最大值 (ns)单位DDR505tsu(cmdV-clk)命令建立时间-1.79-nsDDR506th(clk-cmdV)命令保持时间-1.6-nsDDR507tsu(dV-clk)数据建立时间Pad/Internal Loopback1.79-nsDDR508th(clk-dV)数据保持时间Pad/Internal Loopback1.6-ns表7-102. MMC1 - SD卡DDR50模式开关特性发送模式参数编号参数描述最小值 (ns)最大值 (ns)单位DDR500fop(clk)时钟频率48MHzDDR501/502tw(clkH/L)时钟脉冲宽度0.5*P - 0.185nsDDR503td(clk-cmdV)命令输出延迟1.2256.6nsDDR504td(clk-dV)数据输出延迟1.2256.6ns解读与实战要点参考边沿变化请注意所有参数都是相对于clk时钟跳变沿而不是clkH时钟上升沿。这意味着建立和保持时间需要同时在时钟的上升沿和下降沿得到满足。输出延迟为正一个显著区别是DDR50模式的输出延迟DDR503,DDR504最小值是正的1.225ns没有负值。这意味着AM572x在DDR模式下其数据/命令信号的跳变被设计为总是发生在时钟跳变沿之后。这通常与DDR采样的电路结构有关。时钟占空比至关重要由于双边沿采样时钟的高电平和低电平时间必须尽可能对称50%占空比。tw(clkH)和tw(clkL)的公式虽然允许0.185ns的偏差但在实际中应尽力优化。差的占空比会直接压缩其中一个沿的采样窗口。信号完整性挑战虽然频率只有48MHz但数据率是96Mbps信号跳变更加频繁。需要关注信号的回流路径、串扰特别是数据线之间的串扰因为任何振铃或过冲都可能干扰相邻比特位的采样。4. 时序参数配置实战从理论到寄存器理解了参数含义最终要落到如何配置AM572x的寄存器上。手册中提到了两种主要方式Virtual IO Timing Modes 和 Manual IO Timing Modes。这里我以最常用的Manual Mode为例讲解如何将时序参数转化为具体的配置值。4.1 解读Manual Functions Mapping表手册中的表7-104是MMC1接口在DDR50和SDR104模式下Manual配置的“秘籍”。我们截取关键部分来分析BallBall NameMMC1_DDR_MANUAL1MMC1_SDR104_MANUAL1CFG REGISTERMUXMODEA_DELAY (ps)G_DELAY (ps)A_DELAY (ps)G_DELAY (ps)W6mmc1_clk1076330--W6mmc1_clk12710600400Y6mmc1_cmd7220--Y6mmc1_cmd0000Y6mmc1_cmd0000AA6mmc1_dat07510--AA6mmc1_dat00000AA6mmc1_dat0200300A_DELAY (ps)这是输入/输出路径上的延迟值单位是皮秒ps。1 ns 1000 ps。这个值会直接写入对应CFG寄存器的特定位域。G_DELAY (ps)这是全局延迟或分组延迟通常与时钟路径或延迟线的全局设置相关。寄存器分类CFG_MMC1_*_IN配置该引脚作为输入时的延迟。主要用于调整采样时刻满足接收时序如tsu,th。CFG_MMC1_*_OUT配置该引脚作为输出时的延迟。主要用于调整输出信号的时序满足发送时序如td。CFG_MMC1_*_OEN输出使能Output Enable信号的延迟。在双向数据线上控制从输入切换到输出状态的时机对于避免总线冲突很重要。模式选择表格提供了MMC1_DDR_MANUAL1和MMC1_SDR104_MANUAL1两套预定义的延迟值。TI的工程师已经计算好了这两组值使其分别满足DDR50和SDR104模式的时序要求。在大多数情况下我们直接采用这些推荐值即可。4.2 配置步骤与代码示例在AM572x的Linux内核如TI的Processor SDK中这些配置通常在设备树Device Tree中完成。以下是一个概念性的示例展示如何为MMC1接口应用SDR104的Manual Timing Mode/* 在设备树源文件 (.dts) 中 */ mmc1 { status okay; bus-width 4; max-frequency 192000000; /* SDR104 频率 */ cap-sd-highspeed; sd-uhs-sdr104; /* 声明支持SDR104模式 */ /* 关键启用并配置Manual IO Timing Mode */ pinctrl-names default, sdr104; pinctrl-0 mmc1_pins_default; /* 默认引脚复用 */ pinctrl-1 mmc1_pins_sdr104; /* SDR104专用时序引脚配置 */ /* 指定使用SDR104对应的manual mode */ ti,needs-special-hs-handling; /* 在对应的pinctrl配置中会引用到手册中A_DELAY/G_DELAY值转换后的寄存器设置 */ }; /* 引脚控制配置 */ dra7_pmx_core { mmc1_pins_sdr104: mmc1_pins_sdr104 { pinctrl-single,pins /* 配置CLK引脚W6, MUXMODE 0, 使用SDR104的OUT配置 */ DRA7XX_CORE_IOPAD(0x3754, PIN_OUTPUT_PULLUP | MUX_MODE0) /* mmc1_clk */ /* 寄存器值 (0x3754) 的配置需要根据手册计算 * 例如对于CFG_MMC1_CLK_OUTA_DELAY600ps, G_DELAY400ps。 * 需要查阅TRM将ps值转换为寄存器位域值。 * 通常SDK的pinmux工具或已有参考设计会提供这个值。 */ DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd */ DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0 */ DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1 */ DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2 */ DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3 */ ; }; };核心操作上述设备树配置的关键在于pinctrl-1引用的mmc1_pins_sdr104。这里的DRA7XX_CORE_IOPAD宏的第二个参数最终会生成写入对应CFG_MMC1_*_OUT/IN寄存器的值。这个值包含了MUXMODE、上下拉以及最重要的延迟值。延迟值需要根据手册表7-104中的A_DELAY和G_DELAY单位ps按照TRM中描述的公式计算得出并填入寄存器的相应位域。强烈建议直接从TI官方SDK的参考板设备树文件中复制已验证的配置值这是最稳妥的方式。4.3 Virtual IO Timing Mode 的快速应用对于不想手动计算延迟值的场景Virtual IO Timing Mode 提供了更简单的选择。你只需要在设备树中指定使用哪个虚拟模式即可。mmc1 { status okay; max-frequency 192000000; sd-uhs-sdr104; /* 启用Virtual IO Timing Mode并选择模式2对应SDR104 */ mmc-hs200-1_8v; /* 注意属性名可能是 mmc-hs200-1_8v但用于控制SDR104的Virtual Mode */ /* 具体属性名需参考内核文档和芯片支持情况 */ ti,dual-volt; /* 另一个关键属性用于使能更精确的IODelay配置 */ };Virtual Mode的本质是芯片内部已经固化了几组针对不同速度等级优化好的延迟参数组合如MMC1_VIRTUAL1~7。通过设置相应的位MODESELECT和DELAYMODE硬件会自动加载这组参数。这种方式比Manual Mode更简单但灵活性稍差。5. 硬件设计与调试经验实录再好的软件配置也救不了糟糕的硬件设计。以下是我在多个AM572x项目调试中积累的硬核经验。5.1 PCB设计黄金法则阻抗与线宽MMC接口走线必须做50Ω单端阻抗控制。与PCB板厂明确要求并使用SI9000等工具计算好线宽、线距与参考平面。通常在常见的FR4板材、层厚下走线宽度约为5-6mil。等长匹配MMC_CLK与MMC_CMD、MMC_DATA0-3这几根线必须做等长处理。等长误差控制在50mil (1.27mm) 以内是基本要求对于SDR104建议做到20mil (0.5mm) 以内。等长的目的是保证信号同时到达避免因飞行时间Flight Time差异导致的建立/保持时间 violation。参考平面MMC走线的正下方必须有完整、无分割的GND或电源平面作为参考。绝对禁止信号线跨分割区这会严重破坏阻抗连续性并增加辐射。走线长度尽量短。从处理器BGA扇出后到SD卡座之间的走线长度最好不超过2000mil约5厘米。越短信号质量越好受干扰的可能性越低。去耦电容在SD卡座的VCC引脚附近放置一个1uF和一个0.1uF的陶瓷电容用于滤除高频噪声。这是稳定供电的必需品。ESD保护如果产品有静电防护要求需要在数据线、命令线和时钟线上添加超低电容如0.5pF的TVS二极管阵列。注意保护器件的寄生电容过大会劣化高速信号。5.2 软件调试与问题排查即使硬件完美软件配置不当也会导致失败。以下是一个系统化的调试流程从低速模式开始永远先在Default Speed25MHz或High Speed50MHz模式下让系统跑通。确认SD卡能被识别、分区、挂载和读写。逐步升速在设备树中逐步提高max-frequency并启用对应的能力标志如sd-uhs-sdr50,sd-uhs-sdr104。每次升速后都进行大文件连续读写测试如dd命令并使用dmesg观察内核有无MMC错误报告。关键日志启用内核的MMC调试信息。echo 8 /sys/module/mmc_core/parameters/debug这会在dmesg中打印详细的时序协商和命令响应过程帮助你判断是在切换速度时失败还是在高速传输中出错。时序调整如果高速模式失败首先尝试切换到Manual或Virtual Timing Mode。如果TI SDK提供了对应模式的配置直接使用。如果没有则需要根据手册表7-104计算延迟值。调整的原则是读写失败CRC错误、超时可能是建立时间不足。尝试增加数据/命令的输入延迟A_DELAYinCFG_*_IN或者减小输出延迟A_DELAYinCFG_*_OUT让信号更早到达接收端。数据损坏内容错误可能是保持时间不足。尝试减小输入延迟或增加输出延迟。时钟相关如果问题与时钟相关可以微调CFG_MMC1_CLK_OUT的延迟改变时钟边沿的位置。电源检查使用示波器测量SD卡座的VCC引脚电压。在高速读写瞬间电压跌落不应超过3%。如果跌落严重检查电源路径的阻抗增加去耦电容。5.3 示波器实测如何验证时序理论计算和软件配置最终要靠仪器验证。你需要一台带宽至少为1GHz的示波器测量192MHz时钟及其谐波和高速差分探头。测量点在SD卡座的引脚上或最靠近的过孔进行测量。不要在处理器端测量因为PCB走线本身会改变信号。触发与测量以MMC_CLK为触发源。使用示波器的眼图Eye Diagram功能累积大量的数据跳变可以直接观察信号的整体质量、抖动和噪声裕量。使用参数测量功能直接测量MMC_DATA0相对于MMC_CLK上升沿的建立时间和保持时间。判断标准实测的建立/保持时间必须大于SD卡规格书要求的值通常SD卡要求tsu 2ns,th 1ns SDR104具体需查卡规格并且同时满足AM572x手册中接收模式的要求。要留出足够的裕量建议20%以应对温度、电压变化和器件老化。6. 常见问题与解决方案速查表下表汇总了我在AM572x平台上调试MMC高速接口时遇到的最典型问题及解决思路问题现象可能原因排查步骤与解决方案SD卡无法识别或识别为低速卡1. 引脚复用配置错误。2. 电源或上拉电阻问题。3. 初始时钟频率过高。1. 检查设备树pinctrl配置确认引脚复用为MMC1模式。2. 测量卡座VCC电压3.3V/1.8V检查DATA0-3、CMD线上拉电阻通常10K-50K是否正确焊接。3. 确保初始化的最大频率 (max-frequency) 设置为一个保守值如25MHz。低速模式正常切换到SDR50/SDR104失败1. 时序配置未启用未切Manual/Virtual模式。2. PCB走线等长或阻抗问题严重。3. 电源噪声大。1. 在设备树中确认已启用sd-uhs-sdr104等属性并配置了对应的pinctrl状态。2. 审查PCB设计重点检查CLK与DATA线长差。如果可能用示波器看眼图。3. 用示波器测量VCC在读写时的纹波增加去耦电容。高速模式下读写不稳定偶发CRC错误或超时1. 时序裕量不足。2. 信号完整性差过冲、振铃。3. 软件驱动或文件系统问题。1.首要措施调整IO延迟参数。参考章节4.2微调A_DELAY值。这是最有效的软件调整手段。2. 检查PCB确保参考平面完整走线远离噪声源。可在数据线上串联小电阻22Ω-33Ω阻尼振铃。3. 尝试更换不同品牌、不同容量的SD卡进行交叉测试。DDR50模式工作异常但SDR模式正常1. 时钟占空比不满足要求。2. DDR特有的输出延迟配置错误。1. 用示波器测量MMC_CLK的占空比应尽可能接近50%。偏差大需检查处理器PLL配置和时钟缓冲电路。2. 确认DDR50模式下使用的是正确的Manual Mode配置MMC1_DDR_MANUAL1输出延迟参数与SDR模式不同。内核日志显示mmc1: tuning execution failed这是eMMC HS200/SDR104模式下的调谐失败。AM572x的MMC控制器支持硬件调谐Tuning用于补偿最佳采样点。1. 确保设备树中启用了调谐功能通常自动使能。2.硬件问题概率极大重点检查PCB信号质量特别是时钟和数据线的阻抗连续性。调谐失败通常意味着信号眼图已经闭合无法找到稳定的采样点。3. 尝试降低频率或更换eMMC芯片。调试高速接口是一场与物理世界的博弈需要耐心和系统性的方法。从最基础的低速模式验证起逐步增加复杂度同时结合理论分析看手册、软件配置改设备树和硬件验证用示波器才能最终让AM572x的MMC接口在高速模式下稳定狂奔。记住每一个纳秒的时序裕量都是系统稳定性的宝贵财富。