
1. 项目概述与核心价值在工业电机控制、数字电源或者任何需要高精度、高实时性信号采集与处理的嵌入式系统中我们常常面临两个核心挑战一是如何在不同芯片甚至不同板卡之间建立一条可靠、高效且隔离的通信链路二是如何将前端传感器如电流传感器、旋转变压器输出的高速、低精度比特流实时、准确地转换为可供控制算法使用的数字量。AM263P这款高性能微控制器恰好提供了两把解决这些问题的“瑞士军刀”FSIFlexible Serial Interface和SDFMSigma Delta Filter Module。FSI并非一个简单的SPI或UART它是一种支持点对点、全双工、带硬件CRC/ECC校验和帧看门狗的高级串行接口特别适合在电气隔离环境下进行可靠的数据交换。而SDFM则是一个专为电机控制量身定制的四通道数字滤波器它能直接连接Σ-Δ调制器将1-bit的高速数据流通过可配置的Sinc滤波器转换成高分辨率的电流或位置信息是构建无传感器或高精度伺服系统的基石。很多工程师拿到芯片手册看到密密麻麻的寄存器描述和流程图往往会感到无从下手。手册告诉你“要这样做”但很少解释“为什么这样做”以及“实际做的时候坑在哪里”。本文就将结合我过去在多个电机驱动项目中的实战经验抛开官方文档的平铺直叙深入AM263P的FSI通信链路建立与SDFM模块配置的肌理之中。我会不仅告诉你配置步骤更会剖析每个步骤背后的设计意图分享寄存器配置的“最佳实践”以及调试过程中那些让人头疼的“坑”和解决之道。无论你是正在评估AM263P用于新项目还是正在调试现有的FSI或SDFM电路相信这篇详尽的解析都能为你提供清晰的路径和实用的参考。2. FSI通信链路建立从理论到可靠握手FSI的通信链路建立其核心目标是在两个可能独立上电、处于未知状态的设备之间建立一个干净、同步的通信上下文。这听起来简单但在没有额外硬件同步信号如片选、就绪信号的情况下仅通过数据线TX/RX和时钟线实现就需要一套精巧的软件协议。手册里提供的示例序列是骨架而我们要做的是为它填充上肌肉和神经。2.1 核心挑战与设计哲学为什么FSI的链路建立比普通SPI复杂关键在于其接收器的异步采样特性和隔离应用场景。FSI接收器在时钟的每个边沿都可能采样数据这意味着如果接收器内部逻辑没有在正确的时间点“对齐”到数据帧的起始边界它接收到的将是一堆乱码。在隔离场景下主、从设备的地平面是分开的上电顺序、复位释放时间都不可预测这种“失步”状态是常态。因此链路建立协议的本质是一个双向的“打招呼”和“确认”过程通过交换特殊的Ping帧帧标签为0000和0001来完成。这个过程必须足够健壮能处理对方未就绪、数据丢失、帧错误等各种异常情况。整个流程围绕着两个核心状态展开发送Flush序列清空接收管道以及验证收到的Ping帧标签。2.2 主设备链路建立流程深度解析让我们逐行拆解手册中的主设备流程并注入实际编程中必须考虑的细节。步骤1模块复位与释放// 假设基地址定义 #define FSITX_BASE (0x02000000U) #define FSIRX_BASE (0x02001000U) // 1. 断言核心复位 HW_WR_REG32(FSITX_BASE TX_MAIN_CTRL, 0xA501); // KEY0xA500, CORE_RST1 HW_WR_REG32(FSIRX_BASE RX_MAIN_CTRL, 0xA501); // KEY0xA500, CORE_RST1 // 插入少量延时确保复位稳定通常几个SYSCLK周期即可但保险起见可延时1us delay_us(1); // 2. 释放核心复位 HW_WR_REG32(FSITX_BASE TX_MAIN_CTRL, 0xA500); // KEY0xA500, CORE_RST0 HW_WR_REG32(FSIRX_BASE RX_MAIN_CTRL, 0xA500); // KEY0xA500, CORE_RST0注意这里用到了寄存器键保护Register Key Protection。对TX_MAIN_CTRL和RX_MAIN_CTRL等关键控制寄存器的写操作必须将特定的密钥例如0xA5xx与控制位一起写入否则写操作会被硬件忽略。这是防止软件跑飞后误修改配置的重要安全机制。步骤2配置发射器与接收器这是配置的大头决定了FSI的工作模式。以下是一个针对点对点、使能CRC、帧长32字的常见配置示例// 配置发射器 (FSITX) // 设置帧控制帧长32字使能CRC正常模式非环回 HW_WR_REG32(FSITX_BASE TX_FRMCTRL, 0xA50F); // KEY0xA500, FRAME_LENGTH31(即32字), CRC_EN1 // 配置时钟分频、极性等假设使用内部时钟分频 HW_WR_REG32(FSITX_BASE TX_CLKCTRL, 0xA500); // KEY0xA500, 默认设置具体根据时钟需求调整 // 配置接收器 (FSIRX) // 设置帧控制需与发射器匹配 HW_WR_REG32(FSIRX_BASE RX_FRMCTRL, 0xA50F); // KEY0xA500, FRAME_LENGTH31, CRC_EN1 // 使能帧错误中断和Ping帧接收中断 HW_WR_REG32(FSIRX_BASE RX_INTENA, 0xA503); // KEY0xA500, FRAME_ERR_INT_EN1, PING_RECV_INT_EN1实操心得务必确保主从双方的FRAME_LENGTH、CRC设置完全一致这是通信成功的基础。在调试初期可以暂时关闭CRC先确保基本数据流能通再打开CRC进行健壮性测试。步骤3设置接收器中断这一步的目的是让CPU或DMA知道“数据来了”。你需要配置MCU的中断控制器如NVIC将FSI RX的中断线映射到对应的中断服务程序ISR。在ISR中你需要读取RX_INTFLAG寄存器来判断中断来源是收到有效帧还是帧错误或是Ping帧。步骤4Ping循环——链路建立的核心这是一个需要耐心和超时处理的循环。其逻辑是主设备不断尝试“唤醒”从设备直到收到正确的回应。#define MAX_PING_ATTEMPTS 1000 #define PING_RESPONSE_TIMEOUT_US 1000 // 1ms超时 uint32_t attempts 0; bool link_established false; while ((attempts MAX_PING_ATTEMPTS) !link_established) { // 4.1 发送Flush序列 // Flush序列通常是通过发送特定数量的空闲时钟周期来实现具体方式需查阅时钟控制寄存器。 // 一种常见方法是短暂禁用再使能发射器或发送一帧全0数据。这里假设调用一个API。 fsi_send_flush_sequence(); // 4.2 发送标签为0000的Ping帧 HW_WR_REG32(FSITX_BASE TX_PINGTAG, 0xA500); // KEY0xA500, PINGTAG0 // 触发Ping帧发送具体寄存器位可能为TX_CTRL.SEND_PING HW_WR_REG32(FSITX_BASE TX_CTRL, 0xA501); // 假设BIT0为发送Ping // 4.3 等待一段时间 delay_us(PING_RESPONSE_TIMEOUT_US); // 4.4 检查FSIRX是否收到有效的Ping帧 uint32_t rx_status HW_RD_REG32(FSIRX_BASE RX_STATUS); if ((rx_status RX_VALID_PING_RECV_MASK) 0) { attempts; continue; // 未收到继续循环 } // 4.5 检查收到的Ping帧标签是否为0001从设备的回应 uint32_t recv_tag (HW_RD_REG32(FSIRX_BASE RX_PINGTAG) 0xF); if (recv_tag 0x1) { link_established true; break; // 收到正确回应链路建立成功 } else { // 收到其他标签可能是噪声或错误清中断标志继续尝试 HW_WR_REG32(FSIRX_BASE RX_INTCLR, 0xFFFF); // 清除所有中断标志 attempts; } } if (!link_established) { // 链路建立失败需进行错误处理如报警、重试或降级运行 }关键点解析Flush序列它的作用是产生足够的时边沿确保从设备接收器内部的移位寄存器被清空从而能正确识别下一帧数据的起始位。具体实现高度依赖硬件有时需要向TX数据寄存器写入特定模式并触发发送。超时与重试MAX_PING_ATTEMPTS和PING_RESPONSE_TIMEOUT_US是重要的工程参数。超时时间必须大于从设备上电、初始化、处理并响应的最长时间。重试次数决定了系统的坚韧度。中断标志清除每次处理完中断条件后必须清除相应的中断标志位否则会持续进入中断。步骤5发送标签为0001的Ping帧当主设备收到标签0001的Ping帧后说明从设备已就绪并确认了主设备的存在。此时主设备再发送一个标签为0001的Ping帧作为最终确认。至此双向握手完成。if (link_established) { HW_WR_REG32(FSITX_BASE TX_PINGTAG, 0xA501); // KEY0xA500, PINGTAG1 HW_WR_REG32(FSITX_BASE TX_CTRL, 0xA501); // 发送Ping // 此时链路已建立可以开始正常的应用数据通信 }2.3 从设备链路建立流程解析从设备的流程是一个被动的“监听-响应”过程。它上电后就一直在等待主设备的“召唤”标签0000的Ping帧。步骤1-3与主设备类似进行模块复位、基础配置和中断使能。步骤4-6等待并验证主设备的Ping从设备陷入一个等待循环持续检查接收中断。一旦收到有效Ping帧立即检查标签。while(1) { // 等待接收中断通过轮询RX_INTFLAG或实际中断服务程序 if (rx_interrupt_occurred) { uint32_t int_flags HW_RD_REG32(FSIRX_BASE RX_INTFLAG); clear_interrupt_flags(); if (int_flags RX_VALID_PING_RECV_MASK) { uint32_t recv_tag (HW_RD_REG32(FSIRX_BASE RX_PINGTAG) 0xF); if (recv_tag 0x0) { break; // 收到主设备的初始Ping跳出循环 } else { // 收到非预期标签丢弃继续等待 continue; } } } }步骤7-8响应主设备收到正确的初始Ping后从设备先发送自己的Flush序列清空主设备可能的残留状态然后立即发送标签为0001的Ping帧作为回应。fsi_send_flush_sequence(); // 发送从设备侧的Flush HW_WR_REG32(FSITX_BASE TX_PINGTAG, 0xA501); // 准备回应标签 HW_WR_REG32(FSITX_BASE TX_CTRL, 0xA501); // 发送回应Ping步骤9-11等待主设备确认发送回应后从设备需要等待主设备发回的确认Ping标签也应为0001。这里有一个细微但重要的点由于通信延迟从设备可能在发出自己的0001帧后立刻又收到一个主设备发来的0000帧这是主设备在重试循环中发出的下一个探测帧。因此判断逻辑是如果收到0001说明握手成功如果又收到0000则忽略它继续等待0001。bool remote_link_ok false; while (!remote_link_ok) { // 等待下一个接收中断 if (rx_interrupt_occurred (int_flags RX_VALID_PING_RECV_MASK)) { uint32_t recv_tag (HW_RD_REG32(FSIRX_BASE RX_PINGTAG) 0xF); if (recv_tag 0x1) { remote_link_ok true; // 收到主设备的确认链路建立 } else if (recv_tag 0x0) { // 收到主设备新的探测帧忽略继续等待确认 clear_interrupt_flags(); continue; } } }2.4 寄存器保护机制详解AM263P的FSI模块提供了两级寄存器保护这对于功能安全Functional Safety应用至关重要。寄存器键保护Register Key Protection如前所述对特定控制寄存器的写操作必须将高字节写成密钥如0xA5低字节为实际数据。例如写0xA501到TX_MAIN_CTRL其中0xA5是密钥0x01表示置位CORE_RST。写0x0001是无效的。这防止了指针错误等软件故障导致的误配置。控制寄存器锁保护Control Register Lock这是一个更全局的锁。一旦通过写TX_LOCK_CTRL或RX_LOCK_CTRL寄存器同样需要密钥上锁所有受保护的控制寄存器都将变为只读无法再被修改。此锁只能通过硬件复位SYSRSn或对FSI模块的外设软复位寄存器DEV_CFG_REGS.SOFTPRESx写操作来解除。这意味着在关键任务阶段你可以锁死配置防止任何意外更改只有系统级复位才能解锁极大地增强了配置的稳定性。避坑指南在调试阶段建议先不要使能控制寄存器锁。待所有配置调试稳定后再在应用程序初始化最后阶段上锁。否则每次修改配置都需要进行软复位会极大降低调试效率。3. SDFM模块配置将比特流转化为高精度数据SDFM是电机控制系统的“感官神经”负责将Σ-Δ调制器输出的高速、低精度1-bit串行数据流转换为低速、高精度的数字样本。理解其内部数据通路和配置逻辑是发挥其性能的关键。3.1 SDFM系统架构与数据流一个SDFM模块包含4个完全独立的滤波器通道。每个通道的简化数据流如下SDFMy_Dx (1-bit 数据流) -- [输入控制单元] -- |-- 主滤波器 (数据滤波器) -- SDDATFIFOx (FIFO) -- CPU/DMA |-- 副滤波器 (比较器滤波器) -- 比较逻辑 (HT/LT/HTZ) -- 中断/触发 SDFMy_CLKx (时钟) -------^输入控制单元负责采样数据流。关键配置是SDCTLPARMx.MOD位必须设置为0表示数据在时钟上升沿被锁存。这是最常用的模式与绝大多数Σ-Δ调制器兼容。主滤波器核心是Sinc滤波器负责高精度数据转换。输出为26位有符号整数可通过配置选择输出16位或32位格式。副滤波器另一个独立的Sinc滤波器但输出用于快速比较产生过流、欠流、过零等保护或触发信号响应速度比主滤波器读取更快。FIFO位于主滤波器后用于缓冲数据降低CPU中断频率。3.2 关键配置步骤与参数计算配置SDFM不是简单地填寄存器而是一系列相互关联的参数决策。我们以一个典型的电机相电流采样为例使用Sinc3滤波器调制器时钟10MHz目标带宽~20kHz。步骤1引脚与时钟配置首先需要通过PinMux将对应的GPIO引脚配置为SDFM功能SDFMy_Dx和SDFMy_CLKx。重要警告SDFMy_CLKx时钟引脚直接驱动SDFM内部逻辑任何毛刺或振铃都可能导致数据损坏。PCB设计时必须在时钟线上采取措施如串联端接电阻22-33Ω典型值以匹配阻抗减少反射并让时钟线远离噪声源如PWM功率线。如果外接的Σ-Δ调制器数据变化边沿与AM263P预期相反调制器在时钟上升沿变化数据而SDFM在上升沿采样则需要利用GPIO的反相功能配置GPxINV寄存器对SDFMy_CLKx引脚进行反相而不是去改数据线。步骤2滤波器类型与过采样率OSR选择这是决定性能的核心。主滤波器和比较器滤波器可以独立选择Sinc1/2/3/Fast类型和OSR。主滤波器OSRDOSR决定输出数据速率和分辨率。数据速率 调制器时钟 / DOSR。例如10MHz时钟DOSR256数据速率为39.0625 kSPS每秒千样本。滤波器延迟延迟 滤波器阶数 / 数据速率。Sinc3的阶数为3。因此上述配置的延迟 3 / 39.0625k ≈ 76.8 µs。这个延迟在电流环控制中必须被考虑它构成了从采样到算法可用的总延迟的一部分。比较器滤波器OSRCOSR通常设置得比DOSR小以获得更快的响应速度用于保护。例如设置COSR32则比较器数据速率为312.5 kSPS延迟更短。选择依据带宽 vs 分辨率 vs 延迟。更高的OSR和更高阶的滤波器如Sinc3能提供更好的噪声抑制和更高分辨率但数据速率更低延迟更大。需要根据控制环路的带宽需求来折中。对于大多数电机控制Sinc3配合DOSR128或256是常见选择。步骤3数据输出格式与移位控制主滤波器输出是26位有符号数。你可以选择以32位或16位格式读取。32位格式设置SDDPARMx.DR 1。数据完整存储在SDDATx寄存器中无需担心精度损失。这是最简单的方式。16位格式设置SDDPARMx.DR 0。但26位数据需要被压缩到16位-32768 到 32767。这时就必须配置SDDPARMx.SH移位控制位。这是最容易出错的地方SH位的意义是右移位数。例如对于Sinc3DOSR128其峰值输出范围约为±2,097,152。为了将其适配到16位范围需要右移7位除以128得到范围约为±16384这在16位有符号数范围内。手册中的表7-192就是为此而生。务必根据你选择的滤波器类型和DOSR查表确定正确的SH值否则读到的数据将毫无意义。步骤4FIFO与同步事件配置为了减轻CPU负担强烈建议使用FIFO。使能FIFOSDFIFOCTLx.FFEN 1。设置FIFO中断水平SDFIFOCTLx.SDFFIL。例如设为8表示当FIFO中积累8个新数据样本时才产生一次中断。使能FIFO中断SDFIFOCTLx.FFIEN 1并配置中断路由。等待同步Wait-for-Sync这是与PWM驱动同步采样的关键在电机控制中我们希望在PWM开关事件的特定时刻例如PWM中点进行电流采样以避开开关噪声。可以配置SDDFPARMx.SDSYNCEN 1并选择对应的PWM SOCA/B信号作为同步源通过SDSYNCx.SYNCSEL选择。当使能SDSYNCx.WTSYNCEN 1后FIFO会忽略所有数据就绪事件直到收到指定的PWM同步信号之后才开始填充FIFO。这确保了所有采样点都与PWM周期严格对齐。步骤5比较器配置副滤波器用于快速比较实现硬件级的实时保护。配置比较器滤波器的类型和COSR。设置高阈值COMPH1,COMPH2和低阈值COMPL1,COMPL2寄存器。这些值是基于比较器滤波器的输出标度而非主滤波器。需要根据COSR和滤波器类型计算。配置比较器中断使能例如过值CMPHIE或欠值CMPLIE中断。还可以使能阈值过零比较器HTZ用于频率或占空比测量。3.3 配置代码示例与注释以下是一个配置SDFM通道0的示例代码片段假设使用Sinc3滤波器DOSR25632位输出使能FIFO并与PWM0.SOCA同步。// SDFM1 通道0 基址定义 (示例) #define SDFM1_BASE (0x02700000U) #define SDCTLPARM0 (SDFM1_BASE 0x00) #define SDDFPARM0 (SDFM1_BASE 0x04) #define SDDPARM0 (SDFM1_BASE 0x08) #define SDFIFOCTL0 (SDFM1_BASE 0x0C) #define SDSYNC0 (SDFM1_BASE 0x10) #define SDMFILEN (SDFM1_BASE 0x40) // 主滤波器使能寄存器 // 1. 输入控制单元配置模式0时钟上升沿采样数据 HW_WR_REG16(SDCTLPARM0, 0x0000); // MOD[1:0] 00 // 2. 主滤波器配置使能滤波器Sinc3类型DOSR256 uint16_t sddfparm0_val 0; sddfparm0_val | (1 0); // FEN 1, 使能滤波器 sddfparm0_val | (3 1); // FILT_SEL[1:0] 11, Sinc3 sddfparm0_val | (255 8); // DOSR[7:0] 255 (实际DOSR 寄存器值1所以是256) HW_WR_REG16(SDDFPARM0, sddfparm0_val); // 3. 数据输出配置32位格式无需移位 HW_WR_REG16(SDDPARM0, (1 0)); // DR 1, 32位输出 // 4. FIFO配置使能FIFO中断水平设为8使能FIFO中断 uint16_t sdfifoctl0_val 0; sdfifoctl0_val | (1 0); // FFEN 1 sdfifoctl0_val | (1 1); // FFIEN 1 sdfifoctl0_val | (8 8); // SDFFIL[4:0] 8积累8个样本后中断 sdfifoctl0_val | (1 15); // DRINTSEL 1, 数据就绪中断源选择FIFO中断 HW_WR_REG16(SDFIFOCTL0, sdfifoctl0_val); // 5. 同步配置使能SDSYNC选择PWM0.SOCA作为同步源 uint16_t sdsync0_val 0; sdsync0_val | (1 0); // SDSYNCEN 1 sdsync0_val | (0 8); // SYNCSEL[5:0] 0, 对应PWM0.SOCA (查表7-193) sdsync0_val | (1 14); // WTSYNCEN 1, 使能等待同步 HW_WR_REG16(SDSYNC0, sdsync0_val); // 6. 全局使能主滤波器 (也可以通过SDMFILEN.MFE位同时使能所有通道) HW_WR_REG16(SDMFILEN, 0x0001); // 使能通道0的主滤波器 // 或者使用 MFE: HW_WR_REG16(SDMFILEN, (1 8)); // 同时使能所有4个通道的主滤波器4. 实战调试技巧与常见问题排查理论配置完成后真正的挑战在于调试。以下是我在多个项目中总结出的常见问题点及其排查思路。4.1 FSI通信链路建立失败现象主从设备始终无法完成Ping帧握手卡在循环中。检查1物理层。这是首要步骤。用示波器或逻辑分析仪测量FSI_TX和FSI_CLK信号。确认时钟频率是否符合配置检查时钟分频寄存器数据线是否有正确的数据波形信号质量是否干净无过冲、振铃。在隔离应用中确保隔离器两侧电源已稳定。检查2基本配置一致性。确认主从双方的FRAME_LENGTH、CRC模式、时钟极性/相位是否完全一致。一个字节的差异都会导致通信失败。检查3Flush序列实现。这是最容易出错的软环节。确认你实现的Flush序列确实产生了足够多的时钟边沿通常需要超过一帧长度的空闲时钟。可以尝试增加Flush的持续时间或重复次数。检查4中断处理。确保接收中断已正确使能并且中断服务程序正确读取并清除了中断标志。在调试初期可以改用轮询模式不断查询RX_STATUS寄存器来排除中断配置问题。检查5超时时间。如果从设备初始化较慢例如需要加载配置、校准等主设备的等待超时时间PING_RESPONSE_TIMEOUT_US可能太短。尝试将其显著增加例如到10ms。4.2 SDFM无数据输出或数据异常现象配置了SDFM但读取SDDATx或FIFO始终为0或数据值明显不合理如恒定最大值/最小值。检查1时钟与数据信号。使用示波器测量SDFMy_CLKx和SDFMy_Dx引脚。确保时钟信号存在且频率正确数据信号随时钟变化。确认数据与时钟的相位关系是否符合MOD0的设定数据在时钟上升沿稳定。检查2滤波器使能与同步。确认SDDFPARMx.FEN已置1或者SDMFILEN.MFE已置位。如果使用了“等待同步”模式WTSYNCEN1需要确认预期的PWM SOC事件是否确实发生。可以暂时禁用WTSYNCEN看是否有数据持续产生。检查3输入限定。如果信号有噪声可以尝试使能输入同步器SDCTLPARMx.SDCLKSYNC和SDDATASYNC但这要求SDFM的PLL时钟已配置。注意这会引入额外的同步延迟。检查416位输出移位。如果使用16位输出模式百分之九十的问题出在SDDPARMx.SH位配置错误。再次核对表7-192根据你的DOSR和滤波器类型确认移位值是否正确。一个快速验证方法是切换到32位输出模式DR1看数据是否正常。如果正常则问题必定在移位置或16位数据读取环节。检查5FIFO状态。如果通过FIFO读取检查SDFIFOCTLx.SDFFSTFIFO状态位是否大于0。如果始终为0说明数据没有进入FIFO。检查FIFO是否使能FFEN1以及数据就绪中断是否被正确映射DRINTSEL。4.3 SDFM数据噪声大或跳动剧烈现象数据有输出但噪声很大或者在零值附近无规律跳动。检查1电源与地。SDFM用于处理微弱的模拟信号转换后的数字流对电源噪声敏感。确保模拟部分Σ-Δ调制器和数字部分AM263P的电源去耦良好地平面连接干净。模拟地和数字地之间使用磁珠或0欧电阻单点连接。检查2时钟质量。SDFMy_CLKx时钟的抖动Jitter会直接转换为输出噪声。确保时钟源通常是PWM或专用时钟芯片干净、稳定。测量时钟的周期抖动。检查3OSR与滤波器类型。噪声根本上是由于滤波不足。尝试增加DOSR例如从128增加到256或者使用更高阶的滤波器从Sinc2切换到Sinc3。这将以增加延迟为代价换取更好的噪声抑制。检查4Σ-Δ调制器参考电压。确保给Σ-Δ调制器的参考电压Vref干净、稳定。这是转换的基准其噪声会直接体现在输出中。4.4 寄存器写入无效现象通过调试器或代码写入配置寄存器但读回的值未改变或模块行为不符合预期。检查1寄存器键保护。你是否在写入控制寄存器时包含了正确的密钥高字节0xA5例如写0x0001到TX_MAIN_CTRL是无效的必须写0xA501。检查2控制寄存器锁。是否意外或在前次运行中设置了TX_LOCK_CTRL或RX_LOCK_CTRL如果锁已设置任何对受保护寄存器的写操作都会被忽略。检查锁状态必要时执行软复位。检查3位字段位置。仔细核对参考手册确认你操作的位在寄存器中的正确位置。有时使能位是第0位有时是第1位容易混淆。调试是一个系统性工程。建议遵循“由简入繁”的原则先让FSI在不隔离、低速率、无CRC的情况下通起来先让SDFM在32位输出、禁用FIFO、禁用同步的模式下读出数据。等基本功能验证后再逐步增加复杂度隔离、CRC、FIFO、同步、比较器每步都进行验证。善用芯片的调试功能如实时读取寄存器并结合示波器观察关键信号能让你快速定位问题所在。