TI MibSPI寄存器配置实战:从SPIFMT3到TGINTVECT的高效通信指南

发布时间:2026/7/25 10:42:27
TI MibSPI寄存器配置实战:从SPIFMT3到TGINTVECT的高效通信指南 1. 项目概述与MibSPI核心价值在嵌入式系统开发中SPI串行外设接口是连接传感器、存储器、显示屏等外设的“血管”。但标准SPI在应对复杂、多任务、高实时性的场景时常常显得力不从心比如主控需要同时与多个不同时序要求的从设备通信或者在传输过程中需要灵活切换数据格式。这时德州仪器TI在其TMS470等平台中集成的MibSPIMulti-buffered SPI模块就成为了一个强大的武器。它不仅仅是SPI更是一个集成了硬件多缓冲、可编程数据格式和高级中断管理机制的通信控制器。今天我们不谈空洞的理论直接切入工程师最关心的实战层面如何通过配置MibSPI的几个关键控制寄存器来解锁其全部潜能。我们将重点解析SPIFMT3数据格式寄存器、TGINTVECT0/1传输组中断向量寄存器和SPIPMCTRL并行/模数模式控制寄存器。理解并熟练运用这些寄存器意味着你能让SPI通信从“能用”变得“高效且可靠”尤其是在汽车电子如ECU间通信或工业控制多轴电机驱动这类对时序和可靠性有严苛要求的领域。无论你是正在评估TI平台还是已经深陷调试泥潭这篇文章都将为你提供清晰的寄存器级操作指南和避坑经验。2. 核心寄存器深度解析与设计思路MibSPI的强大源于其寄存器组的精细设计。与标准SPI通常只有一个全局配置不同MibSPI为数据格式、中断、引脚控制等提供了高度可配置的专用寄存器。我们的配置思路是分层、解耦的首先通过数据格式寄存器如SPIFMTx定义“怎么传”然后通过中断向量寄存器TGINTVECTx来高效处理“传完后怎么办”最后利用模式控制寄存器如SPIPMCTRL来探索“能否更快地传”。这种设计使得单个MibSPI模块能够以不同的参数服务多个虚拟通信通道极大地提升了硬件利用率。2.1 SPIFMT3定义通信的“语法规则”SPIFMT3寄存器偏移地址 5Ch是四个数据格式寄存器SPIFMT0-3之一它允许你为特定的数据传输会话或传输组定义一套完整的通信参数。你可以把它想象成给SPI通信预先写好的一份“合同”规定了数据位宽、时钟特性、校验方式等所有细节。寄存器位域精讲CHARLEN (位 4-0): 字符长度。这是最基础的设置定义了单次传输的数据位宽。合法范围是0x022位到0x1016位。这里有个大坑手册提到非法值如0x00 0x1F不会被检测其行为未定义。这意味着如果你错误地写入0x00可能传输会静默失败或者产生不可预测的时序排查起来非常困难。实操心得在初始化函数中务必在写入CHARLEN值前增加范围校验断言这是防御性编程的关键。PRESCALE (位 15-8): 波特率预分频器。当MibSPI作为主机时SPI时钟频率由此决定BR VBUSPCLK / (PRESCALE 1)。当PRESCALE为0时时钟为VBUSPCLK/2。关键点此配置仅主机模式有效从机模式下忽略。在计算波特率时务必确认你的系统VBUSPCLK时钟频率。例如VBUSPCLK100MHz需要1MHz的SPI时钟则PRESCALE应设置为 (100/1) - 1 99。PHASE (位 16) POLARITY (位 17): 时钟相位与极性。这是SPI通信模式CPOL CPHA的核心。POLARITY0表示时钟空闲时为低电平POLARITY1则为高电平。PHASE0表示数据在第一个时钟边沿采样PHASE1则表示数据在第二个时钟边沿采样。常见的模式0CPOL0 CPHA0和模式3CPOL1 CPHA1都需要正确配对。特别注意在从机模式下如果需要更改PHASE或POLARITY必须遵循严格序列先清除GCR1.SPIEN位禁用SPI再配置SPIFMTx最后重新置位GCR1.SPIEN。并且重新使能的操作必须在外部SPICLK信号的极性实际发生变化之后进行否则可能导致从机与主机时钟不同步。DISCSTIMERS (位 18): 禁用片选定时器。C2TDELAY片选到发送延迟和T2CDELAY发送到片选关闭延迟用于满足外设的建立/保持时间。在混合连接了快慢速从设备的系统中你可以为某个数据格式禁用这些定时器以追求极限速度而为另一个格式启用以确保稳定性。配置建议对于低速或时序敏感的器件如某些Flash存储器务必保持此位为0启用定时器并根据数据手册配置好延迟值。HDUPLEX_ENA (位 19): 半双工模式使能。这是一个高级功能允许SIMO主出从入引脚在特定时刻切换为输入或输出功能。例如在主机模式下设置此位SIMO引脚将变为接收引脚RX实现仅接收的半双工通信。典型应用与某些只需要主机发送命令、从机返回数据的传感器通信时可以节省一个I/O口。注意正常全双工操作时此位应保持为0。SHIFTDIR (位 20): 移位方向。0最高位MSB先发送最常见1最低位LSB先发送。必须与外设的数据格式严格匹配。WAITENA (位 21): 使能等待信号。当主机需要与一个通过ENA使能引脚应答的从机通信时需将此位置1。主机在发起传输前会等待ENA信号变低如果超时C2EDELAY计数器溢出则会触发超时错误。这用于构建混合了有无握手信号从机的复杂SPI网络。PARITYENA (位 22) PARPOL (位 23): 奇偶校验使能与极性。使能后会在数据流末尾添加一个校验位PARPOL0为偶校验1为奇校验并在接收端进行校验。校验失败会置位RXERR标志。注意在从机模式下如果发生了不可纠正的错误UPE无论数据如何SOMI引脚都会被强制输出全0且校验位会被强制输出为与所选校验类型相反的值偶校验出1奇校验出0以此向主机明确指示错误。WDELAY (位 31-24): 传输间延迟。当缓冲区控制字段中的WDEL位被置位时在当前传输结束后会插入一段空闲时间。延迟时间 WDELAY * PVBUSPCLK 2 * PVBUSPCLK。这用于满足某些外设在连续传输间需要特定空闲时间的要求。2.2 TGINTVECT0/1高效中断处理的“调度中心”在实时系统中轮询是效率的敌人。MibSPI的中断向量寄存器将中断处理提升到了新高度。TGINTVECT0偏移60h和TGINTVECT1偏移64h分别对应两条中断线INT0和INT1其核心思想是向量化中断——CPU读取该寄存器直接得到一个代表最高优先级待处理中断源的编码向量无需遍历查询多个状态位。寄存器位域精讲INTVECTx (位 5-1): 中断向量值。这是一个只读字段直接反映了SPIFLG寄存器中最高优先级中断的状态编码。00000b: 无中断挂起。10001b: 错误中断最高优先级。需进一步检查SPIFLG寄存器的低字节确定具体错误类型如超时、奇偶校验错等。10011b: 接收缓冲区溢出中断。10010b: 接收缓冲区满中断。10100b: 发送缓冲区空中断。中断处理流程的精妙之处对于“接收缓冲区满”和“接收溢出”中断读取TGINTVECTx寄存器这个动作本身就会自动清除SPIFLG中对应的RXINTFLG标志。读取后如果还有其它低优先级中断挂起INTVECTx字段会自动更新为下一个中断的向量。这种“读-清-更新”的硬件机制极大地简化了中断服务程序ISR的编写并减少了中断延迟。重要陷阱存在一个例外情况。如果SPIBUF硬件缓冲区和内部的RXBUF都已满此时即使读取TGINTVECTx显示10010b也不会清除RXINTFLG。唯一的清除方法是连续读取SPIBUF直到没有未读的RX数据为止。在编写ISR时必须考虑这个边界情况采用循环读取直到SPIBUF为空的方式才能可靠清除中断。SUSPENDx (位 0): 传输挂起标志仅MibSPI模式有效。此位与INTVECTx配合进一步区分中断类型。0: 表示“传输完成”中断Transfer Finished。整个传输组的数据都已发送/接收完毕。1: 表示“传输挂起”中断Transfer Suspended。下一个待传输的缓冲区被设置为“挂起等待”模式由其BUFMODE字段定义通常是等待CPU提供新数据或取走数据。处理“挂起”中断的关键当SUSPENDx1时读取TGINTVECTx寄存器不会清除“传输组挂起”中断你必须先解决挂起条件根据造成挂起的缓冲区其BUFMODE的配置向对应的TXRAM位置写入新数据或从RXRAM位置读取数据。完成此操作后挂起条件解除中断标志才会被硬件清除。这是一个常见的死锁问题来源——ISR读寄存器后发现中断未清除误以为处理失败。2.3 SPIPMCTRL突破带宽瓶颈的“并行引擎”标准SPI是单数据线或全双工一对的串行通信。SPIPMCTRL寄存器偏移6Ch开启了并行和模数Modulo模式能同时使用多个数据线进行传输理论上可将数据吞吐量提升数倍。寄存器结构特点该寄存器为四个数据格式0-3分别预留了配置位域结构完全相同。每个格式占用8个位包含PMODEx (位 1-0 / 9-8 / 17-16 / 25-24): 并行模式选择。00: 单数据线模式正常SPI。01: 2数据线模式。10: 4数据线模式。11: 8数据线模式。MMODEx (位 4-2 / 12-10 / 20-18 / 28-26): 模数模式数据线数量选择000-101对应1-6条数据线。此模式需要硬件支持Modulo Option。HSM_MODEx (位 6 / 14 / 22 / 30): 高速模数模式使能。当PMODEx非零时此位决定是普通并行模式0还是高速模数模式1。MODCLKPOLx (位 5 / 13 / 21 / 29): 模数模式下的时钟极性反转。配置逻辑与约束模式互斥PMODE和MMODE是互斥的配置路径。要使用并行模式2/4/8线需设置PMODEx为非零值并确保对应的MMODEx000。要使用模数模式1-6线需设置MMODEx为非零值并确保对应的PMODEx00对于1-5线或01对于6线。引脚映射使能并行/模数模式后需要额外配置SPIPCx等引脚控制寄存器将更多的GPIO引脚复用为SPI数据线如SPISIMO[1:7] SPISOMI[1:7]。硬件连接必须与软件配置严格对应。应用场景并行模式非常适合驱动并口LCD屏、高速ADC/DAC等宽数据总线设备。模数模式则提供了一种更灵活的多线串行方案。注意事项启用这些模式会显著增加PCB布线和软件配置的复杂性且并非所有TI器件都支持完整的模数选项需仔细查阅具体芯片的数据手册。3. 实战配置流程与核心代码实现理解了寄存器原理我们来看如何将它们组合起来完成一个典型的MibSPI多格式、带中断的通信任务。假设场景我们需要用MibSPI以两种不同格式与两个从设备通信并使用中断高效处理传输完成事件。3.1 系统初始化与MibSPI模式使能首先必须正确启用MibSPI模块并切换到多缓冲模式。/** * brief 初始化MibSPI模块并启用多缓冲模式。 * param base MibSPI模块基地址。 */ void MibSPI_Init(uint32_t base) { // 1. 软件复位SPI模块通过SPIGCR0寄存器 HWREG(base SPIGCR0) 0x00000000; // 确保模块禁用 HWREG(base SPIGCR0) 0x00000001; // 置位SOFT_RESET位 // ... 等待复位完成可查询状态位或简单延时 delay_us(10); HWREG(base SPIGCR0) 0x00000002; // 清除复位使能模块 // 2. 配置全局控制寄存器如设置为主机、使能循环回测等根据需求 HWREG(base SPIGCR1) 0x01000000; // 例如MASTER1 CLKMOD0内部时钟源 // 3. 【关键步骤】使能多缓冲模式MibSPI模式 // 在设置MSPIENA之前多缓冲相关寄存器是不可写的。 HWREG(base MIBSPIE) | 0x00000001; // 置位MSPIENA位 (bit 0) // 4. 可选启用扩展缓冲区如果芯片支持且需要256个缓冲区 // 对EXTENDED_BUF_ENA字段写入0xA以启用。注意此操作可能需要特权模式。 // HWREG(base MIBSPIE) (HWREG(base MIBSPIE) 0xFFFFF0FF) | (0xA 8); }3.2 配置数据格式寄存器以SPIFMT3为例接下来我们为“传输组1”配置一个特定的数据格式假设是连接一个16位ADC需要模式0CPOL0 CPHA0MSB先传无校验波特率1MHzVBUSPCLK100MHz。/** * brief 配置SPIFMT3寄存器用于特定外设。 * param base MibSPI模块基地址。 */ void Configure_SPIFMT3_For_ADC(uint32_t base) { uint32_t fmt3_value 0; // 1. 字符长度 CHARLEN: 16位 - 0x10 fmt3_value | (0x10 0); // Bits [4:0] // 2. 波特率预分频 PRESCALE: 100MHz / 1MHz 100, 100-199 - 0x63 fmt3_value | (99 8); // Bits [15:8] // 3. 时钟相位 PHASE: 0 (模式0) // 4. 时钟极性 POLARITY: 0 (模式0) // fmt3_value | (0 16) | (0 17); // 默认即为0可不写 // 5. 禁用片选定时器假设ADC时序要求不高为追求速度禁用定时器。 fmt3_value | (1 18); // DISCSTIMERS 1 // 6. 全双工模式 (HDUPLEX_ENA 0) // 7. MSB先出 (SHIFTDIR 0) // 8. 不等待ENA信号 (WAITENA 0) // 9. 无奇偶校验 (PARITYENA 0) // 10. 传输间延迟 WDELAY: 无延迟 - 0 // fmt3_value | (0 24); // Bits [31:24] // 将配置写入SPIFMT3寄存器偏移0x5C HWREG(base 0x5C) fmt3_value; // 【重要检查】在实际项目中应添加对CHARLEN写入值的校验 if ((fmt3_value 0x1F) 0x02 || (fmt3_value 0x1F) 0x10) { // 错误处理记录日志或进入安全状态 } }3.3 配置传输组与缓冲区并关联数据格式MibSPI的核心是多缓冲。我们需要设置一个传输组Transfer Group TG并为其缓冲区指定使用的数据格式。// 假设使用传输组1TG1其第一个缓冲区索引为16取决于具体芯片的缓冲区划分 #define TG1_START_BUFFER_INDEX 16 #define TG1_BUFFER_COUNT 8 // TG1包含8个缓冲区 void Configure_Transfer_Group1(uint32_t base) { // 1. 配置TG1的控制寄存器TGxCTRL例如设置触发方式、数据格式索引等。 // 假设TG1使用数据格式3即我们刚配置的SPIFMT3 uint32_t tg1_ctrl 0; tg1_ctrl | (3 8); // 设置DFMT数据格式索引字段为3指向SPIFMT3 tg1_ctrl | (1 0); // 使能该传输组TGEN1 HWREG(base TG1CTRL) tg1_ctrl; // TG1CTRL的偏移地址需查手册 // 2. 配置TG1包含的缓冲区。 // 每个缓冲区在TXRAM中有对应的控制字段BUFx。 for (int i 0; i TG1_BUFFER_COUNT; i) { uint32_t buf_index TG1_START_BUFFER_INDEX i; uint32_t buf_addr base TXRAM_START buf_index * 4; // 计算缓冲区控制字地址 uint32_t buf_control 0; // 设置缓冲区模式例如使能中断、使用数据格式3、设置片选等。 buf_control | (1 15); // 使能传输完成中断TGINTEN buf_control | (3 8); // 指定使用数据格式3DFMT buf_control | (1 0); // 指定片选线CSNR例如CS0 HWREG(buf_addr) buf_control; // 注意TXRAM中控制字和实际发送数据是分开的。数据需写入另一区域。 } // 3. 使能TG1的传输完成中断通过TGITENST寄存器 // TGITENST的SETINTENRDY字段的bit[16]对应TG1的完成中断使能设置 HWREG(base TGITENST) | (1 16); // 置1使能TG1完成中断 }3.4 中断服务程序ISR编写要点当中断发生时CPU会跳转到中断向量表对应的服务程序。我们需要在ISR中读取TGINTVECT寄存器来判断和处理。// 假设INT0中断线连接到TGINTVECT0 __interrupt void MibSPI_Int0_ISR(void) { uint32_t base MIBSPI1_BASE; uint32_t int_vect_reg HWREG(base TGINTVECT0); // 读取中断向量寄存器 uint32_t vector (int_vect_reg 1) 0x1F; // 提取INTVECT0字段 (bits 5-1) uint32_t suspend_flag int_vect_reg 0x01; // 提取SUSPEND0标志 (bit 0) switch (vector) { case 0x00: // 00000b: 无中断理论上不应进入 break; case 0x11: // 10001b: 错误中断 // 1. 读取SPIFLG寄存器低字节确定具体错误类型 uint32_t spiflg_low HWREG(base SPIFLG) 0xFF; // 2. 根据错误位进行相应处理如记录日志、重试等 handle_spi_error(spiflg_low); // 3. 【关键】错误标志需要写1清除与RX/TX中断不同 HWREG(base SPIFLG) | (spiflg_low 0x03); // 例如清除TIMEOUT, DESYNC等错误位 break; case 0x12: // 10010b: 接收缓冲区满中断 // 处理接收数据 process_received_data(base); // 【注意陷阱】此处读取TGINTVECT0可能不会自动清除RXINTFLG // 可靠做法循环读取SPIDAT/BUF直到为空 while (!(HWREG(base SPIBUF) RX_EMPTY_FLAG)) { volatile uint32_t dummy HWREG(base SPIBUF); // 处理dummy中的数据... } break; case 0x14: // 10100b: 发送缓冲区空中断 // 填充新的发送数据到TXRAM fill_tx_buffer(base); // 发送空中断在写入新数据到SPIDATx后会自动清除无需额外操作。 break; default: // 处理未知向量可能是保留值 break; } // 检查是否为挂起中断 if (suspend_flag 1) { // 这是“传输挂起”中断 // 1. 确定是哪个传输组TG挂起可通过检查缓冲区状态寄存器 uint32_t suspended_tg get_suspended_tg_number(base); // 2. 解决挂起条件例如为挂起的缓冲区写入新数据 resolve_suspend_condition(base, suspended_tg); // 注意完成上述操作后挂起条件解除中断标志会被硬件清除。 // 此时不需要也不应该手动清除TGINTVECT寄存器中的挂起标志。 } // ... 其他必要的ISR收尾工作如清除外设中断标志、通知操作系统等 }3.5 并行/模数模式配置示例假设我们需要为数据格式0启用4线并行模式以提升与一个并行TFT屏的通信速度。void Enable_Parallel_Mode_For_Format0(uint32_t base) { uint32_t pmctrl_value HWREG(base SPIPMCTRL); // 读取当前值 // 1. 配置数据格式0为4线并行模式 // 清除PMODE0旧值 (bits [1:0])然后设置为2b10 (4线模式) pmctrl_value ~(0x00000003); pmctrl_value | (0x2 0); // PMODE0 10b // 2. 确保MMODE0为000 (单线模式)因为PMODE和MMODE是互斥的 pmctrl_value ~(0x0000001C); // 清除MMODE0 (bits [4:2]) // 3. 高速模数模式保持禁用HSM_MODE0 0 // 4. 模数时钟极性保持默认MODCLKPOL0 0 HWREG(base SPIPMCTRL) pmctrl_value; // 5. 【必须】配置引脚复用将SPISIMO[3:1]和SPISOMI[3:1]等引脚设置为SPI功能。 // 这通常在系统初始化早期的PinMux配置中完成。 // 例如配置SPIPC1等寄存器将相关GPIO引脚的功能选择设置为SPI。 // HWREG(PINMUX_BASE ...) ...; // 6. 在对应的数据格式寄存器如SPIFMT0中字符长度CHARLEN可能需要调整。 // 因为并行模式下一次传输会同时发送多个位字符长度可能对应“每次时钟沿传输的并行数据宽度”。 // 需根据外设数据手册确定。 }4. 常见问题排查与调试心得实录即使理解了所有寄存器实际调试中依然会遇到各种问题。下面是我在多个项目中总结的典型问题及其排查思路。4.1 通信完全无反应或数据全错症状SPI时钟线没有波形或有时钟但数据线无变化或收发数据全是0xFF/0x00。排查清单时钟与电源最基础也最易忽略。确认VBUSPCLK时钟是否正确使能并达到预期频率使用示波器测量SPICLK引脚。主从模式与使能检查SPIGCR1.MASTER位是否正确设置模块总使能位SPIGCR0.ENABLE是否置1多缓冲模式开关你是否需要MibSPI模式如果用了多缓冲功能但MSPIENA位为0相关寄存器配置不会生效。务必先设MSPIENA1再配置TG、缓冲区等。数据格式关联检查传输组TGCTRL或缓冲区控制字BUFx中的DFMT字段是否指向了你正确配置的SPIFMTx寄存器0-3一个常见的错误是格式索引写错。片选信号缓冲区控制字中的CSNR片选编号是否正确对应的SPICSx引脚是否已正确配置为输出功能用示波器看片选信号是否在传输期间有效拉低。相位与极性这是SPI调试的头号杀手。确保主机和从设备的CPOL和CPHA设置完全一致。用示波器同时捕获CLK和MOSI信号对照数据手册第一个数据位的采样点检查相位关系。牢记从机模式下修改CPOL/CPHA的特殊序列。4.2 中断无法触发或无法清除症状配置了中断使能但程序从未进入ISR或者进入一次ISR后中断标志无法清除导致反复进入中断。排查清单中断使能层层检查外设级传输组中断使能了吗TGITENST寄存器的SETINTENRDY或SETINTENSUS位缓冲区级具体缓冲区的控制字中的中断使能位如TGINTEN置1了吗中断控制器级MCU的中断控制器如NVIC中对应的MibSPI中断线INT0/INT1使能和优先级配置了吗中断标志清除机制接收中断缓冲区满大部分情况读取TGINTVECT会自动清除。但遇到SPIBUF和RXBUF双满的特殊情况必须循环读取SPIBUF直到为空。你的ISR里处理这个边界情况了吗错误中断TGINTVECT读取不会清除SPIFLG中的错误标志必须在ISR中手动写1清除对应的错误位如TIMEOUTPARITYERR。挂起中断SUSPEND1读取TGINTVECT不会清除中断。必须通过写入TXRAM或读取RXRAM来解决挂起条件。检查造成挂起的缓冲区的BUFMODE设置并确保ISR执行了正确的“解挂”操作。向量值解读在ISR中打印或记录读取到的TGINTVECT寄存器值解析其INTVECT和SUSPEND字段。确认触发的中断类型是否符合预期。4.3 使能并行/模数模式后通信异常症状启用多线模式后通信失败或数据位错位。排查清单引脚复用冲突这是最常见的原因。SPIPMCTRL配置了多线模式但对应的GPIO引脚如SPISIMO1 SPISIMO2等可能仍被配置为普通I/O或其他外设功能。逐脚检查引脚复用寄存器。模式配置冲突PMODEx和MMODEx位域是否配置冲突记住它们是互斥的。想用4线并行应设置PMODE10且MMODE000。数据长度与对齐并行模式下一次传输发送多个位。你的数据打包方式对吗例如在4线模式下发送一个32位数据硬件会分8个时钟周期发出每次发出4位分别在4条线上。你需要确保待发送的32位数据在缓冲区中是正确的位序。硬件连接PCB上多根数据线是否等长是否存在严重的时序偏移在高速模式下这可能成为问题。4.4 性能优化与稳定性提升技巧利用WDELAY优化多从机切换当主设备需要轮询多个时序要求不同的从设备时可以为每个设备的数据格式设置不同的WDELAY值。这样在切换片选后硬件会自动插入合适的空闲时间满足不同从机的时序要求无需CPU软件延时极大提升轮询效率。合理规划传输组与缓冲区将通信任务按实时性要求分组。高实时性、小数据量的任务如读取传感器状态放在一个TG里并设置高优先级中断大数据量、低实时性的任务如读写Flash放在另一个TG里使用DMA或低优先级中断。利用多缓冲实现“乒乓操作”在传输一组数据时CPU准备下一组数据实现无缝流传输。中断与DMA结合对于连续大数据量传输不要每个字都进中断。可以配置缓冲区满中断或使用DMA。MibSPI通常支持与DMA控制器的联动将TG完成作为DMA传输请求。这样可以将CPU从频繁的中断中解放出来。配置前关闭修改前禁用在动态修改关键配置如波特率、数据格式、PHASE/POLARITY前一个良好的习惯是先将对应传输组禁用TGEN0或甚至暂时关闭模块使能。修改完成后再重新启用。这可以避免在配置过程中产生毛刺或错误的传输。善用仿真器与寄存器视图在IDE如Code Composer Studio的调试模式下实时查看和修改MibSPI的寄存器值是快速验证配置和定位问题的利器。你可以单步执行初始化代码观察每一步操作后寄存器的变化是否符合预期。