ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

软件SPI驱动MS41929步进电机:寄存器配置与调试实战

软件SPI驱动MS41929步进电机:寄存器配置与调试实战 最近整理MS41929这套步进电机驱动方案正好把软件SPI通讯这部分单独拎出来聊一聊。标题里写了“二”那自然是接着上一篇来前面把硬件接线、电源、基本驱动思路都过了一遍这篇就专门说怎么用软件SPI把MS41929的寄存器搞定让电机老老实实转起来。为什么要单独写一篇软件SPI因为MS41929这颗芯片的控制核心就是SPI寄存器配置你用硬件SPI也好软件模拟也好最终面对的都是同一套通信协议。但实际开发中很多人一上来就卡在“读不到寄存器”“写进去了电机没反应”“时序明明对了就是不动”这类问题上而这些坑绝大多数都和通信时序、码型格式、寄存器细节有关。这篇就把我从踩坑到稳定运行的完整过程拆开讲清楚每一步在干什么、为什么这么干。水平有限但我尽量说人话代码和思路都会给全有不对的地方欢迎评论区指正。1. 整体设计思路为什么用MS41929为什么偏偏选软件SPIMS41929这颗芯片在步进电机驱动里算是比较“聪明”的一类它不是那种只靠DIR/STEP脉冲就能转的简单驱动而是把所有控制都塞进了寄存器。细分、电流大小、衰减模式、相位切换、甚至DAC输出都靠SPI接口去配。这样一来硬件设计会很干净单片机和驱动芯片之间只需要SCK、MOSI、MISO、CS四根线走线短、抗干扰也好处理。但这也带来一个问题所有控制逻辑都在寄存器里通信一旦出错电机要么不转要么乱转很难从硬件上排查。之前用硬件SPI做的时候还得管外设时钟、引脚复用、DMA中断出了问题都不知道是该查硬件还是查驱动代码。后来干脆把SPI改成GPIO模拟也就是软件SPI反而简单了——每一根时钟线、每一个bit都是自己拉的逻辑清清楚楚出问题也容易定位。再说为什么选软件SPI而不是硬件SPI我自己总结三个原因第一MS41929这类芯片对SPI速率要求并不高寄存器配置频率通常几百kHz到几MHz就够了GPIO翻转轻松覆盖没必要占用一个硬件SPI外设。尤其你如果还想再挂个Flash、LCD、SD卡之类的硬件SPI外设本来就紧张软件模拟可以把脚位解放出来。第二引脚复用更灵活。硬件SPI会锁死特定引脚比如STM32的SPI1_SCK必须在PA5但软件SPI想用哪个脚就用哪个脚改板子、调试样机都舒服很多。实际做产品时尤其走线受限的单面板或者空间很小的驱动板这优势非常明显。第三代码可移植性极强。软件SPI就是最基础的GPIO高低电平操作换MCU平台基本无痛迁移。今天用STM32明天换GD32、新唐、甚至8位单片机只要把GPIO宏定义改一改整个驱动逻辑直接搬走。当然软件SPI也有代价最大的就是CPU占用率高一个字节8个bit要一个个翻转通信频率还做不到特别高。但对MS41929这种以“配置寄存器”为主、平时不搞大量数据传输的场景这点CPU开销完全可以接受。画个简单的系统框图大概就是这样MCU比如STM32F103提供软件SPI的时钟/数据信号核心是GPIO模拟MS41929把寄存器传过来的配置变成实际电机驱动信号步进电机按照驱动信号工作电源VM电机电源、VCC逻辑电源还有去耦电容、电流采样电阻等整条链路里最容易出问题的就在中间那四根线上也就是SPI通信这块。下面就把协议这个东西彻底拆开。2. 软件SPI通讯原理与MS41929协议拆解2.1 搞明白SPI到底在传什么很多新手一听到SPI就头大其实把它理解成“两个人约定好按什么节奏念数字”就行了。SPI主机MCU和从机MS41929之间有四根线SCK时钟线由主机产生相当于那一句“我数1、2、3你听好了”MOSI主机输出、从机输入主机把数据一位一位发出去MISO从机输出、主机输入从机把自己的数据位回给主机CS片选低有效相当于“现在我开始跟你说话了别插嘴”软件SPI做的最核心一件事就是自己在GPIO上模拟出这个“数1、2、3”的节奏。时钟什么时候拉高、什么时候拉低、数据在上升沿还是下降沿有效这些统称为SPI模式Mode 0~3。常见的SPI模式由CPOL时钟极性和CPHA时钟相位决定模式CPOLCPHA特点Mode 000空闲时钟为低上升沿采样Mode 101空闲时钟为低下降沿采样Mode 210空闲时钟为高上升沿采样Mode 311空闲时钟为高下降沿采样MS41929的数据手册里通常会写“支持SPI Mode 0/1/2/3”或者指定某一种不同版本手册可能还不一样我手头这份主推Mode 0或者Mode 1也就是空闲时钟为低。但你这颗芯片具体是什么模式一定以你自己手里的数据手册为准。只看网上别人的代码不核对芯片手册能跑起来纯属运气好。2.2 软件SPI里几个关键参数第一个是时钟频率。软件SPI没硬性限制GPIO翻转多快它就多快。但MS41929有最大SPI时钟频率限制一般是10MHz或20MHz这个量级你软件拉个500kHz肯定没问题。频率太高反而容易引入干扰尤其是在杜邦线连接的情况下数据出错你根本不知道。第二个是CS时序。片选拉低之后不能立刻就开始发时钟要留一点点时间让从机准备好发完最后一个bit之后也要等CS拉高前留一小段间隔。这个“建立时间”和“保持时间”手册上会有实际软件里加几个空操作或者微秒延时就能满足。第三个是字节格式。SPI通信本质上是一个bit一个bit传一帧数据通常由几个字节拼成。MS41929的寄存器读写帧格式不同厂家有差异有些是“地址数据”有些是“地址高字节低字节”有些还是定长32位。我的建议是第一件事先把数据手册上的“SPI Interface”章节截图打印出来标好哪几位是地址、哪几位是数据对着写代码才不会乱。2.3 硬件SPI和软件SPI到底怎么选这里给个我真实的对比感受对比项硬件SPI软件SPI接线灵活性低引脚基本固定高任意GPIOCPU占用低可配合DMA高每个bit都要CPU参与调试难度中出错不好定位低逻辑透明最高速率高可达几十MHz低看GPIO翻转速度代码移植性一般依赖芯片外设极高纯GPIO操作适合场景大数据量、高实时通信寄存器配置、低速控制MS41929这种寄存器配置型芯片90%的情况选软件SPI都够用。除非你对实时性要求极高寄存器每毫秒要更新好几遍否则没有必要上硬件SPI。3. 软件SPI驱动MS41929的完整代码实现下面直接给代码我用STM32的HAL库风格来写但核心逻辑全平台通用你换个单片机也基本是这几段函数。3.1 引脚分配与硬件接线先说我样机上用的引脚分配这是ST官方的Nucleo板加自己画的驱动小板SCK - PA5MOSI - PA7MISO - PA6CS - PA4这里我特意避开了默认JTAG占用的PA13/PA14/PA15也避开了串口用的PA9/PA10方便调试。实际原理图不需要照抄但不管怎么接记得GPIO模式要设置正确。信号方向GPIO模式SCK输出推挽输出MOSI输出推挽输出MISO输入浮空输入或上拉输入CS输出推挽输出有人会把CS设置成复用推挽其实完全没必要软件SPI里CS就是普通推挽输出直接拉低拉高。硬件上还有几个细节新手容易忽略MS41929的VCC和VM之间最好加个0.1uF和一个10uF左右的电容靠近芯片引脚放置用来吸收电机转动时的电流尖峰如果MISO引脚内部没上拉建议外部加一个10k上拉到VCC防止总线空闲时引脚悬空逻辑乱跳如果MCU是3.3VMS41929的逻辑供电也是3.3V尽量不要用5V去灌电平不匹配会导致寄存器写入错误步进电机电源VM的电压要根据电机额定参数来不要超过芯片极限3.2 软件SPI底层读写函数首先初始化GPIOHAL库下就这几行void SPI_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); /* 配置SCK、MOSI、CS为推挽输出 */ GPIO_InitStruct.Pin GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); /* 配置MISO为输入 */ GPIO_InitStruct.Pin GPIO_PIN_6; GPIO_InitStruct.Mode GPIO_MODE_INPUT; GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); /* 初始状态CS拉高、SCK拉低 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); }然后定义一个微秒级延时。注意HAL_Delay只能毫秒级这里需要自己写。最简单的办法是用个空循环static void delay_us(uint32_t us) { /* 假设主频72MHz粗略延时实际要按你自己的主频调 */ uint32_t cnt us * 8; while (cnt--) { __NOP(); } }延时大小不需要太精确能保证时序稳定就行。如果你手头有逻辑分析仪可以顺手测一下实际时序让时钟脉宽在1~2us左右就行太窄了容易受干扰。写一个字节的核心逻辑void SPI_WriteByte(uint8_t data) { uint8_t i; for (i 0; i 8; i) { /* 先准备好数据 */ if (data 0x80) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); } data 1; /* SCK拉高从机在上升沿采样 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); delay_us(1); /* SCK拉低 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); delay_us(1); } }这里用的是“先置数据、再拉高SCK”的写法也就是Mode 0或者Mode 1的时序空闲时钟为低数据在上升沿之前准备好SCK上升沿之后从机去锁存。如果你的芯片手册要求Mode 2或Mode 3那就改成空闲时钟为高时序反过来。实际调试时可以先跑一下写寄存器然后用读寄存器验证能读回来就说明模式对了。读一个字节和写略有不同读的时候主机要把MOSI释放掉或者干脆保持置高/置低无所谓重点是MISO引脚在时钟沿之后去读uint8_t SPI_ReadByte(void) { uint8_t i; uint8_t data 0; for (i 0; i 8; i) { data 1; /* SCK拉高 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); delay_us(1); /* 在SCK高电平期间读取MISO */ if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) GPIO_PIN_SET) { data | 0x01; } /* SCK拉低 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); delay_us(1); } return data; }再封装一个“写寄存器”和“读寄存器”的函数这里面就有协议格式了。我用的这颗芯片读寄存器时是先发地址再读数据写寄存器时是先发地址加读写标志再发数据。具体代码可以这样void MS41929_WriteReg(uint8_t addr, uint16_t data) { /* CS拉低开始传输 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); delay_us(1); /* 发送寄存器地址或地址读写标志位 */ SPI_WriteByte(addr); /* 发送数据高字节 */ SPI_WriteByte((uint8_t)(data 8)); /* 发送数据低字节 */ SPI_WriteByte((uint8_t)(data 0xFF)); /* CS拉高结束传输 */ delay_us(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); delay_us(1); }注意不同芯片、不同寄存器数据可能是8位也可能是16位有的甚至要连读连写。我的习惯是先看数据手册里的SPI时序图如果手册没写就用逻辑分析仪抓一颗官方评估板上电时的波形照着波形写代码这是最不容易出错的办法。3.3 MS41929初始化与电机驱动流程MS41929的上电初始化顺序非常关键顺序错了容易出怪问题。我自己的初始化步骤如下第一步先做一次软件复位或者等待电源稳定具体看数据手册有没有软件复位寄存器。如果没有就靠硬件上电复位但VCC要等稳定之后再开始SPI操作。第二步配置DAC相关寄存器。MS41929内部有不少DAC通道用于控制驱动电流的基准电压这部分不配好后面整个驱动都会异常。典型做法是把DAC输出设成目标电流对应的电压值这需要看手册里的电流计算公式。第三步配置衰减模式比如慢衰减、混合衰减MS41929有PWMDECAY这类寄存器。衰减模式直接影响电机的噪音和发热快衰减电流纹波大慢衰减电流更平滑但响应慢混合衰减则是折中。第四步配置细分也就是SMPL寄存器相关位比如2、4、8、16、32、64、128等。细分越多电机运行越平滑噪音越小但最高转速会受限制。第五步使能驱动输出。有些寄存器里有个使能位默认是禁能状态不打开的话电机就算接到端口上也不会动。第六步切换相位或者发方向信号电机开始转动。一个简化的初始化示例void MS41929_Init(void) { /* 等待电源稳定 */ HAL_Delay(50); /* 配置DAC和驱动相关寄存器具体地址和值以数据手册为准 */ MS41929_WriteReg(0x0C, 0x0200); /* 举例BCTL偏置电流控制配置内部基准 */ MS41929_WriteReg(0x10, 0x0001); /* 举例DAC使能使能内部DAC */ MS41929_WriteReg(0x20, 0x003F); /* 举例SMPL细分设置设为32细分 */ MS41929_WriteReg(0x22, 0x0000); /* 举例PWMDECAY衰减模式设为慢衰减 */ MS41929_WriteReg(0x24, 0x0001); /* 举例DRV使能使能电机驱动输出 */ /* 再延时一小段等待内部稳定 */ HAL_Delay(10); }这里面寄存器地址和数据不能直接照抄因为具体数值和你的电机参数、板子设计、供电电压都有关系。我给的只是写法模板实际用的时候一定要对着数据手册一条一条核对。电机转起来之后想调速或者换向只需要修改相位寄存器或者切换激励模式再配置一下衰减模式和电流就可以了。实际做产品时很多还要加加减速曲线但底层都是一样的SPI寄存器操作。4. 实操过程与关键验证手段4.1 别怕用逻辑分析仪软件SPI调通之前我最推荐的工具就是逻辑分析仪二三十块钱的就能用采样率几十MHz就够抓这种低速SPI波形了。接上SCK、MOSI、MISO、CS四根线再去跑你的初始化代码抓到的波形一眼就能看出有没有问题。判断标准很简单CS拉低之后SCK才开始翻转第一个bit的数据在SCK第一个上升沿之前就准备好了每个字节8个bit波形完整没有毛刺CS拉高之前最后一个bit已经传完读寄存器时MISO线上能看到从机返回的数据如果是写寄存器重点看MOSI上的地址和数据对不对如果是读寄存器重点看SCK沿和MISO上的采样点对不对。我自己遇到过一种非常隐蔽的问题写寄存器时波形明明是对的但读寄存器读回来的全是0xFF。后面发现是CS拉高之后我没有等足够多的时间就进行了下一次通信从机还在处理上一笔数据状态机没准备好。在CS拉高之后加了几微秒延时问题就消失了。4.2 寄存器写进去却没反应怎么查这是问得最多的一个问题初始化代码跑了电机就是不动寄存器好像没写进去。遇到这种问题我一般按下面的顺序排查第一确认电源。用万用表量芯片VCC和VM确认电压正常并且没有严重跌落。步进电机启动瞬间电流很大如果电源带不动电压可能瞬间跌到芯片复位阈值以下等于一直在复位循环。第二确认SPI模式。拿逻辑分析仪抓一下波形看是空闲低还是空闲高SCK上升沿采样还是下降沿采样对照数据手册确认模式。第三确认寄存器地址对不对。很多芯片的寄存器地址带有读写位比如最高位写1表示读、写0表示写如果你把地址当成纯地址发过去从机可能根本不会响应。这种情况查手册里“R/W bit”那一节的说明。第四确认有没有使能输出。MS41929这类芯片一般都有输出使能寄存器或者控制引脚不给使能信号的话电机是不会有电的。第五确认DAC基准有没有配好。这个是最容易被忽略的地方很多芯片DAC不使能或者DAC电压设为0后面的驱动电路就没有参考电流电机自然不转。如果这些都查完了还是不行就做一个最笨的测试把电机线拆掉用万用表量芯片输出引脚看看配置前后引脚电压有没有变化。如果引脚从高阻变成有电平输出说明驱动部分已经工作了问题多半在电机接线或者电流不够上。4.3 步进控制参数调试记录调完通信之后真正的调参过程才开始。我这里用的电机是42步进电机额定电压和电流不细说了重点说参数之间的权衡。细分是我最早调的。把细分从1调到32之后电机运行的噪音明显下降低速转动时那种一顿一顿的感觉也基本消失。但细分上去之后同样一个脉冲对应的机械角度变小在相同转速下需要更高的脉冲频率软件SPI的更新速度就成了瓶颈。做高速转动时我反而会把细分降下来保证每个激励周期都能被及时更新。衰减模式这个参数很多人不理解它影响的是PWM关断后绕组电流通过续流回路衰减的快慢。衰减模式电流纹波噪音适用场景快衰减大大高速、低电感电机慢衰减小小低速、高电感电机混合衰减中等中等大部分通用场景我实际测试时42电机在低速下用慢衰减噪音明显小于快衰减。但慢衰减也有问题就是电流追踪的响应速度慢如果速度突变波形会拖尾。最后我选了混合衰减把慢衰减时间和快衰减比例配到一个折中值噪音和响应速度都还能接受。电流设置也要注意DAC寄存器里的电压基准乘以采样电阻的分压系数就是真正的相电流值。这个电流不要一上来就设大先设成电机额定电流的一半确认转动正常了再把电流加上去。很多新手喜欢把电流拉到最大结果电机没烧芯片先烫得不行。5. 常见问题与排查技巧实录整理一下我调MS41929过程中实际遇到频率比较高的问题做成一个速查表方便以后直接翻。现象可能原因解决办法电机完全不转寄存器没写进去用逻辑分析仪抓SPI波形确认地址、数据、读写标志位电机完全不转输出没有使能检查DRV使能寄存器和EN引脚电平电机完全不转DAC没配好确认DAC使能位和基准电压用万用表量输出引脚电机抖动、异响细分设置不对检查SMPL寄存器优先增加细分档位电机抖动、异响衰减模式不合适尝试切换快/慢/混合衰减电机一转就发热相电流设置过大调低DAC参考位或降低VM电压电机一转就发热衰减模式错误换慢衰减或混合衰减减少电流纹波读寄存器全是0xFFCS时序间隔不够CS拉高后延长延时再开始下一帧读寄存器全是0x00MISO没接好/没上拉检查MISO连接加10k上拉电阻通信不稳定的偶发问题电源毛刺VCC和VM就近加去耦电容SPI线缩短通信不稳定的偶发问题SPI模式不对核对CPOL/CPHA必要时尝试其余三种模式每个问题背后都有对应的实际调试经历比如“读寄存器全是0xFF”这个问题当时我一度怀疑芯片坏了换了块芯片还是一样最后发现是CS拉高之后没有给任何延时从机的内部状态机还停在上一帧下一帧命令到了它根本不认。在CS拉高后加了一个3us的延时问题消失。“读寄存器全是0x00”的问题也好玩排查了半天发现MISO引脚在板子上虚焊刚开始接触不良有时候好有时候坏。后来用手按着芯片附近数据就能正常读出来。所以如果遇到数据偶尔正常偶尔异常先怀疑硬件接触问题不要急着调软件。另外有个经验是软件SPI的延时参数不一定越小越好。延时太短GPIO翻转和从机采样之间没有足够的建立时间数据可能没稳定就被采走延时太长通信速度慢造成控制不够实时。一般把SCK半周期调到1us到2us也就是一个bit 2~4us对MS41929来说够用了。这样一帧寄存器操作也就几十微秒对电机控制来说完全感知不到延迟。6. 那些容易忽略的经验细节6.1 电源和去耦真的不能将就步进电机驱动最怕的就是电源不稳。MS41929这种芯片逻辑部分用VCC电机驱动部分用VM两个电源最好分开。VM的电流变化非常大尤其是在电机启动和换向瞬间如果VM和VCC在芯片内部没有完全隔离VM的毛刺很容易耦合到VCC上导致逻辑部分时不时复位一下表现为“代码跑到一半就丢了配置”。我实际测试过电源线用20cm长的杜邦线电机一转VCC上就能看到明显的纹波在某些瞬间甚至能跌到3V以下。后来我把供电线改成短而粗的导线VM和VCC靠近芯片引脚各加了一个100uF电解电容加0.1uF陶瓷电容纹波基本就下去了。如果你自己画板一定要把去耦电容放在芯片电源引脚旁边走线不要绕远。这是最基础但也最重要的一步。6.2 寄存器操作的正确姿势操作MS41929寄存器时有个细节特别重要很多寄存器在不同状态下写入行为是不一样的。比如有些寄存器需要在电机停止时才允许修改有些则可以在运行中动态更新。上来就一股脑全写一遍有可能把正在运行的驱动状态打乱。我现在的习惯是初始化阶段把基础参数一次配好比如DAC、衰减、细分、使能运行阶段只修改那些允许动态修改的寄存器比如相位、励磁模式每次修改前先读回寄存器当前值确认当前状态再做写操作读回当前值这个动作看起来多此一举但实际排障时特别有用。比如你怀疑是外部干扰改写了寄存器读回来一看就明白了。另外写寄存器的时候很多芯片对“写完立即读”有限制写完一个寄存器之后至少等待一小段时间再读或者干脆延时几个us再继续下一笔。这个等待时间通常手册上会写没有写的话就按经验值给个几us就够了。6.3 程序架构留好扩展口软件SPI的驱动函数建议一开始就做好分层不要把所有逻辑都堆在一个文件里。我自己是分成三层层次职责接口示例硬件层GPIO初始化、延时、底层SPI读写SPI_WriteByte、SPI_ReadByte芯片层MS41929寄存器读写、初始化参数、控制命令MS41929_WriteReg、MS41929_SetCurrent、MS41929_SetStep应用层电机控制逻辑、加减速曲线、运动指令Motor_Run、Motor_Stop、Motor_MoveTo这样做的好处很明显后面如果要换主控芯片只需要改硬件层芯片层和应用层都可以直接复用。要是想加个加减速功能、或者多路电机同步控制也不需要动底层代码。还有就是软件SPI的GPIO宏定义最好统一放到一个头文件里#define SPI_SCK_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) #define SPI_SCK_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET) #define SPI_MOSI_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET) #define SPI_MOSI_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET) #define SPI_CS_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET) #define SPI_CS_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET) #define SPI_MISO_READ() HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6)后面想改引脚只动这个头文件就行不用满工程替换。6.4 还想再往深处走的话MS41929这套方案跑稳之后可以扩展的方向还挺多。比如给电机加闭环反馈配合编码器做位置闭环或者做细分插补算法让低速时候的运动更顺滑再或者加个上位机通过串口实时调整DAC电流和衰减模式调机效率会高很多。如果你有多个MS41929还可以研究一下它们的片选扩展一个MCU控制多路电机驱动应用在云台、机器人、光学变焦模组这些场景都很实用。另外如果之后要做量产产品我建议把软件SPI换成硬件SPI或者直接改成带SPI接口的专用驱动方案毕竟软件SPI对CPU的占用还是偏高在有其他任务需要实时处理时会显得捉襟见肘。但前期验证方案、快速出demo软件SPI永远是成本最低、最灵活的选择。
返回列表