今天所有最好的集成电路都是使用BGA封装进行大规模焊接的。因为BGA封装方式接在芯片下方,所以焊接比较紧密,需要回流焊箱或者热板。另一个问题是,在设计PCB(印刷电路板)时,过孔和引线之间的焊球需要足够小,主板上通常需要更多层,以便为彼此相邻的引线腾出空间,这意味着中国制造的廉价双层主板没有足够的空间,因此需要更多层。额外的层数会显着增加主板的成本,即使只是多加几份。我想设计一块内置BGA芯片的主板,体验一下焊接它们的难度。所以我决定设计一个可以运行Linux的小型ARM嵌入式系统。使用的ARM处理器是217球LFBGA封装的AT91SAM9N12,只是因为在带有运行Linux所必需的内存管理单元的ARM处理器中,它是最便宜的。起初我只想使用BGA芯片,但BGA封装的RAM比其他封装便宜得多,所以我决定在BGA封装中也添加DDR2(DoubleDataRate2)内存。定位过孔以最大化可用空间。结果费了好大劲才找到主板厂商。两层的空间不够,至少需要四层。217-LFBGA封装的球径为0.4mm,接球距离为0.8mm。为了给过孔留出更多空间,球的焊盘布局做得比焊球略小。我使用了0.36mm的垫子。在4个球之间放置过孔将最大限度地利用可用空间。制造商需要能够制造适合0.8毫米宽的过孔。几乎所有厂家都能做这个直径的过孔,但问题是:这个距离包括过孔的钻孔直径、过孔环宽度的两倍、过孔与引线之间最小距离的两倍。距离。例如iTead的4层主板最小过孔直径为0.3mm,最小环宽为0.15mm,过孔与引线的最小距离为0.15mm,加起来为0.9mm,即最小尺寸过孔不能放置在BGA球之间。我发现能够以相对合理的价格做到这一点的唯一制造商是OSH公园。他们的四层板具有更小的限制,其通孔刚好适合BGA球。作为一个额外的好处,它比用于小型主板的iTead便宜一点。在OSHpark设计原则下,最小的via可以被放置。尽管可以在BGA球之间放置过孔,但仍然存在一些问题:没有足够的空间让走线在过孔之间布线。这意味着不可能有一个标准的布线通道,每个焊盘都有一个过孔。这意味着主板需要有足够的未连接焊盘,因此布线需要从内部走线。幸运的是,处理器还有很多通用的未连接的I/O引脚。……如果不违反设计原则,走线是不能恰好从两个过孔之间穿过的。CAS过孔没有足够的空间容纳DQM0和D15过孔。生产问题解决了,是时候开始考虑在主板上放什么组件了。我不太关心这块主板的实际用途。与使用相比,整个项目更多的是一个学习的过程。为了降低成本,主板的尺寸应该小一些。这意味着没有为以太网、串口或SD卡等额外接口预留空间。除了处理器和RAM之外,其他需要的部分是:大内存、稳压器和处理芯片复位的监控电路。处理器可以从NAND启动,但以防万一我决定为引导加载程序添加Dataflash(数据闪存),尽管它最终会很少使用。对于大内存,NAND是一个不错的选择,因为它容量大而且价格便宜。将它添加到BGA封装中会更便宜,但我已经受够了两个BGA封装,所以我决定在48引脚TSOP(薄小外形封装)封装中使用4GBNAND。连接各种组件在处理器清单中有很好的解释,但很难在数千页的文档中找到所有详细信息。Atmel还发布了试用板的原理图,这在设计电路板时很有帮助。DDR2的引线空间应该有一定的自由度。普通引线应该有足够的长度,具有受控阻抗并且可以端接或与电阻器串联连接。在开发板的参考设计中,所有的DDR2信号都使用串联电阻。我没有足够的空间容纳他们,所以我决定暂时让他们一个人呆着。阻抗也不是50欧姆,因为我必须使用更小的引线来填充其他空间。我的希望是,由于RAM更靠近处理器,因此缺少串联电阻箱或阻抗不匹配并不重要。从CPU到RAM的所有连接长约25毫米。一般的经验法则是,如果引线长度超过信号波长的10%,则应考虑过渡线的影响。这种情况意味着频率高于大约1GHz。RAM的时钟频率仅为133MHz,甚至前几次谐波也低于1GHz,这应该是个好兆头。我几乎完全匹配引线长度以确保它有效,但也许这不是必需的。供电有点复杂。处理器内核的工作电压为1伏,RAM需要1.8伏,NAND需要3.3伏。由于USB的输入电压是5V,主板需要三个不同电压的适配器。一般情况下最好在主板上留一层做电源,和信号分开,降低电源的阻抗,但主板只有4层,其中一层作为背板。这意味着只剩下两层用于信号处理,这似乎是不够的。因此,我没有为电源取出单独的层,而是为不同的电源在不同的层中制作了一些挡板。对于USB供电的应用,线性稳压器在最坏情况下的功率损耗太大,因此我决定使用3.3伏稳压器作为更高效的可切换稳压器。1.0伏和1.8伏的调节周期是一个以3.3伏为输入电压的线性稳压器。由于线性稳压器的损耗取决于输入和输出电压之间的差异,因此使用3.3伏可提高5伏以上的效率。电路原理图。PDFPCB布局,尚未焊接。#p#焊接空电路板。焊料和组件固定在背面。焊料是用牙签手动固定的。这里的零件都是1毫米(0.04英寸)长。我只是拿了几个来测试,看看它们是如何回流的。如果情况不太好,我会用另一块板代替它。使用烤箱和自制控制器来控制回流。回流后。三个零件被焊接到一个错误的地方。反正最后还是拿掉了,板子上的去耦电容够用了,就算少了一小部分,也无所谓。我还错误地在左上角应该有电阻的位置放了一个电容。对于上层,我有一个用于OSH的模板,因此我不必手动将焊料焊接到BGA板上。直接按在桌子上,我把主板和模具焊牢了。模板阵型排列整齐。这看起来有点矫枉过正,但几乎任何焊料都可以使用。需要一些额外的焊料来稍微平整模板。#p#展开焊料并移除模具。比我手工做的背面好多了。我从非BGA部件开始。它们用一双稳定的手用钳子固定。CPU和我的指尖。球间距为0.8mm。许多较新的BGA甚至使用小于0.5毫米的间距。BGA固定在电路板上。元器件贴装的位置误差需要小于0.4mm,否则可能会焊成一排间隔,而且因为焊球在芯片下面,无法检查。没有丝印边框,几乎不可能以所需的精度放置。使用丝网印刷,很容易沿着丝网印刷的边缘对齐。重新焊接正面,抬高PCB,使底部的零件也不会接触到其他任何地方。焊接表面的张力将防止底面倾倒。经过烤箱后。焊点看起来不错,所有零件都在它们应该在的地方。焊接NAND闪存。我的烙铁件比引脚大一点。一次焊接一个引脚太困难了。更简单的方法是用吸锡器吸出装锡后多余的部分。去除多余的焊料后,焊点现在质量很好。加上电源头和调试串口后,主板就焊接好了。#p#最终产品。另一方面,空位是为Dataflash准备的。将USB线连接到USB设备口后,不出意外,看到新的串口/dev/ttyACM0出现了。然后用SAM-BA程序(用来编程bootloader和kernel)打开,一切正常。很多人说焊接BGA很难,但是从这次的经历来看,我觉得还可以。也许这只是运气,但我确实毫无问题地完成了它。打开SAM-BA。at91sam9n12ek是Atmel为这款处理器提供的开发工具,他的配置也适用于这款板子。DDR2也可以工作,执行程序,还可以写回NAND。一切都好。软件引导加载程序当引导过程开始工作时,内部ROM加载程序会尝试在不同的内存区域中寻找合法程序。它将扫描SPI(串行外设接口)缓存、SD卡、NAND闪存、辅助SPI闪存和I2CEEPROM以查找合法程序。一旦找到,立即启动,否则会进入SAM-BAmonitor,即进入调试模式,此时处理器会监听串口和USB口的指令。在这种模式下,可以对引导加载程序进行编程。ROM引导不能直接引导linux内核,因此需要辅助引导加载程序。它初始化RAM和时钟,然后开始加载linux内核。AT91Bootstrap是一个现成的引导加载程序,可以完成这一系列操作。它被放置在NAND闪存开始的地方,或者如果我填充它可能被放置在Dataflash中的位置。虽然AT91bootstrap可以直接启动linux,但是后面启动U-boot的bootloader对调试更有用。U-boot是它自己的基于命令行的微型操作系统,可以读取U盘、使用以太网、读写NAND,当然还可以启动linux。例如使用U-boot清除NAND或更改linux启动参数。要编译引导加载程序,需要ARM交叉编译器。我使用Sourcerycodebench精简版,因为它易于设置且运行良好。先加载AT91SAM9N12EK开发板配置文件最简单。与从头开始编写新配置相比,修改文件要省事得多。为了使这个自定义版本生效,需要进行一些更改:RAM大小需要设置为64MB,bank数量更改为4,一些实验需要稍微调整(试用版有128MBRAM容量,8个银行)。NAND的初始功能也需要改变。与开发板相比,需要连接NANDflash的地方有些不同,所以需要告诉bootloader。U-boot由于AT91bootstrap已经初始化了整个硬件,因此配置U-boot很简单。还有at91sam9n12ek的配置文件,不过默认是从SD卡启动。由于硬件已经配置好了,所以其他需要改的地方不多。有一些选项,例如在NAND闪存上创建和更改分区时启动UBIFS工具,以及提供对读取ext4格式的USB记忆棒的支持。USB支持使得从U盘引导Linux内核成为可能,这使得尝试不同的内核配置变得容易。Linux和根文件系统安装linux不像安装普通的x86pc那样容易。需要配置内核以支持所需的各种设置,并且需要创建根目录的映像文件。它可以手动完成,但使用buildroot更容易。后者是一组用于构建根文件系统和内核的工具。整个过程可能有点困难,因为kernel和buildroot有很多选项。Buildroot不提供at91sam9n12ek开发板的配置文件,但它确实提供了另一个Atmel开发板at91sam9260ek的配置文件。使用此配置文件作为基线,配置会更容易。可以通过“makeat91sam9260ek_defconfig”加载。起初我们想要一个相对较新的内核版本,因为相对于处理器只有很小的变化,所以我们使用上周发布的3.15.1版本。使用buildroot的“makelinux-menuconfig”命令配置Linux。它将打开通常的Linux菜单配置窗口。内核中最重要的配置是系统类型的配置菜单。我们需要勾选AT91SAM9N12的支持和“AtmelAT91SAMEvaluationKitswithdevice-treesupport”选项。设备树是内核加载的外部二进制文件,它描述了开发板上每个硬件的可用性。这使得using同一个kernel不同的板子,不同板子的设备配置,可以写成文本,而不是每个板子写一个稍微不同的C文件。幸运的是:有一个可以作为benchmark文件的设备树文件at91sam9n12ek。需要做的更改只是简单地删除未使用的设备。这个修改后的设备树文件需要添加到buildroot配置中,以便它知道如何从映像文件编译和构建。其他值得在内核中启动的选项是:USBhost支持AT91_USB。支持处理器内部的NANDflash和NANDECC控制器。支持UBIFS,将用作根文件系统。读取U盘Ext4支持。在buildroot期间配置过程中,我们需要选择要安装在根目录下的程序以及生成根文件系统映像的选项。本开发板是原始的NAND内存,没有控制器,所以不能使用ext4等一般的桌面文件系统。UBIFS是通常的选择,它恰好在这里工作。UBIFS有一些选项取决于NAND闪存的类型。如果设置错误,LInux将无法读取最终的文件系统。这些选项可以从NANDFLASH数据列表中获取,但更简单的方法是从U盘启动linux,并从那里创建ubi分区。或者你可以使用U-boot的“ubiinfo”命令,它会读取NAND并输出所需的配置值。输入“make”后,Buildroot将下载交叉编译器、linux内核和所有其他包,构建并输出内核、设备树和根文件系统映像。然后就可以使用SAM-BA程序传输到开发板了。有些程序需要对NANDECC控制器参数进行编程。AT91bootstrap、U-boot、linuxkernel也要配置一些参数,否则会报NAND已损坏。在这种情况下,NAND有2048字节和512字节扇区,ECC能够每1个扇区纠正4个字节。可以在AT91的引导程序和U-boot配置文件中找到存储这些映像的NAND地址。对电路板进行编程并重置后,ROM引导加载程序应该能够在NAND上找到AT91bootstrap并开始引导过程。如果您对更多详细信息感兴趣,可以在此处找到所有硬件和软件文档。原文链接:http://blog.jobbole.com/75414/
