尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

TC3xx SPI多从机通信中DMA与片选配置的实战解析

TC3xx SPI多从机通信中DMA与片选配置的实战解析 TC3xx项目里一旦把SPI挂到AUTOSAR框架下很多原本“手动操作寄存器”的习惯就得彻底改掉。尤其是多从机场景DMA的搬运方式、片选的拉高拉低时机、Job的优先级编排、甚至MCAL里几行看起来不起眼的配置都可能决定整个通信链路是稳定跑通还是间歇性抽风。这篇文章不是我翻译某份用户手册而是把我在AURIX TC3xx上做SPI多从机通信时踩过的坑、查过的寄存器、改过的配置按“为什么这么做”的逻辑重新梳理一遍。无论你是在EB tresos里做MCAL配置还是直接操作寄存器写驱动这篇内容应该都能对得上号。1. 为什么TC3xx的SPI多从机通信特别容易出问题先说一个很多从STM32转过来的工程师容易忽略的差异。TC3xx的SPI模块不叫SPI官方叫QSPIQueued Synchronous Peripheral Interface它有一套自己的消息队列、优先级和FIFO机制而且它的FIFO不像STM32那样“发送一个字节就自动从缓冲区取下一个”数据传输的启停、DMA触发的节奏、片选信号的关联逻辑全部依赖配置层面的严格控制。这些问题在单从机通信时还不明显一旦接入多个从机加上AUTOSAR的调度管理整套东西就会暴露出非常多隐蔽的坑。多从机通信的第一个矛盾点在于片选信号。TC3xx的QSPI模块通常有SLSO引脚输出硬件片选但实际项目里多个从机的片选引脚数量往往不够用或者片选信号在PCB上绕了很远的路径需要靠普通GPIO做软件片选。这两种方式在AUTOSAR框架下都有各自的麻烦硬件片选如果配置不好DMA传输结束和片选拉高之间存在时间差就可能出现从机还在等时钟边沿、主机已经把CS拉高的错位问题软件片选更麻烦你必须在DMA搬运数据之前手动拉低CS在最后一个字节移位完成之后延时再拉高CS这个延时的计算直接影响可靠性。第二个矛盾点是DMA的触发和数据的“搬运完成”并不总是同步的。TC3xx的DMA模块可以配置为在SPI的TX FIFO空、RX FIFO非空、传输完成等不同事件下触发。很多人以为“DMA传输完成就等于SPI字节发送完成”这在单次传输中近似成立但在连续传输或Job切换时这个假设会带来灾难。比如你配置了DMA continuous requestsDMA会把数据源源不断搬进TX FIFO此时片选还低着你觉得下一个从机的片选信号已经拉高了其实最后一个字节还在移位寄存器里没出来此时如果立刻去操作GPIO拉高CS从机端收到的最后一个字节往往是残缺的或者CRC校验直接失败。第三个矛盾点是AUTOSAR的分层机制。你在MCAL的Spim驱动里配置了Channel、Job、Sequence但实际调用的时候BSW上层可能已经做了一层队列调度不是说你调用Spim_SyncTransmit就真的同步执行完了特别是涉及多个Sequence的时候底层可能通过中断把传输切成了几段。这种情况下你再用“读取某个寄存器的标志位来判断传输是否完成”的办法很容易读到过期的状态从而误判通信结果。这个问题本质上不是某个单一环节的疏漏而是“TC3xx的硬件机制”和“AUTOSAR的调度机制”叠加在一起后产生的新问题。所以我下面从四个方向来拆解整体方案怎么设计、DMA怎么配置、片选怎么切换、典型故障怎么排查。1.1 多从机通信的方案选型逻辑先说方案选型。多从机通信一般有两种路线一种是所有从机共用同一组SCLK、MOSI、MISO每个从机单独一条CS信号这是标准的SPI菊花链之外的常见接法另一种是菊花链所有从机共用一条CS数据从第一个从机串到下一个。TC3xx的QSPI都支持这两种但AUTOSAR框架下绝大多数量产项目用第一种也就是独立片选的形式。原因有两条第一菊花链对从机芯片有特殊要求不是所有传感器或执行器都支持这种级联第二菊花链的数据更新周期拉长每个从机要等整个链上的数据都移位完才能更新自己的输出寄存器这在实时性要求高的场景下不够友好。独立片选中核心设计点在于MCAL的SpimChannel配置如何对应到硬件引脚关系。TC3xx的QSPI模块通过SLSO0到SLSO3引出多路硬件片选但如果用GPIO软件片选你要在MCAL里把这些GPIO的手动控制能力暴露给应用层或者在BSW里封装一个专门做片选切换的接口。我建议这种方式不要自己在应用层裸操作GPIO寄存器因为AUTOSAR的Port驱动有自己的引脚所有权管理绕过它操作寄存器轻则引脚状态不对重则和MCAL的配置冲突导致系统异常。1.2 AUTOSAR框架对DMA和片选的实际约束AUTOSAR框架对DMA和片选的约束表面上来自ECUC参数实际上来自MCAL驱动的实现方式。在Spim驱动里每个Channel可以配置为内部缓冲区模式或外部DMA模式ExternalDevice和InternalDevice的差别很大。InternalDevice通常用于单个或少量数据的手动收发数据走内部RAM缓冲ExternalDevice则允许你把DMA通道挂到SPI上由DMA自动完成数据搬运。片选方面AUTOSAR的SpimDriver支持每个Channel选择自己的片选控制方式可以是硬件自动片选由QSPI模块控制SLSO也可以是软件控制片选由Port管脚手动拉高拉低。但要注意这两者的生效时机不同。硬件片选下QSPI外设在传输开始时自动拉低SLSO在传输结束后自动拉高软件片选下传输的启动不会自动控制CS你必须额外调用Port接口或手动写寄存器。也就是说如果你把Channel配置成了软件片选却没有在Job开始前拉低片选那总线上的数据从机根本不会接收此时大概率会读回全FF或者随机数据。2. TC3xx QSPI模块的底层机制与AUTOSAR的映射关系想要在AUTOSAR框架下把DMA和片选配置对不能只知道怎么填EB tresos的配置项还得知道QSPI模块底层在工作时到底发生了什么。我在调试时习惯先回归到寄存器级理解时序再对照AUTOSAR的配置项这样遇到诡异问题才能判断到底是哪一层出的错。2.1 QSPI的工作模式与FIFO行为TC3xx QSPI的工作模式分成Master和Slave多从机通信一定是Master模式。Master模式下QSPI提供一个发送FIFOTX FIFO和一个接收FIFORX FIFO数据和状态位的推进由移位时钟控制。它不像软件模拟SPI那样用延时控制时序而是由一个可编程的波特率发生器产生SCLK所有数据移位都跟随这个时钟边沿。QSPI的FIFO深度在不同型号上不一样有些TC3xx型号的TX FIFO深度是8个数据条目有些是16个。这意味着你在配置DMA批量传输的时候不能一次性把几百个字节全填进FIFODMA会把数据源源不断地搬进来但FIFO满了以后硬件会自动拉高流量控制信号让DMA暂停。如果DMA配置里没有处理这种流控暂停某些TC3xx的DMA会在FIFO满时产生总线访问错误或者丢数据。我在项目里遇到过一个很隐蔽的情况配置了固定长度的DMA传输源地址数据长度和SPI Channel的DataWidth不匹配。Channel配置的是8位数据宽度而DMA传输配置的unit size是32位这时DMA每搬运一次其实搬运了4个数据条目最后一个条目只有前8位有数据后面24位是随机垃圾结果从机收到了一堆错位数据。分析半天才反应过来是DMA的transfer unit和SPI的数据宽度对不上。2.2 AUTOSAR SpimChannel、Job、Sequence三级结构怎么理解AUTOSAR的SPI驱动把通信过程抽象成了三层Channel是最基本的数据交换单位一个Channel对应一组确定的数据缓冲区和确定的通信参数Job是一组Channel的集合它们共享同一个片选信号或同一个通信上下文Sequence是按顺序执行的Job队列实现多个片选信号的切换和多个从机的轮询。这个三层模型很关键因为DMA和片选的配置粒度全都嵌在这三层里。片选信号本质上是Job级别或Channel级别的属性因为相同片选下可以挂多个Channel比如先给从机A发命令再读从机A的数据这两次传输共用一个CS信号就可以做成两个Channel在同一个Job里。DMA通道则更多绑定在Channel级别因为每个Channel的数据缓冲区不同DMA的服务函数指针也不同。实操中我最常遇到的问题是有人把一个Sequence里的多个Job理解成“连续执行”但实际上AUTOSAR的Sequence执行是有调度粒度的每个Job执行完后可能有中断处理、可能有上层回调、可能还有缓冲区的同步等待。如果在Job之间做片选切换一定要确保前一Job的数据已经从移位寄存器完全送出去而不仅仅是从TX FIFO发送完。这里有个简单粗暴的判断方法在Spim回调或中断里检查QSPI的STATUS寄存器中的BUSY位确认SPI外设完全空闲后再切换片选才是真正安全的。3. DMA配置的细节与连续传输的实现DMA配置是TC3xx SPI多从机通信里技术含量最高、也最容易翻车的部分。AUTOSAR虽然抽象了很多细节但DMA的配置参数仍然会直接暴露在MCAL的Dma驱动和Spim驱动的外部DMA配置项里。这一节我详细讲讲DMA通道怎么选、传输触发怎么设置、连续请求怎么理解以及多从机时DMA服务函数怎么配合片选切换。3.1 DMA通道选择与触发源绑定TC3xx的DMA模块有多个DMA通道每个通道可以配置独立的触发源。对SPI通信来说一般选择以下几种触发源TX FIFO空发送缓冲区为空可以向FIFO写入新数据、RX FIFO非空接收到数据可以从FIFO读走、传输完成事件当前数据传输结束、错误事件等。这些触发源对应到AUTOSAR Dma驱动里通常体现为DmaChannel的InterruptEnable和TransferStart、TransferEnd事件配置。我的经验是发送方向用TX FIFO空触发接收方向用RX FIFO空或接收事件触发两个方向各用一个DMA通道。SPI是同步协议发送和接收同时进行如果你只用了一个DMA通道做发送接收数据就存在RX FIFO里没人搬除非你配置了中断去读。所以“SPI需要两个DMA吗”这个问题在TC3xx多从机大批量数据通信场景下答案通常是“需要”除非你的数据量很小可以容忍每次都用CPU手动读。两个DMA通道同时工作时还有一个优先级问题。TC3xx的DMA通道优先级是编号越小优先级越高还是可以通过寄存器配置取决于具体型号的DMA实现。我遇到过发送DMA和接收DMA同时被触发结果接收DMA因为优先级设置不当一直抢不到总线访问权导致RX FIFO溢出数据被新数据覆盖。解决方法是把接收DMA的优先级设置得比发送DMA高或者根据实际总线的繁忙程度调整DMA的仲裁机制。3.2 DMA continuous requests的含义与使用陷阱DMA的Continuous Requests这个参数在SPI通信里非常关键但也非常容易被误解。它的本意是当前DMA传输完成后如果传输源和目标地址的设置仍然满足继续搬运的条件DMA会自动重新发起传输请求不需要软件再次触发。这在SPI发送长数据块时确实很有用可以让DMA把一个大缓冲区拆成多个小传输连续搬运直到计数归零。但问题是很多AUTOSAR MCAL配置工具里这个参数需要和“传输模式”配合使用。如果设置成Continuous Requests但DMA传输模式设置成了Single或是OneShot行为就可能不对。我踩过的坑是把发送DMA配成了Continuous Requests结果SPI多从机切换时前一个从机还没复位完成后一个从机的片选已经拉低DMA还在往TX FIFO写上一个从机的数据导致后一个从机收到了脏数据。在需要“每次传输只处理固定字节数然后换从机”的场景下建议把DMA设成Single模式即每次传输完成就停软件处理完片选切换后重新启动下一次DMA传输。这样虽然多了一些CPU介入但可靠性显著提升。如果你的数据吞吐量确实大到CPU扛不住那就要认真设计多缓冲区和DMA描述符链而不是简单依赖Continuous Requests。3.3 DMA双缓冲与多从机数据隔离DMA双缓冲在SPI通信中主要用于连续高速接收场景。它的原理是准备两个接收缓冲区DMA在其中一个缓冲区满时自动切换写入另一个同时CPU可以处理已满的缓冲区相当于流水线式处理。TC3xx的DMA支持这种双缓冲机制AUTOSAR Dma驱动也暴露了相应配置。但在多从机场景下双缓冲引入了一个新的复杂性片选切换的时间点和缓冲区切换的时间点不同步。比如从机A的数据还没填满缓冲区的一半片选就被拉高切换到了从机B这时从机A的数据只有一部分在缓冲区里另一部分是零碎的垃圾数据。如果在应用层只按“这个缓冲区满了”来判断数据完整性就会导致大量的数据错位。我的做法是多从机通信中除非某个从机的数据量非常固定且足够大否则不要用双缓冲直接用“每次传输指定固定长度”的单次接收DMA收到多少就是多少判断也简单。真正的双缓冲应用场景是同一个从机持续高速回传数据比如ADC采样数据流或图像传感器数据流那种场景才适合把双缓冲的流水线优势发挥出来。4. 片选切换的实现策略与AUTOSAR下的调用方式片选切换是整个多从机通信里最像“艺术”的部分。硬件片选和软件片选各有支持者但在TC3xx上你需要非常清楚地知道AUTOSAR的驱动接口在什么时机帮你做了什么什么时机需要你自己额外处理。4.1 硬件片选SLSO与软件片选GPIO的取舍硬件片选指的是QSPI模块通过SLSO引脚自动控制CS信号。优点很明显CS信号与SCLK的时序关系由硬件保证SCLK停止时CS才拉高这对从机来说是非常规范的电平信号。缺点是TC3xx的QSPI模块提供的硬件片选引脚数量有限通常一个QSPI外设只引出少量的SLSO引脚如果从机数量多你仍然需要扩展到GPIO。软件片选则是通过普通GPIO手动拉高拉低CS。优点是引脚选择灵活想用哪个引脚都行缺点是CS的拉高拉低时机必须由软件计算好而且CS信号与SCLK的关系得不到硬件保证。假如你在DMA还在往TX FIFO写数据时提前拉高了CS从机就会在传输中失去片选通信直接失败。在硬件资源允许的情况下我的建议是首选硬件片选尤其是SPI时钟频率较高比如10MHz以上的时候软件片选的时序抖动会非常致命。只有在硬件引脚不够用或者PCB走线特别受限时才退回到软件片选同时把SPI时钟适当降低给软件留出足够的操作时间。4.2 AUTOSAR中ExternalDevice与InternalDevice对片选时机的影响AUTOSAR的Spim驱动里片选时机会受到Channel类型的影响。InternalDevice模式下SPI驱动通常在发送命令前自动处理片选拉低在发送结束后自动拉高整个过程由MCAL内部管理应用层不太能干预。ExternalDevice模式下MCAL可能直接根据DMA和硬件状态来控制片选也可能要求应用层在Job执行前后手动处理片选。这里有一个很多教程没细说的点ExternalDevice不一定等于“必须软件片选”。ExternalDevice指的是这个Channel对应的数据缓冲区在外部比如DMA缓冲区片选的机制还是由Spim驱动配置的Hardware或Software控制决定。所以你在EB tresos里能看到两个维度一个是DeviceType一个是ChipSelectMode这两者是独立的。我把它们组合使用过四种情况确实只有“ExternalDevice Hardware其实”和“InternalDevice Software”两种组合看起来比较自然另外两种组合不是不能用而是因为交互复杂容易出问题。4.3 多从机轮询模式下的片选切换时序设计多从机轮询时最常见的做法是从机1拉低CS、发命令、读数据、拉高CS然后从机2拉低CS、发命令、读数据、拉高CS如此循环。看起来简单但时序上有三个关键节点必须抠死。第一个节点是CS拉低到第一个SCLK边沿的时间CS setup time。从机芯片规格书里通常会写这个时间最小值比如100ns。MCAL配置里通常不直接暴露这个参数但你可以通过调整SPI的Idle delay或Delay after transfer参数来实现。TC3xx的QSPI控制寄存器里有调整信号延时和空闲时间的字段。第二个节点是最后一个SCLK边沿到CS拉高的时间CS hold time。这个时间如果太短从机可能在最后一个数据位还没稳定锁存时就看到CS拉高直接丢弃最后字节。我在调试时遇到过一个从机它的内部移位寄存器在CS上升沿才把数据锁存到输出寄存器如果CS hold时间不够它会丢掉命令的最后一个字节导致寄存器地址错位读数全是垃圾。第三个节点是CS拉高后到下一次CS拉低的最小空闲时间CS deselect time。这个时间主要是给从机内部状态机复位用的。我的经验是无论从机规格书有没有明确写出都至少留1us以上的空闲时间尤其是从机内部有模拟前端或状态机逻辑的情况下。5. 实操EB tresos中的SPI与DMA配置步骤理论说再多都不如把配置步骤过一遍。这里我以AUTOSAR MCAL配置工具EB tresos为基础按我实际项目里的顺序把SPI多从机通信相关的关键配置项列一遍。注意不同MCAL版本字段名可能有区别但核心逻辑一致。5.1 Spim驱动配置的关键字段在EB tresos里配置SPI驱动时我通常先用一个最小配置跑通回环测试再逐渐加功能。Spim模块的配置核心包括SpimChannel每个Channel定义一个通信端点绑定一个数据缓冲区和一组通信参数。多从机时建议一个从机的读写各占一个Channel或者合并成一个大Channel取决于你希望片选保持低电平的时间。SpimJob一个Job包含一个或多个Channel同一Job的Channel共享片选信号。我的经验是一个Job只放一个从机的所有Channel这样做片选切换时逻辑最简单。SpimSequenceSequence定义多个Job的执行顺序。比如从机1写配置、从机1读状态、从机2写配置、从机2读状态就可以做成一个SequenceMCAL按顺序执行这些Job。重点参数上有两个容易被忽略一个是SpimBaudrate多从机时如果从机规格书不同波特率不能统一你要为每个Channel分别配置波特率而AUTOSAR的Spim驱动里确实可以在Channel级别覆盖波特率不过有些前期配置很容易把波特率绑到外设级别导致改一个从机影响其他从机另一个是SpimTimeCounter用于超时判断某些MCAL会把SPI通信超时和任务调度器绑定调错了会导致传输完成中断迟迟不来。5.2 Dma驱动配置的关键字段Dma模块的配置比SPI更容易出错因为它要同时兼顾外设端和内存端。我在EB tresos里配置DMA做SPI通信时重点关注DmaChannel每个DMA通道对应一个外设事件的响应。发送通道触发源选TX事件接收通道触发源选RX事件。DmaTransferMode选Single还是Continuous多从机轮询场景建议Single数据流场景考虑Continuous。DmaSourceAddress和DmaDestinationAddress发送DMA的源地址是内存缓冲区目标地址是SPI的TX FIFO寄存器地址接收DMA的源地址是SPI的RX FIFO寄存器地址目标地址是内存缓冲区。地址类型和地址增减方式都要配对否则数据会飞。DmaDataWidth要和SPI Channel的DataWidth一致。SPI配8位数据宽度DMA也配8位不要图省事用32位一次搬运4字节。DmaChannelInterrupt发送完成中断可以不开接收完成中断一般要开用来通知应用层数据已经收完了。5.3 调试时的最小验证流程拿到新板子我从来不直接跑完整的多从机通信而是先做一个最小验证关掉DMA用轮询方式向一个从机发固定数目的0xAA、0x55用示波器抓SCLK、MOSI、CS信号确认识别到的是正确的从机、字节数对不对。打开发送DMA不发任何有意义的数据只向某个从机发0x00用示波器确认CS拉低期间MOSI有正确的电平变化且CS的拉高时机在最后一个SCLK边沿之后。打开接收DMA把MISO通过飞线短接到MOSI上做回环发一串数据看接收缓冲区是否和发送缓冲区一致。最后再接真实的多个从机逐个验证。这套流程能让我把问题逐层隔离开。现实中有很多同事跳过前两步直接上真实从机结果MISO上本来就没有数据DMA又没配置好最后花了几天去怀疑硬件浪费大量时间。6. 常见问题与排查技巧实录最后一部分把我反复遇到的典型故障整理成一个速查表每个问题都给出判断方法和排查路径基本覆盖了TC3xx多从机SPI通信的大部分坑。6.1 从机读数一直是全FF或者全00如果读回来的数据全是0xFF通常表示MISO线上没有有效数据可能原因有几种从机根本没有被选中片选没拉低或拉低时序不对SCLK没有送到从机时钟极性或相位配置不对从机的片选和主机片选接错了引脚。如果读回来全是0x00除了上面MISO的问题还有可能是从机的输出引脚三态没有打开或者从机的输出数据本来就是0。排查方法先从最简单的示波器抓CS和SCLK波形开始确认通信时有波形再逐项检查SPI的CPOL、CPHA是否和从机要求一致然后单独用一个GPIO控制CS手动拉低片选持续发时钟信号观察MISO上有没有数据变化如果MISO一直是某个固定电平大概率是从机没有正确工作。6.2 DMA搬运完成后CS才拉低导致数据错位这是个非常典型的坑。你配置了DMA在传输完成时产生中断然后在中断回调里拉高CS。但DMA的“传输完成”和SPI的“数据移位完成”不是同一时刻。DMA完成只说明数据已经全部搬到了TX FIFO但TX FIFO里的最后几个字节可能还在移位寄存器中等待移位。此时直接把CS拉高最后几个字节就发不完整。判断方法抓SCLK和CS看CS拉高时SCLK是不是还有最后几个脉冲没结束。若是则需要在读取QSPI状态寄存器确认SPI外设彻底空闲后再拉高CS。解决思路要么在DMA传输完成中断里增加一个等待SPI空闲的循环或事件确认机制要么改用QSPI的传输完成事件来做片选释放而不是DMA的传输完成事件。AUTOSAR里可以用SpimChannel的传输完成回调来实现回调里再去拉高CS。6.3 两个DMA通道同时工作时优先级冲突发送DMA和接收DMA同时被触发但接收DMA的优先级不够一直抢不到总线访问权RX FIFO溢出数据错乱。这种现象通常在SPI时钟较高、数据量较大时突然出现而且往往是偶发性的非常难排查。排查方法把接收DMA的优先级配置高于发送DMA观察故障是否消失或者在接收DMA中断里记录是否出现RX FIFO溢出标志位。TC3xx的DMA通道0优先级通常高于通道31具体看芯片手册。调整后如果故障消失基本可以确认是优先级问题。6.4 多从机切换时第一个字节丢失这是多从机切换最典型的故障。第一次和从机A通信正常和从机B通信正常但从机A切换到从机B时B收到的第一个字节变成0或者错误值。原因可能是CS拉低后SCLK还没开始但MOSI上已有残留电平从机B在CS下降沿时采样到了干扰信号。排查方法用示波器看CS下降沿之前MOSI的电平状态。如果在CS下降沿之前MOSI维持了某个非空闲电平就需要在片选切换时把MOSI置为空闲电平或者增加CS下降沿与第一个SCLK之间的延时。部分从机对CS下降沿时的MOSI电平很敏感归根结底还是片选切换时序不够严谨。6.5 AUTOSAR中断优先级与DMA中断的冲突AUTOSAR本身有OS调度和中断优先级管理如果你把DMA中断优先级配置得太低在OS任务繁忙时DMA中断会被长时间阻塞导致数据超时。反之如果优先级太高有可能打断SPI驱动的正常处理流程导致状态机错乱。建议DMA接收完成中断优先级设为中等偏高但不要高于OS的调度器tick中断传输完成回调里的操作尽量短不要在中断里做复杂逻辑。如果确实需要大量处理先标记一个事件标志在任务上下文里慢慢处理。7. 优化建议与个人经验总结多从机通信做多了以后我最大的感受是不要在“接近极限”的状态下跑多从机SPIDMA。如果你同时把SPI时钟跑到最高档、DMA负载拉满、片选切换时间压到极限那么任何一点信号完整性瑕疵、任何一点MCAL配置的取舍不到位都会放大成偶发故障。留出裕量系统稳定性会高很多。具体来说我一般会做三件事第一把SPI时钟设置为从机规格书允许的最高频率的75%到80%留出时序裕量应对PCB寄生参数第二每个从机的字节间延时和片选空闲时间设置得宽裕一些多花几十微秒通常不影响整体性能但换来的是通信稳定性的大幅提升第三在应用层加一个简单的通信错误计数把偶发的DMA超时、片选异常、数据CRC错误记录下来方便现场问题回溯。最后分享一个小技巧调试多从机SPI通信时先不要急着接所有从机先接一个从机把它调通稳定运行一整夜不报错再接入第二个从机。每增加一个从机都可能因为负载变化、总线电容变化、中断响应变化而引入新的问题。一个从机一个从机地加定位问题会容易得多。希望这篇文章能帮你少踩一些TC3xx SPI多从机通信的坑如果需要进一步讨论具体的MCAL配置或寄存器细节欢迎在评论区交流。
返回列表