深入解析TI MibSPI引脚控制寄存器:从基础配置到高级应用

📅 2026/7/27 1:53:04 👁️ 阅读次数 📝 编程学习
深入解析TI MibSPI引脚控制寄存器:从基础配置到高级应用

1. 项目概述与核心价值

在嵌入式系统开发中,SPI(串行外设接口)几乎是工程师绕不开的通信协议。它简单、高效,但当你真正深入到芯片内部,面对那些动辄几十页的寄存器手册时,往往会感到无从下手。特别是像TI的MibSPI(Multi-Buffered SPI)这类功能强大的模块,其引脚控制寄存器(SPIPCx)的配置,直接决定了你的SPI接口是“能用”还是“好用”,甚至是“稳定可靠”。

我接触过不少项目,初期为了快速验证,往往直接调用厂商提供的库函数来初始化SPI,对底层寄存器的配置一知半解。结果在项目后期,遇到通信不稳定、功耗异常或者引脚冲突时,排查起来异常痛苦,最终还得回头啃手册。MibSPI模块的SPIPCx寄存器组,正是解决这些“高级”问题的钥匙。它不仅仅是将一个引脚定义为SPI功能那么简单,而是提供了一套完整的、从功能模式、数据方向到电气特性的精细化控制方案。

这篇文章,我就结合自己踩过的坑和项目经验,带你彻底拆解MibSPI的SPI引脚控制寄存器。我们会从最基础的“这个引脚是SPI用还是当普通IO用”开始,一直深入到“如何配置内部上拉电阻来省掉外部电阻”、“如何利用开漏模式实现总线共享”等实战细节。无论你是正在调试基于TI Hercules或C2000系列芯片的工程师,还是希望深入理解SPI外设工作原理的学习者,这篇内容都能帮你建立起清晰的配置逻辑,避免因配置不当导致的那些隐蔽且耗时的硬件问题。理解这些寄存器,你就能真正驾驭SPI接口,让它不仅跑起来,还能跑得稳、跑得省。

2. MibSPI模块与引脚控制寄存器架构解析

2.1 MibSPI模块的核心特性与引脚复用背景

MibSPI,全称Multi-Buffered Serial Peripheral Interface,是TI在其高端微控制器(如TMS570系列)中集成的一个增强型SPI模块。它的“Multi-Buffered”特性意味着其内部拥有多个数据缓冲区,支持DMA传输和复杂的数据流处理,非常适合高带宽、实时性要求高的应用,如汽车电子中的传感器网络或电机控制。

然而,芯片的引脚资源是极其宝贵的。一颗MCU可能有多个功能模块(如多个SPI、UART、CAN、PWM等),但物理引脚数量有限。因此,绝大多数MCU引脚都支持功能复用。以SPI的SIMO(主出从入)引脚为例,在芯片数据手册的引脚描述表中,你可能会看到它同时标有SPI1SIMOGIOA[0]。这意味着,这个物理引脚既可以作为SPI1的数据输出线,也可以作为一个通用的数字输入/输出引脚(GIO)。

那么,谁来决定这个引脚此刻扮演什么角色呢?答案就是引脚控制寄存器。MibSPI模块的SPIPC0到SPIPC8这一组寄存器,就是专门用来管理与其相关的所有SPI引脚(SIMO, SOMI, CLK, ENA, SCS)的工作模式的。它们像一个精密的开关矩阵,控制着每个引脚是连接到SPI模块的内部逻辑,还是连接到通用的GPIO控制器,并进一步控制这个GPIO的方向、电平、上下拉等电气属性。

2.2 SPIPCx寄存器组全景图与设计逻辑

SPIPCx寄存器不是一个单一的寄存器,而是一个功能清晰的寄存器组。理解它们的设计逻辑,比死记硬背每个比特位更重要。我们可以将其分为四大功能板块:

  1. 功能与方向控制层(SPIPC0, SPIPC1):这是最基础的一层,决定了引脚的“身份”(是SPI功能引脚还是通用IO)和“行为方向”(是输入还是输出)。
  2. 数据读写层(SPIPC2, SPIPC3):当引脚配置为通用IO时,这一层用于读取引脚的外部电平状态(输入)或驱动引脚输出特定电平(输出)。
  3. 位操作层(SPIPC4, SPIPC5):提供了便捷的“置位”(SET)和“清零”(CLR)操作,可以原子性地将某个通用IO输出引脚拉高或拉低,而无需先读取-修改-写回整个寄存器,这在多任务或中断环境中非常有用。
  4. 电气特性控制层(SPIPC6, SPIPC7, SPIPC8):这是高级功能层,控制引脚的开漏输出内部上拉/下拉电阻。这直接关系到电路的可靠性、功耗和总线拓扑结构。

这种分层设计体现了芯片设计者的匠心:从宏观的功能选择,到微观的电平控制,再到物理层的电气特性,层层递进,给了开发者极大的灵活性。例如,你可以将一个SPI片选引脚(SCS)在通信时用作功能引脚,在系统休眠时重新配置为带上拉电阻的通用输入引脚,用于检测唤醒信号。

注意:寄存器位宽与设备差异手册中反复提到“Register bits vary by device”和“On devices with 8>// 假设 SPIPC0 的寄存器地址为 0xFFF7A014 volatile uint32_t *spipc0 = (volatile uint32_t*)0xFFF7A014; // 先读取当前值,然后使用“与-或”操作进行位设置,避免影响其他位 uint32_t temp = *spipc0; temp &= ~(0x3FFUL); // 清除 bit9-bit0 的相关位(具体掩码需根据手册调整) temp |= (1 << 9); // CLKFUN = 1, SPICLK 作为功能引脚 temp |= (1 << 10); // SIMOFUN0 = 1, SPISIMO0 作为功能引脚 temp |= (1 << 11); // SOMIFUN0 = 1, SPISOMI0 作为功能引脚 temp |= (1 << 0); // SCSFUN0 = 1, SPISCS0 作为功能引脚(假设SCSFUN[0]在bit0) *spipc0 = temp;

3.2 SPIPC1:引脚方向控制寄存器

只有在引脚被SPIPC0配置为通用I/O(GIO)模式时,SPIPC1寄存器中的xxDIR位才起作用。它决定了这个GIO引脚是输入还是输出。

  • 位功能SIMODIR[7:0],SOMIDIR[7:0],CLKDIR,ENADIR,SCSDIR[7:0]
  • 配置值
    • 0:引脚配置为输入。可以读取外部电平。
    • 1:引脚配置为输出。可以驱动电平到外部电路。

核心逻辑与依赖关系: 这里有一个非常重要的依赖链,务必理解:

SPIPC0.xxFUN = 0 (GIO模式) --> SPIPC1.xxDIR 生效 --> 控制引脚输入/输出方向。 SPIPC0.xxFUN = 1 (功能模式) --> SPIPC1.xxDIR 无效 --> 方向由SPI模块内部状态(主/从模式等)自动决定。

例如,当CLKFUN=1时,无论CLKDIR是0还是1,在SPI主模式下CLK引脚一定是输出,在从模式下一定是输入。SPIPC1的配置被完全覆盖。

实战场景: 一个典型的应用是将未使用的SPI片选引脚(如SCS5)用作普通LED驱动。

  1. SPIPC0中,设置SCSFUN5 = 0,使其进入GIO模式。
  2. SPIPC1中,设置SCSDIR5 = 1,配置为输出。
  3. 后续就可以通过SPIPC3SCSDOUT5位来控制LED亮灭了。

3.3 SPIPC2与SPIPC3:数据输入与输出寄存器

这对寄存器是GIO模式下进行“读”和“写”操作的窗口。

  • SPIPC2 (数据输入寄存器xxDIN):这是一个只读寄存器(从表格的R-U属性可知)。无论引脚被配置为输入还是输出,你都可以通过读取SPIPC2中对应的位来获取该引脚当前的实际物理电平。这对于读取按键状态、检测连接信号等非常有用。
  • SPIPC3 (数据输出寄存器xxDOUT):这是一个读写寄存器。仅当引脚同时满足以下两个条件时,写入此寄存器才能控制引脚电平:
    1. SPIPC0.xxFUN = 0(GIO模式)
    2. SPIPC1.xxDIR = 1(输出模式)

操作示例

// 读取 SPISIMO0 引脚的电平(无论其当前是功能引脚还是GIO) uint32_t pin_level = (*spipc2) & (1 << 10); // 检查 SIMODIN0 位 // 将 SPISCS1(配置为GIO输出)设置为高电平 volatile uint32_t *spipc3 = (volatile uint32_t*)0xFFF7A020; // SPIPC3地址 uint32_t temp_out = *spipc3; temp_out |= (1 << 1); // 设置 SCSDOUT1 = 1 *spipc3 = temp_out;

3.4 SPIPC4与SPIPC5:数据输出置位与清零寄存器

这是两个非常实用的“快捷操作”寄存器。它们的有效条件与SPIPC3相同(GIO+输出模式)。

  • SPIPC4 (置位寄存器xxSET):向某个位写入1,会将对应的SPIPC3.xxDOUT置1,从而将引脚输出拉高。写入0没有任何效果。读取该位返回的是当前xxDOUT的值。
  • SPIPC5 (清零寄存器xxCLR):向某个位写入1,会将对应的SPIPC3.xxDOUT清0,从而将引脚输出拉低。写入0没有任何效果。读取该位返回的是当前xxDOUT的值。

它们的巨大优势在于“原子性”和“便捷性”

  • 原子性:在多任务或中断环境中,如果你直接通过“读-改-写”SPIPC3来改变某一个引脚的电平,可能会在“读”和“写”之间被中断打断,如果另一个任务也修改了同一个寄存器的其他位,就会造成数据覆盖。而直接写SPIPC4SPIPC5,硬件保证只改变目标位,其他位不受影响,这是一个原子操作。
  • 便捷性:代码更简洁,意图更明确。
// 传统方式:将 SCSDOUT2 拉高(非原子操作) temp = *spipc3; temp |= (1 << 2); *spipc3 = temp; // 使用 SET/CLR 寄存器方式(原子操作,更安全) volatile uint32_t *spipc4 = (volatile uint32_t*)0xFFF7A024; *spipc4 = (1 << 2); // 原子地将 SCSDOUT2 置1 // 将 SCSDOUT2 拉低 volatile uint32_t *spipc5 = (volatile uint32_t*)0xFFF7A028; *spipc5 = (1 << 2); // 原子地将 SCSDOUT2 清0

3.5 SPIPC6:开漏输出使能寄存器

开漏输出是一种重要的输出模式,其特点是:当输出逻辑0时,引脚内部MOS管导通,强下拉到地;当输出逻辑1时,引脚内部MOS管关闭,引脚呈现高阻态(不驱动高电平)。要得到确定的高电平,必须在外部接一个上拉电阻。

SPIPC6中的xxPDR位就是用来使能这种模式的。它的生效条件比xxDOUT更严格:

  1. SPIPC0.xxFUN = 0(GIO模式)
  2. SPIPC1.xxDIR = 1(输出模式)
  3. SPIPC3.xxDOUT = 1(输出数据寄存器值为1)

为什么需要第三个条件?这是由开漏的物理特性决定的。只有当内部逻辑想输出1(即xxDOUT=1)时,使能开漏才有意义——此时内部断开,由外部上拉电阻将线路拉高。如果想输出0xxDOUT=0),无论开漏是否使能,内部都会强下拉到地。

应用场景

  1. 电平转换:MCU是3.3V系统,需要与5V器件通信。将MCU引脚配置为开漏模式,外部接一个上拉电阻到5V,即可实现安全的双向电平转换。
  2. 总线共享(如I2C):虽然SPI通常不是多主总线,但如果你将某个SPI引脚复用为模拟I2C的SDA线,就必须使用开漏模式,以实现多设备的“线与”功能。
  3. 减少功耗:驱动LED等负载时,开漏模式下,当输出1时引脚为高阻,可以完全断开与负载的连接。

配置示例:将SPISCS3配置为开漏输出,并输出高电平。

// 1. 配置为GIO输出 *spipc0 &= ~(1 << 3); // SCSFUN3 = 0 *spipc1 |= (1 << 3); // SCSDIR3 = 1 // 2. 输出高电平 *spipc4 = (1 << 3); // 使用SET寄存器将 SCSDOUT3 置1 // 3. 使能开漏 (注意:必须先满足xxDOUT=1的条件) volatile uint32_t *spipc6 = (volatile uint32_t*)0xFFF7A02C; *spipc6 |= (1 << 3); // SCSPDR3 = 1 // 此时,SPISCS3引脚内部断开,如果外部有上拉电阻,则引脚被拉至高电平(如5V)。

3.6 SPIPC7与SPIPC8:上下拉电阻控制寄存器

这是影响电路可靠性和功耗的另一组关键寄存器。芯片内部集成了可软件配置的上拉/下拉电阻,可以省去外部电阻,简化PCB设计。

  • SPIPC7 (上拉/下拉禁用寄存器xxPDIS):此寄存器用于启用或禁用内部上拉/下拉电阻。
    • 0:使能内部上拉/下拉控制(注意,是使能“控制”,而非直接使能电阻)。
    • 1:禁用内部上拉/下拉电阻。引脚处于无内部电阻的状态。
  • SPIPC8 (上拉/下拉选择寄存器xxPSEL):此寄存器在SPIPC7相应位为0(使能控制)时,选择具体的电阻类型。
    • 0:选择下拉电阻
    • 1:选择上拉电阻

生效条件SPIPC7的生效条件比较特殊:只要引脚处于输入模式(无论它是GIO输入还是SPI功能模式下的输入),其内部上下拉电阻的控制就受SPIPC7SPIPC8影响。对于输出模式,内部上下拉电阻通常会自动断开。

配置逻辑与实战意义

  1. 悬空引脚处理:对于未连接的、配置为输入的SPI引脚(例如,在单工通信中只用的SIMO,不用的SOMI),必须启用内部上拉或下拉电阻,为其提供一个确定的默认电平,防止因引脚悬空产生随机噪声和额外功耗。
  2. 省电模式:在系统进入低功耗模式前,将所有的输入引脚配置为带内部上拉或下拉的模式,可以确保引脚电平稳定,进一步降低功耗。
  3. 总线默认状态:对于像SPI片选(SCS)这类低电平有效的信号,通常会在主设备端启用内部上拉电阻,确保在未选中从设备时,片选线保持在高电平(无效状态),避免误触发。

配置流程示例:为SPISOMI0引脚(配置为输入)启用内部上拉电阻。

volatile uint32_t *spipc7 = (volatile uint32_t*)0xFFF7A030; volatile uint32_t *spipc8 = (volatile uint32_t*)0xFFF7A034; // 1. 确保引脚功能可能为输入(例如,在从机模式下SOMI是输出,此配置无效。这里假设是GIO输入或主机模式的SOMI输入) // 2. 使能上下拉控制 *spipc7 &= ~(1 << 11); // SOMIPDIS0 = 0, 使能控制 // 3. 选择上拉电阻 *spipc8 |= (1 << 11); // SOMIPSEL0 = 1, 选择上拉

4. 完整配置流程与实战代码剖析

理解了每个寄存器的功能后,我们来看一个完整的SPI主设备引脚初始化流程。假设场景:使用MibSPI1,标准四线模式(SIMO0, SOMI0, CLK, SCS0),SCS0低电平有效,时钟极性相位为Mode 0 (CPOL=0, CPHA=0)。

4.1 配置步骤分解

  1. 确定物理引脚映射:首先查阅芯片数据手册的“Pin Multiplexing”章节,找到SPI1SIMO,SPI1SOMI,SPI1CLK,SPI1SCS0这几个功能具体对应哪个物理引脚(例如,PIN50,PIN51等)。有些芯片还需要配置顶层的引脚复用控制寄存器(例如PINMMR)来将引脚连接到SPI1模块,这一步是前置条件,本文假设已完成。
  2. 配置功能选择 (SPIPC0):将需要用到的四个引脚设置为SPI功能模式。
  3. (可选) 配置未用引脚:如果SPI1SCS1~SPI1SCS7等引脚不用,可以将它们设置为GIO模式,并配置为带上拉的输入,或者配置为输出驱动其他外设。
  4. 配置电气特性 (SPIPC7, SPIPC8):对于所有配置为输入的引脚(在本例中,主设备的SOMI是输入),建议根据电路需要启用内部上拉或下拉。通常,对于数据线和时钟线,在板卡设计良好、走线较短时可以不启用,但启用上拉可以增强抗干扰能力。对于片选线SCS0,由于是低有效,主设备端通常应启用上拉,确保空闲时为高
  5. SPI模块全局控制寄存器配置:这不是SPIPCx的范围,但必须完成。包括设置主/从模式(SPIGCR1)、时钟分频(SPICLK)、数据长度(SPIFMTx)、时钟极性和相位(SPIFMTx)等。
  6. 启动SPI模块:最后使能SPI模块(SPIGCR1)。

4.2 实战代码示例(基于寄存器直接操作)

以下是一个简化的、注重逻辑演示的代码片段。实际开发中,应使用芯片头文件中的寄存器定义宏。

/** * @brief 初始化 MibSPI1 引脚 (主模式,四线) * @param 无 * @retval 无 */ void MibSPI1_Pin_Init(void) { // 假设寄存器地址定义(请根据具体芯片手册修改) volatile uint32_t *SPIPC0 = (volatile uint32_t*)0xFFF7A014; volatile uint32_t *SPIPC1 = (volatile uint32_t*)0xFFF7A018; volatile uint32_t *SPIPC7 = (volatile uint32_t*)0xFFF7A030; volatile uint32_t *SPIPC8 = (volatile uint32_t*)0xFFF7A034; uint32_t reg_temp; // --- 步骤1: 配置引脚功能 (SPIPC0) --- reg_temp = *SPIPC0; // 清除相关位:CLKFUN(bit9), SIMOFUN0(bit10), SOMIFUN0(bit11), SCSFUN0(bit0) reg_temp &= ~((1UL << 9) | (1UL << 10) | (1UL << 11) | (1UL << 0)); // 设置为SPI功能引脚 reg_temp |= ((1UL << 9) | (1UL << 10) | (1UL << 11) | (1UL << 0)); *SPIPC0 = reg_temp; // --- 步骤2: (示例)配置未使用的SPI1SCS1为带上拉的输入GIO --- // 假设 SCSFUN1 是 bit1 reg_temp = *SPIPC0; reg_temp &= ~(1UL << 1); // SCSFUN1 = 0, GIO模式 *SPIPC0 = reg_temp; reg_temp = *SPIPC1; reg_temp &= ~(1UL << 1); // SCSDIR1 = 0, 输入方向 *SPIPC1 = reg_temp; reg_temp = *SPIPC7; reg_temp &= ~(1UL << 1); // SCSPDIS1 = 0, 使能上下拉控制 *SPIPC7 = reg_temp; reg_temp = *SPIPC8; reg_temp |= (1UL << 1); // SCSPSEL1 = 1, 选择上拉 *SPIPC8 = reg_temp; // --- 步骤3: 配置电气特性 (以SCS0为例,启用内部上拉) --- // SCS0现在是功能引脚,但在作为输入(空闲时)或需要确定状态时,配置上拉有益。 // 注意:对于功能引脚,当其为输入时,上下拉控制仍有效。 reg_temp = *SPIPC7; reg_temp &= ~(1UL << 0); // SCSPDIS0 = 0, 使能上下拉控制 (针对SCS0引脚) *SPIPC7 = reg_temp; reg_temp = *SPIPC8; reg_temp |= (1UL << 0); // SCSPSEL0 = 1, 选择上拉 (SCS0空闲时为高,符合低有效逻辑) *SPIPC8 = reg_temp; // 对于SOMI0(主设备输入),也可以考虑启用上拉,增强稳定性 reg_temp = *SPIPC7; reg_temp &= ~(1UL << 11); // SOMIPDIS0 = 0 *SPIPC7 = reg_temp; reg_temp = *SPIPC8; reg_temp |= (1UL << 11); // SOMIPSEL0 = 1 *SPIPC8 = reg_temp; // --- 步骤4: 配置SPI模块本身 (非SPIPCx寄存器,此处略写) --- // SPI1->SPIGCR1 = ... // 设置为主模式、使能循环缓冲等 // SPI1->SPICLK = ... // 设置时钟频率 // SPI1->SPIFMT0 = ... // 设置数据格式、时钟相位极性等 // SPI1->SPIGCR1 |= 0x01000000; // 最后使能SPI模块 (SPIENA) }

4.3 并行模式配置要点

如果你的设备支持并行引脚模式(例如8位并行),配置逻辑类似,但需要操作SIMOFUN[7:0]SOMIFUN[7:0]等位域。关键点在于:

  • 确保所有要使用的并行数据线(如SIMO[3:0])都在SPIPC0中设置为功能模式(1)。
  • 在SPI模块的格式寄存器(SPIFMTx)中,配置对应的数据宽度(如32位,对应8个并行字节)。
  • 硬件连接上,需要将多对SIMO/SOMI线分别连接到从设备。

5. 常见问题排查与调试心得

5.1 典型问题速查表

问题现象可能原因排查步骤与解决方法
SPI无时钟输出1.CLKFUN位未设置为1。
2. SPI模块未使能(SPIGCR1SPIENA位)。
3. 时钟分频系数过大或为0。
4. 顶层引脚复用未配置。
1. 检查SPIPC0.CLKFUN是否为1。
2. 检查SPIGCR1寄存器,确保主模式位和使能位已设置。
3. 检查SPICLK寄存器分频值。
4. 核对芯片手册,确认物理引脚是否已映射到SPI功能。
能发数据,但收不到从机回复1.SOMIFUN位未设置为1(主机SOMI是输入)。
2. 从机未正确响应(检查从机电源、片选、模式)。
3. 主机SOMI引脚内部上下拉配置冲突。
1. 检查SPIPC0.SOMIFUN0是否为1。
2. 用逻辑分析仪同时抓取主机CLK、MOSI、MISO、CS线,看从机是否在MISO上有数据输出。
3. 尝试禁用SPIPC7中SOMI的上下拉(SOMIPDIS0=1),或检查SPIPC8配置。
片选信号异常1.SCSFUN位配置错误。
2. 片选极性配置错误(SPIFMTx中的CSPOL)。
3. 多个片选信号间干扰。
1. 确认使用的SCSxSPIPC0中已配置。
2. 检查SPIFMTx寄存器中对应片选组的极性位。
3. 确保同一时刻只有一个片选有效。将不用的SCS引脚在SPIPC0中设为GIO模式并设置为输出高电平或输入带上拉。
通信电平不稳定,误码率高1. 引脚电气特性配置不当,特别是长距离或高干扰环境。
2. 未使用内部上拉,导致输入引脚悬空。
3. 开漏模式未外接上拉电阻。
1. 对于输入引脚(主机SOMI,从机SIMO),在SPIPC7/8中启用合适的内部上拉(通常上拉)。
2. 检查SPIPC6,如果使能了开漏(xxPDR=1),必须在外部接上拉电阻。
3. 降低SPI时钟频率测试。
配置了GIO输出,但引脚无输出1.xxFUN位仍为1(功能模式),覆盖了GIO设置。
2.xxDIR位未设置为1(输出模式)。
3. 输出数据寄存器xxDOUT值为0。
4. 开漏模式使能但外部无上拉。
1. 首先确保SPIPC0.xxFUN = 0
2. 确认SPIPC1.xxDIR = 1
3. 检查SPIPC3.xxDOUT或通过SPIPC4置位。
4. 检查SPIPC6.xxPDR,若为1则检查外部上拉电阻。

5.2 调试心得与高级技巧

  1. 寄存器视图调试法:在IDE(如Code Composer Studio)的调试模式下,将SPIPC0SPIPC8的地址添加到内存观察窗口。进行任何引脚操作后,直接观察这些寄存器的值是否按预期变化,这是最直接的调试手段。
  2. “功能模式”优先:当你想把一个SPI引脚用作普通GPIO时,务必先将SPIPC0中对应的xxFUN位清零,然后再去配置方向(SPIPC1)和数据(SPIPC3)。顺序反了可能会因为引脚处于功能模式而无法控制。
  3. 上电状态管理:芯片复位后,引脚状态是未定义的(可能是输入、可能是输出,可能有内部上拉)。在main()函数最开始,尽早初始化所有用到的引脚状态,特别是用作输出的引脚,避免在初始化完成前产生意外的电平跳变。
  4. 功耗敏感型应用:在电池供电设备中,将所有未使用的引脚(包括未使用的SPI引脚)配置为带上拉或下拉的输入模式,并输出固定电平(如果是输出),这是降低静态功耗的黄金法则。SPIPC7/8在这里大有用处。
  5. 理解“位镜像”:对于SIMO0SOMI0,操作bit10/11bit16/24是等效的,但手册明确说明了32位写时低位优先。为了代码可读性和避免潜在风险,始终坚持使用bit10(SIMOFUN0)和bit11(SOMIFUN0)进行配置。
  6. 并行模式下的数据对齐:使用并行模式时,数据在缓冲区中的存放顺序(是SIMO[0]对应最高位还是最低位)需要仔细对照手册和从设备要求进行配置,通常在SPIFMTx寄存器中有相关控制位。