ARTICLE DETAIL

资讯详情

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

AVSBus协议详解:TPS53676动态电压调节与MCU驱动实战

AVSBus协议详解:TPS53676动态电压调节与MCU驱动实战 1. 从一颗供电芯片说起为什么AVSBus值得单独拎出来讲搞过服务器主板、AI加速卡或者高端FPGA供电的兄弟应该都有体会现在一颗大芯片的Core电压早就不是“给个固定电压就完事”的年代了。拿数据中心里常见的AI训练卡来说核心电流动辄几百安培负载跳变在纳秒级发生如果供电还停留在“设定1.2V然后死扛”的阶段要么芯片跑不到标称频率要么功耗和发热直接失控。动态电压调节DVRDynamic Voltage Scaling从十几年前就开始在处理器供电里扮演关键角色而要让主控SoC和VR控制器之间高效地“对话”电压就需要一套专门的通信协议。TPS53676是TI推出的一款多相降压控制器支持PMBus和AVSBus两种接口。PMBus大家相对熟悉基于I2C物理层命令集丰富适合配置和遥测但PMBus的速率和延迟在应对快速DVSDynamic Voltage Scaling时力不从心。AVSBus则是专门为“自适应电压缩放”设计的点对点高速串行接口物理层借鉴了SPI的很多思路但协议层做了大量针对性优化。简单说PMBus负责“慢工出细活”的配置和监控AVSBus负责“快准狠”的实时电压调节。这篇文章面向的是正在调试TPS53676或者类似数字多相控制器的嵌入式工程师、电源工程师和固件开发者。我会从协议帧结构讲起把AVSBus的物理层、数据帧、CRC校验、命令集一层层拆开然后落到实际代码上讲清楚怎么用MCU的SPI外设去驱动它怎么做动态电压调节以及调试过程中那些文档里不会写的坑。如果你手头正好有TPS53676的板子或者正在选型服务器供电方案这篇内容应该能帮你省下不少抓波形的时间。2. AVSBus协议核心机制拆解2.1 AVSBus和PMBus到底什么关系很多人第一次接触AVSBus会懵既然TPS53676支持PMBus为什么还要搞个AVSBus直接PMBus写VOUT_COMMAND不就行了吗这里面的逻辑其实不复杂。PMBus的物理层是I2C标准模式100kHz快速模式400kHz即使是最快的PMBus over I2C也就1MHz左右。每次写一个电压值需要起始条件、7位从机地址、命令字节、两个数据字节、PEC字节、停止条件。算下来一帧至少6个字节加上I2C的ACK位和时序开销在400kHz下传输一帧大概需要150微秒以上。如果处理器需要根据负载实时调整电压比如从0.9V跳到1.1V再跳回来这个延迟会导致电压调整严重滞后于负载变化轻则性能损失重则触发欠压保护。AVSBus的物理层是点对点串行接口时钟速率可以跑到几十MHz。TPS53676的AVSBus接口支持最高50MHz的时钟一帧数据32位在25MHz下传输一帧只需要1.28微秒。这个速度差距是数量级的。而且AVSBus的协议设计更精简没有I2C的地址寻址开销直接点对点通信帧结构也更紧凑。从功能分工上看PMBus负责“静态”配置设置输出电压范围、过流保护阈值、相位数量、遥测使能等。AVSBus负责“动态”调节实时读写电压值、读取电流和温度遥测、触发快速DVS。两者配合使用PMBus做初始化AVSBus做运行时控制。注意AVSBus并不是要取代PMBus两者是互补关系。TPS53676上电后必须先通过PMBus完成基本配置AVSBus才能正常工作。如果PMBus配置没做对AVSBus读出来的电压值可能是错的。2.2 AVSBus物理层SPI的“近亲”但有区别AVSBus的物理层和SPI非常像都是四线制时钟SCLK、数据输入SDIO从控制器到VR、数据输出SDO从VR到控制器、片选CSB。但有几个关键区别需要特别注意。第一AVSBus的时钟极性是固定的。SPI有CPOL和CPHA四种模式组合AVSBus只工作在一种模式下时钟空闲为低电平数据在时钟上升沿采样。对应SPI的Mode 0CPOL0CPHA0。如果你用MCU的SPI外设去驱动必须配置成Mode 0否则数据全是错的。第二AVSBus的数据位宽是32位但传输顺序是MSB First。SPI通常也是MSB First这点一致。但AVSBus的帧结构里32位并不是全部用来传数据的里面有命令位、地址位、数据位和CRC校验位需要按照协议解析。第三AVSBus的片选信号CSB在每帧传输之间必须拉高。有些SPI设备支持连续传输时片选保持低电平AVSBus不支持。每传输完32位CSB必须拉高至少一个时钟周期然后再拉低开始下一帧。这个细节在调试时很容易忽略导致第二帧数据错位。第四AVSBus的时钟速率虽然标称最高50MHz但实际能跑多快取决于PCB走线质量和VR控制器的响应速度。TPS53676的AVSBus接口在50MHz下工作但如果你用飞线连接或者走线过长可能只能跑到10MHz甚至更低。建议先用低速调试确认协议通了再逐步提高时钟。2.3 帧结构逐位解析32位里藏了什么AVSBus的一帧是32位结构如下表所示。这个表是我根据TPS53676数据手册和实际抓波形整理出来的和标准AVSBus规范一致。位域名称宽度说明31:28命令码4位定义操作类型如读电压、写电压、读电流等27:24保留4位固定为0写操作时忽略读操作时返回023:8数据16位具体的数据值格式取决于命令码7:0CRC8位对前24位进行CRC-8校验的结果命令码是4位意味着最多16条命令。TPS53676实际使用的命令码包括0x0读电压、0x1写电压、0x2读电流、0x3读温度、0x4读状态等。具体命令集需要参考数据手册不同厂商的VR控制器可能有差异。数据域是16位对于电压命令这个16位数据的格式是高8位是整数部分低8位是小数部分单位是伏特。比如0x0C80表示12.5V不对这里要仔细算。实际上AVSBus的电压数据格式是16位有符号数单位是1/256V约3.9mV。所以0x0C80 32003200/256 12.5V。但TPS53676的输出电压范围通常在0.5V到2.0V之间所以实际用到的值在128到512之间。对于电流命令16位数据的单位是1/4安培这个需要查具体型号的手册。TPS53676的电流读数格式是16位无符号数单位是1/4A所以满量程65535/4 16383.75A实际不可能这么大手册里会说明有效位数。CRC是8位对前24位命令码保留数据进行CRC-8校验。多项式是0x07x^8 x^2 x 1初始值0x00不反转不异或输出。这个CRC算法和常见的CRC-8/ATM、CRC-8/MAXIM都不一样需要单独实现。提示CRC计算时输入数据是24位但很多MCU的CRC外设只支持8位或16位输入。这时候需要软件实现CRC-8或者用查表法。我实测过软件逐位计算24位CRC在STM32F103上大约需要2微秒对于25MHz的AVSBus时钟来说帧间隔时间足够。2.4 CRC-8校验为什么选这个多项式CRC-8的多项式选择不是随意的。AVSBus用的0x07多项式x^8 x^2 x 1在通信协议里很常见比如CRC-8/ITU、CRC-8/ROHC都用这个多项式。它的检错能力对于24位数据来说足够能检测所有单比特错误、所有双比特错误、所有奇数位错误以及大部分突发错误。为什么不用CRC-16或者CRC-32因为AVSBus的帧只有32位CRC占8位已经占了25%的开销。如果用CRC-16帧长要变成40位传输效率降低。而且对于点对点短距离通信8位CRC的检错能力已经足够。实际测试中在25MHz时钟下PCB走线10厘米以内CRC错误率极低基本可以忽略。CRC的计算过程把24位数据按位从MSB到LSB依次输入CRC寄存器初始值0x00。每输入一位如果当前CRC的最高位和输入位异或结果为1则CRC左移一位后异或0x07否则只左移一位。24位输入完成后CRC寄存器的值就是校验码。用C语言实现的话可以写成逐位计算也可以用查表法。逐位计算代码简单但速度慢查表法需要256字节的表但速度快。对于AVSBus这种每帧都要算CRC的场景建议用查表法。下面是一个查表法的实现示例// CRC-8查表法多项式0x07初始值0x00 static const uint8_t crc8_table[256] { 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, // ... 完整表省略实际使用时需要补全256个值 }; uint8_t avsbus_crc8(uint32_t data24) { uint8_t crc 0x00; crc crc8_table[crc ^ ((data24 16) 0xFF)]; crc crc8_table[crc ^ ((data24 8) 0xFF)]; crc crc8_table[crc ^ (data24 0xFF)]; return crc; }这个实现里data24是24位数据分三次查表每次处理8位。注意输入顺序是MSB先处理所以先右移16位取最高字节。3. 用MCU驱动AVSBus的完整实操3.1 硬件连接与SPI外设配置先讲硬件。TPS53676的AVSBus接口引脚包括AVS_SCLK、AVS_SDIO、AVS_SDO、AVS_CSB。如果你的MCU用3.3V供电TPS53676的AVSBus引脚也是3.3V电平可以直接连接。如果MCU是1.8V需要加电平转换。注意AVS_SDIO是MCU输出到VR的AVS_SDO是VR输出到MCU的别接反了。我用STM32F103做主机SPI1配置成Mode 0时钟先设到10MHz。CubeMX里的配置如下SPI Mode选Full-Duplex MasterData Size选32位不行STM32F103的SPI数据寄存器是16位的不支持32位传输。所以需要分两次16位传输或者用软件模拟SPI。这里有个选择用硬件SPI分两次传16位还是用GPIO模拟32位硬件SPI速度快但两次传输之间CSB不能拉高否则帧就断了。STM32的SPI在传输16位后会自动拉高CSB如果硬件管理CSB所以需要手动管理CSB。具体做法把CSB配置成GPIO输出SPI的NSS忽略。传输时先拉低CSB然后连续写两次SPI数据寄存器每次16位最后拉高CSB。但这样有个问题两次16位传输之间SPI时钟会暂停吗如果SPI配置成连续传输模式时钟不会停但STM32的SPI在TXE和BSY标志之间会有间隙。实测在10MHz下两次16位传输之间的间隙大约200纳秒对于AVSBus来说这个间隙可能被VR控制器识别为帧结束。所以更稳妥的做法是用DMA把32位数据放到一个缓冲区里DMA连续传输两次16位中间没有间隙。或者用软件模拟SPI完全控制时序。软件模拟的缺点是速度慢但AVSBus在10MHz以下时软件模拟完全可行。我实测过用STM32F103的GPIO翻转配合__NOP()延时可以做到5MHz左右的稳定时钟。对于调试阶段来说够用了。实操心得如果你用STM32F103的硬件SPI建议用DMA方式。配置DMA通道源地址是32位数据的缓冲区目标地址是SPI数据寄存器传输长度设为2两次16位。DMA传输完成后触发中断在中断里拉高CSB。这样能保证两次16位之间没有间隙。具体代码可以参考STM32的SPI DMA例程把数据宽度改成16位传输次数改成2。3.2 写电压命令的完整流程写电压是AVSBus最常用的操作。假设我们要把TPS53676的输出电压设为1.05V步骤如下。第一步计算数据值。1.05V × 256 268.8取整为269即0x010D。但AVSBus的电压数据是16位有符号数0x010D 269对应1.0508V。实际电压会有量化误差269/256 1.05078V误差约0.08%。对于大多数处理器来说这个精度足够了。第二步构造24位数据。命令码0x1写电压保留位0x0数据0x010D。拼起来0x1 20 | 0x0 16 | 0x010D 0x10010D。注意这里命令码是4位左移20位保留位4位左移16位数据16位直接放低16位。第三步计算CRC。对0x10010D进行CRC-8计算得到校验码。假设算出来是0x5A。第四步拼成32位帧0x10010D 8 | 0x5A 0x10010D5A。第五步通过SPI发送。拉低CSB发送高16位0x1001再发送低16位0x0D5A拉高CSB。第六步等待VR响应。AVSBus的写命令通常不需要VR返回数据但VR会在下一帧的SDO上返回上一帧的状态。所以如果你连续写第二帧的SDO数据是第一帧的响应。这个特性在调试时很有用可以用来确认VR是否收到了命令。读电压的流程类似但命令码是0x0数据域填0x0000。发送后VR会在同一帧的SDO上返回电压值。注意读命令的SDO数据是当前帧的响应不是上一帧的。所以读操作需要全双工SPI同时发送和接收。3.3 动态电压调节的代码实现动态电压调节的核心是根据负载情况实时改变电压。在处理器供电场景里通常由处理器通过某种方式告诉VR“我要升压”或“我要降压”。AVSBus提供了快速DVS命令可以一次性设置电压并触发转换。下面是一个简化的DVS实现框架。假设我们有一个电压表根据处理器的工作频率查表得到目标电压然后通过AVSBus写入。typedef struct { uint16_t voltage_raw; // 电压原始值单位1/256V uint8_t crc; } avsbus_frame_t; // 电压表频率(MHz) - 电压(mV) static const uint16_t voltage_table[][2] { {800, 900}, {1200, 1000}, {1600, 1100}, {2000, 1200}, }; uint16_t get_target_voltage(uint32_t freq_mhz) { for (int i 0; i sizeof(voltage_table)/sizeof(voltage_table[0]); i) { if (freq_mhz voltage_table[i][0]) { return voltage_table[i][1]; } } return voltage_table[sizeof(voltage_table)/sizeof(voltage_table[0])-1][1]; } void avsbus_write_voltage(uint16_t voltage_mv) { uint16_t data (uint16_t)((voltage_mv * 256) / 1000); uint32_t frame24 (0x1 20) | (0x0 16) | data; uint8_t crc avsbus_crc8(frame24); uint32_t frame32 (frame24 8) | crc; // SPI发送 AVS_CSB_LOW(); spi_transfer16(frame32 16); spi_transfer16(frame32 0xFFFF); AVS_CSB_HIGH(); } void dvs_update(uint32_t new_freq_mhz) { uint16_t target_mv get_target_voltage(new_freq_mhz); avsbus_write_voltage(target_mv); }这个框架里电压表是静态的实际使用时可以根据处理器的功耗模型动态计算。比如用PID控制器根据当前电流和温度调整电压。但要注意AVSBus的写电压命令有最小间隔限制TPS53676要求两次写电压之间至少间隔1微秒。如果写得太快VR可能来不及响应。注意动态电压调节时升压和降压的斜率需要控制。TPS53676内部有压摆率控制但通过AVSBus写入的电压变化如果太大可能会触发过冲或欠冲。建议每次电压变化不超过50mV如果需要大范围调整分多次小步调整。实测下来每次调整20mV间隔10微秒电压过渡很平滑。3.4 读遥测数据电流、温度、状态AVSBus除了写电压还能读遥测。读电流的命令码是0x2读温度是0x3读状态是0x4。读操作的帧结构和写类似但数据域填0VR会在SDO上返回数据。读电流的返回数据格式16位无符号数单位是1/4A。比如返回0x1000 40964096/4 1024A。这个电流值是多相总电流TPS53676内部会把各相电流加起来。读温度的返回数据格式16位有符号数单位是1/256摄氏度不对TPS53676的温度数据格式是高8位整数低8位小数单位摄氏度。比如0x1A80 26.5°C。但实际测试中温度读数会有偏移需要校准。读状态的返回数据格式16位每一位代表一个状态标志。比如bit0是过压bit1是欠压bit2是过流等。具体定义需要查手册。读操作的关键是SPI必须全双工发送和接收同时进行。STM32的SPI在全双工模式下发送一个16位数据的同时会接收一个16位数据。所以读操作的代码可以写成uint16_t avsbus_read(uint8_t cmd) { uint32_t frame24 (cmd 20) | (0x0 16) | 0x0000; uint8_t crc avsbus_crc8(frame24); uint32_t frame32 (frame24 8) | crc; uint16_t rx_high, rx_low; AVS_CSB_LOW(); rx_high spi_transfer16(frame32 16); rx_low spi_transfer16(frame32 0xFFFF); AVS_CSB_HIGH(); uint32_t rx_frame ((uint32_t)rx_high 16) | rx_low; // 校验CRC uint8_t rx_crc rx_frame 0xFF; uint32_t rx_data24 rx_frame 8; if (avsbus_crc8(rx_data24) ! rx_crc) { return 0xFFFF; // CRC错误 } return rx_data24 0xFFFF; }这个函数返回16位数据调用者根据命令码解析。注意CRC校验是对接收到的24位数据做的如果CRC不匹配说明传输有误需要重试。4. 调试实战那些文档里不会写的坑4.1 CRC算不对先检查位序我刚开始调AVSBus的时候CRC一直算不对。抓波形看数据是对的但VR就是不响应。后来发现是CRC的位序问题。AVSBus的CRC计算是从MSB到LSB逐位输入但很多CRC库默认是从LSB到MSB。如果你用现成的CRC库需要确认输入位序。具体来说对于24位数据0x10010D二进制是0001 0000 0000 0001 0000 1101。CRC计算时先输入最高位bit23最后输入最低位bit0。如果你用查表法表的生成方式也要对应。我上面给的查表法代码是按MSB先处理的表也是按这个顺序生成的。另一个常见问题是CRC的初始值和输出异或。AVSBus的CRC初始值是0x00输出不异或。有些CRC算法初始值是0xFF输出异或0xFF这些都不对。一定要确认清楚。避坑技巧如果你不确定CRC算得对不对可以先用一个已知正确的帧来验证。比如从数据手册里找一个示例帧或者用逻辑分析仪抓一个已知正确的通信波形把数据提取出来自己算CRC对比结果。我当初就是抓了一个VR正常响应的波形反推出CRC算法才把问题解决。4.2 SPI时钟相位搞错数据全乱AVSBus要求SPI Mode 0即CPOL0CPHA0。但有些MCU的SPI外设默认是Mode 3或者CubeMX里配置错了导致数据采样时刻不对。表现就是发送的数据在逻辑分析仪上看是对的但VR收到的数据错位。怎么判断抓SCLK和SDIO的波形。在Mode 0下数据在SCLK上升沿采样所以SDIO应该在SCLK上升沿之前稳定。如果你看到SDIO在SCLK上升沿之后才变化那就是Mode不对。STM32的CubeMX里SPI配置的Clock Polarity选LowClock Phase选1 Edge就是Mode 0。如果选错了改成正确的就行。4.3 片选信号管理不当帧边界丢失前面提到过AVSBus每帧之间CSB必须拉高。但有些工程师用硬件SPI的NSS引脚自动管理CSB结果发现连续传输时CSB一直低VR把多帧当成一帧数据全错。解决办法把NSS配置成GPIO输出手动控制。每次传输前拉低传输完拉高。如果用DMA在DMA传输完成中断里拉高CSB。注意拉高和下一次拉低之间要有足够的间隔至少一个SCLK周期。TPS53676要求CSB高电平时间至少10纳秒实际用1微秒就很安全。4.4 电压读数跳变可能是采样时机问题读电压时如果发现读数一直在跳比如1.05V、1.03V、1.07V来回变可能是采样时机不对。AVSBus的读命令是在帧传输过程中VR实时采样并返回。如果VR的ADC采样和AVSBus传输不同步读数就会有噪声。解决办法连续读多次取平均。TPS53676的电压读数更新率是每帧一次所以连续读10次去掉最大最小值剩下的取平均能得到比较稳定的值。另外读电压时不要同时写电压否则读数会受写操作影响。4.5 常见问题速查表现象可能原因排查方法解决方案VR不响应任何命令CSB或SCLK没接好用示波器看CSB和SCLK波形检查硬件连接确认CSB在传输时拉低CRC一直错CRC算法或位序不对用已知正确帧验证CRC确认多项式0x07初始值0x00MSB先输入读数据全0或全FSPI模式不对抓SCLK和SDIO波形配置SPI为Mode 0写电压后电压不变PMBus配置未完成用PMBus读VOUT_COMMAND先通过PMBus完成基本配置电压读数跳变采样噪声连续读多次取平均避开写操作高速时钟下通信失败走线质量差降低时钟频率测试改善PCB走线或降低到10MHz5. 从AVSBus延伸PMBus与SPI的协同设计5.1 PMBus初始化AVSBus的流程TPS53676上电后AVSBus接口是关闭的必须通过PMBus使能。具体流程通过PMBus写AVSBUS_CONFIG命令设置AVSBus的时钟速率、使能位等。然后写VOUT_COMMAND设置初始电压。最后写AVSBUS_ENABLE命令打开AVSBus接口。PMBus的命令格式和AVSBus不同PMBus是基于I2C的有7位地址、命令字节、数据字节和PEC。TPS53676的PMBus地址由ADDR引脚决定通常是0x30到0x3F之间的某个值。PMBus的PEC校验和AVSBus的CRC不同。PMBus的PEC是CRC-8但多项式是0x07初始值0x00和AVSBus一样。但PMBus的PEC是对整个I2C帧包括地址、命令、数据计算的而AVSBus只对24位数据计算。所以两者的CRC实现可以共用但输入数据不同。5.2 SPI与AVSBus的异同对比特性SPIAVSBus物理层四线制四线制时钟模式四种模式仅Mode 0数据位宽8/16/32位32位固定片选可连续传输每帧必须拉高校验无CRC-8速率可达几十MHz最高50MHz拓扑多从机点对点从表里可以看出AVSBus本质上是SPI的一个“特化版本”针对电源控制场景做了精简和增强。精简的是拓扑和模式增强的是校验和帧结构。如果你已经会用SPI理解AVSBus的难度不大关键是要注意那些“特化”的地方。5.3 多相控制器的AVSBus地址分配TPS53676支持多颗芯片级联每颗芯片的AVSBus接口是独立的。如果你用一颗MCU控制多颗TPS53676需要为每颗芯片分配独立的CSB。SPI的片选可以扩展用GPIO控制多个CSB每个CSB对应一颗VR。但AVSBus是点对点接口不支持总线拓扑。所以多颗VR需要多个AVSBus接口或者用模拟开关切换。实际设计中如果VR数量不多比如2到4颗直接用MCU的多个SPI接口或者GPIO模拟多个CSB就行。如果VR数量多建议用CPLD或FPGA做接口扩展。实操心得多颗VR的AVSBus走线要等长尤其是SCLK和SDIO。如果走线长度差异大高速时钟下会出现时序问题。我遇到过一颗VR能通另一颗不通的情况最后发现是SCLK走线长了5厘米导致时钟偏斜。把走线改等长后问题解决。6. 动态电压调节的进阶玩法6.1 基于负载电流的闭环DVS开环DVS是根据频率查表设电压但实际负载电流是变化的。更好的做法是闭环DVS读电流根据电流调整电压。电流大时升压补偿IR压降电流小时降压省功耗。实现思路每1毫秒读一次电流和电压计算负载线的斜率。TPS53676支持负载线Load Line配置可以通过PMBus设置。负载线的作用是当电流增加时VR自动降低输出电压补偿PCB走线上的压降。这样处理器端的电压保持稳定。AVSBus在这里的作用是实时读电流监控负载变化。如果发现电流突变可以提前调整电压避免处理器端电压跌落。6.2 温度补偿与电压裕量高温下处理器的漏电流增加需要更高的电压才能跑相同频率。AVSBus可以读温度根据温度调整电压。比如温度每升高10°C电压增加10mV。这个补偿曲线可以预先标定存在MCU的Flash里。另外生产过程中芯片的电压需求有差异需要留电压裕量。AVSBus可以配合PMBus的裕量命令在标称电压基础上加或减一个偏移量。测试时用裕量命令找边界正常运行时用AVSBus做动态调节。6.3 故障保护与快速关断AVSBus读状态命令可以快速检测故障。如果发现过流或过温MCU可以立即通过AVSBus写一个低电压或者通过PMBus触发关断。AVSBus的响应速度比PMBus快适合做快速保护。但要注意AVSBus的写电压命令不是立即生效的VR内部有转换速率限制。如果需要快速关断应该用PMBus的OPERATION命令直接关闭输出。AVSBus适合做电压调节不适合做保护关断。7. 个人实操体会与建议调TPS53676的AVSBus接口我最大的体会是协议本身不复杂但细节决定成败。CRC的位序、SPI的模式、CSB的时序任何一个细节错了通信就不通。而且这些问题往往不是代码逻辑错误而是配置错误调试时容易忽略。我的建议是先用低速时钟比如1MHz把协议调通确认CRC、帧结构、读写命令都正确再逐步提高时钟。调试时一定要用逻辑分析仪抓波形光看代码是看不出问题的。另外TPS53676的数据手册要反复看尤其是时序图和CRC示例那些是最权威的参考。还有一点AVSBus的读操作是全双工的发送和接收同时进行。如果你用半双工SPI读操作会失败。STM32的SPI支持全双工但CubeMX里要配置成Full-Duplex Master。如果配置成半双工SDO引脚不会输出数据。最后分享一个小技巧如果你手头没有TPS53676的板子可以用FPGA或者CPLD模拟一个AVSBus从机用来验证MCU的驱动代码。模拟从机只需要实现CRC校验和简单的命令响应用Verilog写起来很快。这样可以在没有VR的情况下调试MCU端的代码效率高很多。
返回列表