ARTICLE DETAIL

资讯详情

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

从零自制i.MX6ULL核心板SoM:硬件设计与调试全流程实战

从零自制i.MX6ULL核心板SoM:硬件设计与调试全流程实战 这几年做嵌入式硬件我一直在跟各种核心板、开发板打交道。用过的SoMSystem-on-Module系统模组不算少从NXP i.MX系列到TI AM335x再到瑞芯微、全志的板子基本套路都摸过一遍。但每次项目周期紧张的时候我总会想一件事这些SoM真的都是必要买的吗有没有可能我们自己就能做出一块能跑Linux、接口齐全、成本可控的SoM这个念头跟了我大概两三年直到上个项目验收完我终于腾出时间完整走了一遍从原理图到PCB、从焊接调试到BSP适配的全流程做出来一块基于i.MX6ULL的自制SoM。整个过程踩了不少坑但也把很多文档里不会写的东西彻底搞明白了。这篇文章不聊虚的只讲实操把我从零做SoM的完整思路、选型逻辑、硬件设计要点、软件适配流程、以及调试过程中遇到的真实问题全部摊开来讲。想自己动手做核心板的硬件工程师、嵌入式Linux开发者或者想搞清楚SoM内部到底是怎么回事的朋友这篇应该能给你省下不少弯路。1. 自制SoM的整体设计与思路拆解1.1 为什么非要自己造轮子先说个大实话市面上现成SoM一堆几百块到几千块都有大部分项目直接买确实更省事。但自制SoM真正值钱的地方不在省钱而在于三件事第一是学习价值。SoM是嵌入式系统里硬件复杂度最高的一类产品之一。电源树设计、DDR布线、高速信号完整性、BSP适配、启动流程这些技能在普通单板项目里很难接触全面。自己做一块SoM相当于把这些硬骨头全部啃一遍。第二是定制化需求。有些项目对尺寸、接口、温度范围、供货周期有特殊要求。比如我这次选的i.MX6ULL工业级-40到85度货源稳定生命周期长这些在消费级SoM上很难同时满足。第三是成本可控。小批量采购的话自己做SoM的BOM成本能比买现成核心板低30%到50%量大了差距更明显。当然前提是你得有人力去设计、调试和维护。1.2 方案选型背后的关键决策选处理器是整个项目里最重要的决策没有之一。我的选择是NXP i.MX6ULL理由很直接核心是ARM Cortex-A7单核主频528MHz可超到800MHz带NEON和FPU跑Linux完全够用内置硬件加密引擎、安全启动等特性做产品放心功耗低典型应用场景板级功耗不到1W不用复杂散热民用级和工业级都有引脚兼容设计一次可以覆盖不同市场参考设计开源程度高NXP的官方评估板资料非常全供货周期稳定不像某些消费级SoC动不动就缺货内存选了DDR3L单颗512MB16位总线。为什么不用DDR4因为i.MX6ULL的DDR控制器只支持DDR3/DDR3L最高到LPDDR2。这决定了存储方案上限选型的时候要注意别选控制器不支持的存储类型。存储用的eMMC海力士8GB一颗搞定。比NAND控制器方案省事得多。eMMC自带坏块管理和ECCLinux下直接用mmcblk设备不需要自己折腾UBI层。对产品来说省心就是最大的价值。1.3 功能框图与模块划分一块典型SoM需要包含以下功能模块处理器核心SoC内存DDR3L颗粒存储eMMC电源管理多路DCDCLDO按顺序上电时钟系统主晶振RTC晶振网络接口以太网PHY或引出RMII/MII接口启动配置启动拨码或电阻配置对外接口邮票孔或板对板连接器我这次设计的SoM采用邮票孔半孔设计尺寸40mm x 40mm引出引脚包括2路百兆以太网RMII接口2路USB 2.01路OTG1路Host2路CAN2路UART多路GPIO、I2C、SPI、PWMJTAG调试接口电源输入单路5V输入板内转出3.3V和1.8V供核心使用选用邮票孔是因为它对载板的制造工艺要求低焊接简单成本也相对便宜适合小批量。B2B连接器虽然可插拔方便调试但在强振动环境下可靠性不如邮票孔且成本高不少。2. 硬件设计核心细节与实操要点2.1 电源树设计与上电时序SoM电源设计是整个硬件最容易翻车的地方。i.MX6ULL的外部电源要求不复杂但上电时序有严格约束。我们来看具体的电源需求VDD_SOC_IN1.2V到1.35V区间给SOC核心供电最大电流约800mAVDD_HIGH_IN2.8V到3.3V给IO和模拟电路供电NVCC_*IO电平参考电压各Bank可以独立常见1.8V或3.3VVDDSNVS_IN1.5V到3.3V给SNVS安全非易失存储域供电我的电源树设计如下5V输入 - 3.3V DCDC给eMMC、PHY、IO供电- 1.8V DCDC给DDR3L和部分IO- 1.2V DCDC给核心供电关键点在于上电顺序。i.MX6ULL要求VDD_SOC_IN、VDD_HIGH_IN、VDDSNVS_IN这几个电源的上升时间要小于20ms同时要先于NVCC_*上电或者同步上电。最稳妥的方案是DCDC直接并联在主电源轨上通过RC延迟控制使能脚实现顺序启动。SNVS电源要最先上电因为它负责RTC和复位逻辑。实测下来用TI的TPS62130或MPS的MP2143这类小封装DCDC加上RC延迟能很好地满足时序要求。不要在这个环节省电容每个电源轨至少放10uF0.1uF47uF的组合高频滤波和低频稳压都要照顾到。2.2 DDR3L布线要点DDR3L布线是SoM设计里技术含量最高的部分。16位DDR3L跑400MHzDDR800等效虽然频率不算高但依然要遵守差分和等长规则。数据线组DQ0-DQ15DQS0/DQS0#DQS1/DQS1#需要等长长度差控制在±20mil以内。地址控制线组ADDR、BA、CAS#、RAS#、WE#、CS#等需要相对时钟等长长度差控制在±50mil以内。重要的细节是DQS与CLK的关系。DQS相对CLK需要满足一定的时序关系具体值要参考i.MX6ULL的datasheet中的DDR3接口时序参数表。实际布线时我会让DQS走线比CLK短大约200-500mil给读写时序留一点裕量。DDR3L的供电要特别注意。VDD是1.35VVREF要精确到VDD/2VTT是VDD/2但必须能吞吐电流。VREF用电阻分压加电容滤波生成VTT用专门的LDO或开关电源生成。很多新手的板子DDR跑不稳不一定是布线问题很可能是VTT电源噪声太大。走线尽量做阻抗控制。单端50欧姆差分100欧姆。对于两层板做DDR有点吃力建议至少四层板DDR走线集中在顶层参考层完整连续。我的板子用的是四层顶层信号、第二层GND、第三层电源平面、底层信号。2.3 启动配置与拨码设计i.MX6ULL支持多种启动方式串行下载USB、SD卡、eMMC、NAND、NOR Flash等。启动模式由BOOT_MODE[1:0]引脚和eFUSE配置决定BOOT_MODE引脚拉高拉低选择不同的启动设备。BOOT_MODE[1:0]的组合BOOT_MODE[1:0]00串行下载USB模式BOOT_MODE[1:0]01内部启动模式从BOOT_CFG引脚配置的启动设备启动BOOT_MODE[1:0]10保留BOOT_MODE[1:0]11测试模式为了兼顾量产烧录和日常调试我设计了3位拨码开关SW1BOOT_MODE0SW2BOOT_MODE1SW3eMMC启动使能对应BOOT_CFG相关引脚量产时拨到eMMC启动开发时拨到USB下载模式。这个设计很实用不用每次都改eMMC里的uboot参数硬件层面直接切换启动源。另外要注意i.MX6ULL的启动设备选择还会参考BOOT_CFG1_7LPSD/FSD引脚、eMMC的电压等这些引脚在原理图上要正确配置否则会出现uboot在eMMC启动时崩溃的情况。具体每个引脚的上下拉NXP的参考手册里有详细说明照着做就行。2.4 晶振与时钟电路i.MX6ULL主时钟用24MHz晶振精度要求±50ppm以内。我选的是无源晶振加两个12pF负载电容。注意晶振的负载电容值要跟晶振规格书匹配不然频偏会导致网络PHY同步不了。RTC时钟用32.768kHz晶振给SNVS域供电的RTC模块用。这个晶振直接挂在RTC_XTALI和RTC_XTALO引脚上电流要求很低但要选低ESR的型号确保在低功耗模式下也能稳定起振。一个容易忽略的点如果用了以太网PHYPHY也需要自己的时钟源。我会给PHY配一个独立的25MHz晶振而不是从主芯片分频这样布局更自由电磁干扰也更好控制。2.5 eMMC电路设计细节eMMC虽然自带管理但电路设计上还是有几个容易踩的坑。eMMC的供电是3.3VVCC和1.8VVCCQ两个电压都要稳定。VCCQ是IO电平参考如果接了1.8V那么CMD、CLK、DATA线的信号电平也要匹配1.8V。CLK信号建议串接22欧姆到33欧姆的电阻减小反射。CMD和DATA线可以串10欧姆左右。这些电阻对信号完整性的改善非常明显特别是在PCB走线比较长的情况下。eMMC还要求一个上电时序和复位时序。具体是上电稳定后CLK信号要先给至少74个周期然后CMD线才能发送命令。这个时序一般由BootROM或uboot处理但你的硬件上电复位时间不能太长否则会导致eMMC初始化失败。我建议SoM的复位信号由板级看门狗或外接控制器控制而不是简单的RC复位这样软件可以在启动前确保所有外设都处于确定状态。2.6 以太网PHY选型与RMII接口设计i.MX6ULL自带两个MAC要接PHY才能出网口。我选的是Microchip KSZ8081RNA100Mbps功耗低工业级型号也多见引脚布局在四层板上方便布线。KSZ8081和i.MX6ULL之间用RMII接口包括TX_EN、TXD[1:0]、RXD[1:0]、RX_DV、CLK_REF50MHz等信号。这里有个坑要特别注意RMII时钟是由PHY提供50MHz参考时钟给MAC还是由MAC提供时钟给PHY两种模式的接法不一样。i.MX6ULL支持这两种方式但需要通过复用引脚配置。我个人推荐用PHY提供50MHz时钟给MAC的外部时钟模式。这种模式下PHY的XI时钟引脚接25MHz晶振PHY内部倍频到50MHz从REF_CLK引脚输出给MAC。好处是MAC侧不需要额外产生时钟时序上更好保证。PHY的复位信号不要和SoC的复位信号搞到一起。我给PHY单独分配了一个GPIO做软复位这样在上电后可以单独对PHY做复位避免时序问题导致PHY状态不确定。2.7 载板接口定义与引脚保护把哪些功能做到SoM上、哪些留给载板这是个权衡问题。做太多SoM会变大、变贵做太少又失去了SoM的意义。我的分配原则是软件需要紧密耦合的放SoM上外设接口的需求留给载板。具体来看DDR、eMMC、电源、以太网PHY这些核心组件必须在SoM上这是它作为最小系统的职责。而USB connector、RS232收发芯片、CAN收发器、继电器驱动这些则通过引脚引出到载板。引脚的电气保护和防错设计也要提前想好。所有引出引脚上电源域要清晰标注接口引脚如果有5V耐受需求要加ESD保护管和限流电阻。CAN、RS485这类总线接口引脚最好通过SoM内部的缓冲器或隔离器后再引出防止外部短路烧坏主芯片。3. 实操过程与核心环节实现3.1 原理图设计流程我用的是KiCad 7做设计开源免费社区资源多做这个量级的项目完全够用。先是整理元器件库。i.MX6ULL的封装用LFBGA-289DDR3L用BGA-78eMMC用BGA-153PHY用QFN-32。KiCad官方库里有DDR3的封装eMMC也有但i.MX6ULL和KSZ8081得自己画。我建议直接从NXP官网下载官方评估板的原理图PDF照着画封装和原理图比自己在datasheet里找引脚定义快得多。原理图分模块画电源模块5V输入、DCDC电路、LDO、电源指示灯主芯片模块i.MX6ULL核心、晶振、启动配置、复位内存模块DDR3L、VREF和VTT生成存储模块eMMC、上拉电阻网络模块PHY、网络变压器接口引脚引出引脚引出模块把所有IO按功能分组引出画原理图时多用网络标签和电源符号区分模拟地、数字地、电源地。虽然四层板共用一个GND层但从原理图上分类清楚后面的PCB布局会好做很多。3.2 PCB Layout关键步骤PCB布局是决定SoM成败的环节。我的经验是DDR部分优先布局其次是电源和晶振然后才是其他外设。DDR布局要求SoC到DDR的BGA出线尽量短BGA内部的过孔不要打到DDR的电源网络上。地址线和数据线的分组、等长在布线之前先用布线规划工具画出来。实际走线时数据线组内等长地址线与时钟线等长。焊盘上做半孔castellated holes时板框边缘要去掉铜皮。半孔位置只能在板的四周且不能和内部走线交叉。我建议半孔间距至少0.8mm以上孔径0.6mm左右不然板厂做出来容易毛刺。电源布局把所有DCDC靠近输入引脚输入电容越小越好。开关电源的SW节点要尽量窄反馈电阻走线远离SW节点避免拾取开关噪声。地平面在DCDC下方的区域切开减少开关噪声耦合到模拟区域。晶振位置离SoC越近越好走线短而宽晶振下方不要走其他信号线。RTC晶振附近要避免任何数字走线不然漏电和噪声会影响时间精度。另外一个非常关键的点BGA扇出和DDR布线需要仔细规划参考层。我这次用四层板第二层GND是DDR信号的主参考层所以在布局时DDR部分下方的第二层不能有电源平面分割必须保持完整的GND。电源平面放第三层但DDR走线不可以跨越电源平面的裂缝。3.3 焊接与制造注意事项SoM用了三个BGA封装i.MX6ULL、DDR3L、eMMC焊接是个门槛。手工焊接BGA我试过用热风枪吹成功率不高特别是i.MX6ULL的BGA中心有thermal pad热量不足很容易假焊。如果要小批量做直接找有BGA返修台的板厂或者焊接工厂代工费用不高但成功率极高。我的建议是打样阶段就把BGA贴片和回流焊让板厂完成自己只焊外围直插件。板厂一般都可以接受钢网贴片回流焊的一站式服务。我自己只焊了拨码开关、电容、电阻这些。能只用回流焊就不要用热风枪和烙铁尤其是BGA底部有thermal pad的芯片热风枪从上面吹芯片底部温度可能达不到焊接要求。焊接完成后先不要急着上电。先把电源部分的DCDC输出量一遍确认所有电源轨电压正确且噪声在合理范围内用示波器看纹波峰峰值控制在50mV以内。再测各个关键节点的复位信号和时钟信号是否正常。确认无误后再尝试连接USB烧录模式。3.4 启动流程与BootROM验证i.MX6ULL内部有个BootROM上电后会根据BOOT_MODE引脚选择启动设备。如果BOOT_MODE00则进入USB串行下载模式可以用NXP的mfgtool工具烧录镜像到内存或eMMC。第一次上电我用USB线连接SoM的OTG口和电脑主机识别到一个HID设备。mfgtool需要配置对应的配置文件.vbs和.ucl2指定要烧录的uboot镜像。烧录到eMMC后拨回eMMC启动模式理论上就能看到串口输出的uboot启动信息。我这个板子第一次启动没出信息。后来排查发现是启动配置引脚的上下拉电阻选错导致BootROM找不到eMMC。这个问题在后面章节详细展开。3.5 BSP适配与Linux内核配置硬件跑起来之后软件适配才是真正让人掉头发的阶段。我的BSP适配流程分四步第一步用NXP官方Yocto SDK生成基础BSP。NXP的meta层里已经支持i.MX6ULL EVK开发板我可以直接以EVK为模板生成基础镜像验证硬件是否正常工作。第二步适配设备树。在官方bcmboard configuration基础上根据我的板子裁剪设备树。我的SoM没有I2C上某些外设需要删掉对应节点。sensor等外设要放在载板设备的设备树里。第三步改bootloader配置。uboot里要配置DDR时序参数、eMMC启动环境、网络配置等。i.MX6ULL的DDR初始化是一个很繁琐的过程很多参数来自datasheet里的DDR3颗粒的时序参数。如果参数配置不对DDR可能会初始化失败或者随机数据错误。NXP提供DDR stress test工具可以在uboot阶段跑内存压力测试这个工具一定要用能测出时序参数是否合适。第四步内核配置。我的Linux内核可以直接用NXP的5.15分支或mainline内核反正核心板硬件大部分都能被主线和官方BSP覆盖。配置时把不需要的驱动关掉减小内核体积加快启动速度。最后用Yocto或Buildroot生成完整的镜像烧录到eMMC。3.6 mfgtool烧录配置实战mfgtool烧录分两个阶段先把uboot烧到eMMC再由uboot烧写完整系统镜像。我记得第一次配置mfgtool的时候花了很久才搞清楚烧录脚本的规则这里把核心操作梳理一下。在mfgtool的Profiles/Linux/OS Firmware目录里ucl2.xml文件定义了烧录动作。我的烧录命令大概是这类流程设备进入USB下载模式后mfgtool会加载一个烧录用的uboot到RAM这个特殊uboot通过USB接收来自主机的镜像文件再把这镜像写入eMMC的对应分区注意烧录uboot时不要覆盖整个eMMC而是写到特定的偏移地址。i.MX6ULL的uboot是烧到eMMC的0x400偏移即第二个扇区前面留出第一个扇区放分区表。错误地把uboot写到0x0偏移会导致启动失败因为BootROM在eMMC启动模式时会跳过第一个块的引导代码。镜像烧录完一定要用fsck检查文件系统我遇到过一次烧录过程意外中断导致eMMC分区表损坏的事故后来给fpga上电前必须做完整循环检查。3.7 DDR压力测试与信号完整性问题排查uboot阶段我最推荐跑NXP官方的DDR stress test工具。这个工具可以把DDR的寄存器参数打印出来做各种读写模式测试还能显示测试结果。我的板子第一次DDR测试就出现大量错误原因是PCB上DDR的VREF参考走线过长且从走线上直接分压导致VREF噪声偏大。后来我飞线把VREF改成从DCDC输出端分压并加了一个0.1uF电容问题立刻消失。这说明DDR布线时的VREF处理远比想象的重要。VREF走线不能和数字信号走线靠太近避免串扰。VREF走线最好能覆盖一个地线隔离层或者至少先走一小段电源平面再分线。另一个排查出问题的点是数据线DQS和CLK的时序偏差太大导致在高温下DDR读写不稳定。虽然常温下测试能通过但工业级产品对温度范围有要求最后我把DQS走线长度缩短了约300mil再测高温下也稳定了。4. 常见问题与排查技巧实录4.1 上电后串口无输出的排查套路串口没有输出是自制SoM最常见的故障99%都是下面几种原因电源没起来或电压不对首先要量电源树每个节点的电压晶振没起振用示波器探头看XI引脚的波形BootROM选择启动设备失败检查BOOT_MODE引脚状态eMMC或DDR初始化失败导致uboot根本没执行到输出阶段串口引脚复用或电平不对连不上调试串口我的排查顺序先用万用表量所有电源对地短路吗没有短路就上电量电压。然后示波器看24MHz晶振的波形。接着量复位引脚是不是正常拉高。最后看启动配置。如果这一切都正常还没输出就要用逻辑分析仪抓eMMC的CLK和CMD信号看BootROM有没有在发命令。我见过一个特别诡异的问题电源电压正常晶振正常BOOT_MODE也正确但就是没有输出。最后发现是DDR的RESET引脚没接上拉电阻导致DDR一直处于复位状态。加上10k上拉后一切正常。这类问题没有捷径只能靠逐步排查。4.2 eMMC启动失败的三个坑eMMC启动失败的原因我总结一下配置引脚错误例如eMMC的电平选择引脚配置不对导致BootROM用错误的IO电压去读eMMC读不到正确数据烧录偏移错误uboot写到了错误的位置复位时序问题eMMC的上电时序不满足CLK信号过早或过晚出现遇到eMMC启动失败最有效的办法是先用USB下载模式启动板子在uboot里用mmc命令检查eMMC是否可见、分区和文件是否完整。如果能读到说明硬件层面eMMC工作正常问题在boot配置如果读不到那问题在eMMC的硬件电路。我的板子首次deng上电就是eMMC看不见后来发现是BOOT_CFG引脚的上下拉配置错了。NXP的数据手册里对每个启动设备的BOOT_CFG引脚都有描述我那次是eMMC的FDT选择引脚具体是把某个引脚拉低了导致BootROM用1.8V时序去读3.3V的eMMC我改正后正常。所以动手做板子前启动配置引脚的真值表一定要反复核对。4.3 网络PHY协商不上问题的诊断网络PHY调试是另一个高频雷区。PHY协商不上首先要看PHY的link/act LED有没有亮。如果LED没亮大概率是PHY的供电或者复位问题。量一下PHY的芯片温度如果发烫说明供电接错。如果LED亮但ping不通用uboot的mii命令查看PHY的寄存器状态确认是不是通到auto negotiation。我的是在手工焊接时不小心把KSZ8081的某些引脚虚焊了表现为所有寄存器都能读但RX和TX通道有数据错乱。重新焊接之后问题解决。还有一个常见的坑是PHY地址冲突。如果多个PHY共享MDIO总线地址要不同。我的板子只有一路PHY地址通过PHYAD0引脚下拉为0正常。网络变压器也是很容易出问题的地方。很多载板设计是必须外接网络变压器但我的SoM只引出RMII信号网络变压器放在载板上。如果直接把SoM的差分引脚接到RJ45的磁性元件上没有中间变压器信号幅度和共模抑制都不够会导致丢包。这是很多新手做SoM时第一个网络不通的原因。4.4 载板设计时的干扰与兼容性问题自制SoM最终要配合载板工作载板设计也有讲究。最常见的问题是载板上的数字噪声通过SoM的电源引脚耦合进来。我建议SoM引脚组里加多组VDD和GND载板要给这些电源脚加足够多的去耦电容。另外有些SoM引脚在SoM内部被配置为特定功能如I2C上拉、SPI模式选择载板如果也做同样的上下拉会导致电平冲突。在SoM的数据手册或原理图里要明确标注哪些引脚内置了上拉/下拉载板设计时避让这些引脚。我这次SoM引出引脚中有些是复用引脚默认作为GPIO有些是功能引脚。为避免载板误用我在SoM的用户手册里做了一张引脚功能表每个引脚都标注了默认功能和可复用功能以及电压域。5. 后续扩展与量产建议5.1 从原型到量产的硬件改动原型验证通过后如果要走量产有几个地方必须改一是把拨码开关改成电阻配置或者干脆eFUSE固化启动配置。拨码开关在量产阶段是多余部件还会增加漏电和误触发的风险。二是把测试点加上。量产阶段需要做ICT在线测试和FCT功能测试测试点不能少。每个电源轨、关键信号都要有测试点方便自动测试探针接触。三是优化BOM成本。原型阶段用的开发板级元件可能比量产级贵比如我原型用的DCDC是TI的量产阶段换成了国产替代性能差不多成本降了30%。但替代之前必须做完整的验证特别是电源纹波和效率指标。四是温升测试。SoM在密闭空间里工作散热条件差。量产前要做热成像测试确认芯片温度在降额范围内。i.MX6ULL的正常工作结温上限是105度工业级但长期可靠性建议控制在85度以下。5.2 软件长期维护与安全启动自制SoM的BSP要做好版本管理。我建议从最开始就用Git管理Yocto的meta层每次修改都留commit记录。这样如果后续换了内核版本或者有人动了设备树你可以知道是谁改的、为什么改。安全启动Secure Boot是工业产品经常被忽略的需求。i.MX6ULL支持HABHigh Assurance Boot安全启动可以对uboot和内核镜像签名。量产产品如果要部署安全启动要在硬件设计阶段就把eFUSE的烧写方案考虑进去因为eFUSE是一次性的烧错就废了。我这次原型板没有启用安全启动但PCB上预留了eFUSE烧写相关的电路位置包括一个电源控制接口和调试接口方便后续做批量启用。5.3 可以用自制SoM做什么项目自制SoM并不是为了替代所有现成SoM它更适合这些场景成本敏感但需要Linux系统的工业控制器有特殊接口需求的自定义载板需要在恶劣环境下工作的嵌入式计算机教学和培训让团队真正理解嵌入式系统底层长期供货需求明确希望摆脱开发板依赖的产品我这次做出来的SoM最终用在一个农用机械的控制器里跑Linux负责CAN总线通信、传感器采集、HMI显示和远程升级。整体成本比之前买现成核心板低了不少而且因为是自己设计的遇到售后问题我可以直接从原理图开始排查而不是被上游供应商牵着走。6. 最后分享几个实用心得做到这一版SoM前后花了大概3个月其中一半时间在DDR调试。回过头来看有几点想特别跟打算入坑的朋友说。第一个心得是原理图设计阶段不要急着画PCB。把NXP官方参考设计看明白每一个引脚为什么这么接都搞清楚再动手。参考设计不是叫你想都不想就抄而是要理解里面的每处细节然后根据你自己的需求做取舍。我当时就是过于依赖参考设计结果把参考设计里一些用于开发调试的电路也抄了进来导致自己多焊了很多用不到的电阻电容。第二个心得是DDR调试一定要留出时间余量。即使你的布线完全遵守了规则第一次上电DDR测试也有很大概率报错。NXP的DDR stress test工具要会用那些寄存器参数要能看懂。DDR的问题不只是电气层面的还涉及SoC内部控制器和DDR颗粒物理层的时序交互这种问题排查起来非常耗时。第三个心得是选型阶段把眼光放远一点。当时我犹豫过要不要用i.MX8M Nano之类的更高端SoC最后选了i.MX6ULL因为需求很明确。项目需求如果只是跑Linux、跑应用业务不需要GPU不需要太多性能那选个经过验证的成熟芯片是最稳的。芯片生态完善、资料丰富对你的时间成本也是巨大的节省。第四个心得是自制SoM这件事做一次的价值远远大于做出来的板子本身。它把嵌入式系统从买板子—写软件推进到造板子—写系统的层面中间要补的知识量非常大。但正因如此我觉得每一个做嵌入式硬件或者嵌入式Linux的人都应该找机会完整地走上这么一遍。
返回列表