线编程(In-Circuit Programming,ICP)是目前普遍应用的一种速度较快的MCU编程方式。对于笔者使用的Freescale半导体公司的8位MCU来讲,通过芯片本身的串行通信接口进行在线编程的速度比使用芯片自带的MON08或BDM接口进行编程的速度要快得多。除了使用串行通信接口进行编程,由于自带USB 模块的芯片增多,使用USB接口进行在线编程速度更快。同时,由于可以使用USB供电,所以使用的电缆更少。
但笔者也发现,大部分在线编程系统都包含了PC方程序和MCU方程序两部分,在线编程时需要运行PC方的程序方可进行,但很多时候会遇到因主机或操作系统平台更换而引起PC方程序无法运行的情况。针对此种问题,笔者尝试在Freescale半导体公司新推出的带有USB模块的MCF51JM128芯片上实现了类U盘方式的在线编程功能:像U盘一样直接将目标文件放入便可实现编程,省却了PC方程序,方便了用户实际使用。
MCF51JM128(以下简称“JM128”)是Freescale半导体公司于2008年推出的一款Coldfire V1内核系列的微控制器,该芯片主要特点是内含一个集成的USB控制器,支持USB2.0全速主机、设备和On-The-Go。这种配置一般出现在高端微处理器中,在其他微处理器中很少出现,可以说是JM128非常有竞争力的特色。
1 设计思路
实现类U盘方式的在线编程功能,主要的工作在于实现JM128的类U盘功能。笔者在学习期间参与过在线编程系统的开发,其中一些已有的功能模块可以借鉴使用。该设计的主要思路是,通过开发板上的某引脚状态判断是否进入在线编程状态,若进入则对USB模块进行初始化,完成与PC机的U盘枚举的交互工作。 JM128不断查询PC方对U盘的操作,用户此时可打开U盘将目标文件粘贴,JM128一边接收目标代码数据包一边对数据包进行分析,若符合要求则对 Flash编程操作,编程结束后再接收下一包数据。这种U盘可以称为“类U盘”而不是真正的U盘,因其并不具有与U盘相同的存储功能。
2 软件设计
在线编程系统的软件部分主要包括Mass Storage类协议、FAT16文件系统、S19文件解析和Flash驱动模块的设计。Mass Storage类协议和FAT16文件系统用于实现U盘功能,是软件实现的重点。Flash驱动代码的编写可以参考JM128参考手册“Flash存储器”一节。
2.1 Mass Storage类协议的实现
Mass Storage类协议需要实现以下部分:一是在设备枚举阶段,提供Mass Storage-类协议描述符,这样主机就可识别该设备为海量存储型设备;二是在数据传输阶段,实现Bulk-Only(批量传输)协议;三是实现SCSI命令集。
2.1.1 Mass Storage类协议描述符
USB主机通过枚举过程获得的USB设备描述符来获得设备类型和其他信息,并根据这些信息建立通信。这些描述符包括:设备描述符、配置描述符、接口描述符和端点描述符。
JM128芯片USB模块作为设备控制器时共有16个双向端点(endpoint),每个端点的每个方向都使用双缓冲区来达到最大的传输吞吐量。本设计中使用了3个端点。其中端点0为双向控制端点,用于控制传输,枚举过程中USB主机仅与该端点进行交互,获得信息。端点1和端点2用于Bulk-Only传输:端点1为IN端点,用来传输数据至PC方;端点2为OUT端点,用来接收PC方发送过来的数据。这些在描述符中都有体现。
2.1.2 批量传输协议的实现
当设备被识别为Bulk-Only的海量存储设备后即进入批量传输方式。在此方式下,USB主机与设备间的所有数据均通过Bulk-In和Bulk-Out来进行传输,不再通过控制端点传输数据。
在Bulk-Only传输方式中,USB主机和设备之间传送3种数据,CBW(Command BLOCk Wrapper,命令块包)、CSW(Command Status Wrapper,命令状态包)和普通数据。CBW中的命令格式遵从SCSI传输命令集,USB设备需要分解CBW中包含的指令并执行相应命令,并向主机返回反映当前命令执行状态的CSW。USB设备方Bulk-Only传输流程如图1所示。
2.1.3 SCSI命令集的实现
SCSI有3种字长的命令:6字节、10字节和12字节。MicroSOFt Windows环境支持12字节的命令。SCSI命令集包含了对多种存储设备的操作命令,对U盘而言,并不是所有的SCSI命令都要进行应答和处理,实际用到的SCSI命令如表1所列。
2.2 FAT16文件系统的实现
当开发板插入USB总线并枚举成功后,USB主机会发送前面提到的SCSI命令。若这些命令的返回结果正确,主机接下来进入文件识别阶段;如果文件系统信息出错,则会导致USB总线复位,通信中止。
本设计中采用的是FAT16文件系统。FAT即“文件分配表”,是用来记录存储器中文件所在位置的表格,一旦文件分配表丢失,存储器中的数据就会因为无法定位而不能使用。FAT16文件系统的磁盘可以分为保留区、FAT区、根目录区和数据区。其中保留区的第1个扇区称为引导扇区,包含对文件系统进行识别的关键信息;FAT区用来存放文件分配表,由于FAT表非常重要,所以通常在FAT区之后有1个相同内容的备份;根目录区中存放目录项,每个目录项为32字节,记录1个文件或目录的信息;在根目录区之后的数据区便是真正意义上的存放文件数据或目录的位置,占据了存储器大部分数据空间。
本设计功能相对固定,无需实现与普通U盘同样复杂的文件系统,如文件存储、动态创建/删除等功能都可以省略,在实现功能的同时也节省了代码空间。笔者利用常量数组定义了引导扇区、FAT区和根目录区。
操作系统按簇来分配磁盘空间,FAT表是一一对应数据区簇号的列表,反映了所有簇的使用情况。FAT区结构如表2所列。在设计FAT区的数组时,笔者采取了简化措施,由于无需在Flash中存储目标S19文件和磁盘信息,所以仅仅设置了FAT表数组的表项O和表项1,其余表项做清零处理。
结 语
MCF51JM128是集成了USB主机、设备和OTG功能的新款MCU,适合数据采集、数据交换等多个领域,是一款集成度非常高的芯片。利用其集成 USB模块的特点实现的类U盘方式在线编程系统时,提高了在线编程系统的平台适应性,提高了易用性,降低了在线编程系统的开发成本。开发其他任何带有 USB模块的MCU的在线编程系统时,都可借鉴本方法。同时,也可将本方法扩展到各种基于USB的编程器中,如笔者拟开发的基于MCF51JM128的 Freescale 56F8xxx系列DSP编程器。