陈志英
(厦门理工学院电子与电气工程系,福建厦门 361024)
51单片机的Flash存储器程序烧写主要有两种模式:并行Flash编程和串行Flash编程。其中串Flash编程模式支持ISP编程(系统在线编程),这种模式在烧写单片机应用程序时不需要把芯片从工作环境中剥离,解决了在开发产品时因频繁插拔芯片导致其引脚折断从而损坏芯片的问题,同时也给系统软件升级提供了便利。目前,市面上大部分51单片机ISP编程主要采用PC机并口或RS232串口进行程序下载,而基于USB接口的ISP编程较少,这对于只有USB接口的PC机来说非常不方便。基于这个原因,本文给出了一种基于USB接口的51单片机在线编程设计方案,主要针对ATMEL公司生产的51单片机AT89S51/52/53芯片进行系统在线编程,无需外接电源,采用从PC机USB接口取电,方便用户使用,写入速度快及稳定性好[1,2]。该设计包括USB-SPI硬件接口转换电路和PC端上位机编程软件两部份。系统原理框图如图1所示。
USB-SPI接口转换电路采用南京沁恒公司USB转换芯片CH341实现。PC端上位机编程软件采用VB编写,利用API函数调用CH341运行的动态链接库文件实现PC机与CH341之间的USB接口数据传送,CH341再将从USB接口接收到的数据通过SPI同步串行接口传送到目标单片机AT89S51。由此,可完成单片机Flash在线编程。
转换芯片CH341A是一个全速USB设备接口,可转换成并行口、异步串行口、或2线、4线同步串行接口。它的部分引脚具有多个功能,具体功能由复位后的功能配置决定[3]。本设计将CH341配置成4线同步串行接口,电路原理如图2所示。该电路不仅可实现将USB接口转换成SPI同步串行接口,且具有USB通信标志信号、向外电路供电和过电流保护等功能。
图2 CH341 USB转SPI接口电路
CH341芯片部分引脚具有多个功能,所以在芯片复位期间与复位完成后正常工作状态下具有不同的特性。用户可通过CH341芯片SCL和SDA引脚配置芯片功能,有两种方式:外部芯片配置和直接组合配置。外部芯片配置是由SCL引脚和SDA引脚组成两线同步串口,连接外部串行EEPROM配置芯片,通过EEPROM芯片定义芯片功能、厂商ID和产品ID等。直接组合配置是将SCL引脚和SDA引脚进行连接组合,配置CH341的功能,其特点是:无需增加额外成本,但是只能使用默认的厂商ID和产品ID等信息。CH341功能配置如表1所示。在直接组合配置方式下,除了产品ID之外,其它信息与外部芯片配置的默认值相同。本设计中CH341的功能是将USB接口转换成SPI接口,因此将SDA引脚接低电平,SCL悬空,使CH341芯片配置成4线同步串口。4线串口引脚为:DIN(22脚)是4线串口数据输入,接单片机MISO(P1.6);DOUT(20脚)是4线串口数据输出,接单片机MOSI(P1.5);SCK(18脚)是4线串口时钟输出,时钟频率约为1.6MHz,接单片机SCK(P1.7);CS2~CS0是4线串口片选输出,低电平片选有效,本设计选择CS1(16脚)为片选引脚,接单片机RST(Pin9)。其中SCK引脚默认为低电平,DOUT引脚在时钟上升沿将数据从CH341输出到51单片机,DIN引脚在时钟下降沿将数据从51单片机输入到CH341。
表1 SDA和SCL的功能配置表
CH341芯片ACT#引脚为输出引脚,用于USB设备配置完成状态输出。当USB设备尚未配置或者取消配置后,该引脚输出高电平,当USB设备配置完成后,该引脚输出低电平。因此在ACT#引脚外串联了发光二级管LED1,用于指示USB设备配置完成状态。当CH341设备配置成功后,发光二极管LED1亮,否则发光二极管LED1灭。
CH341芯片UD+和UD-是USB信号引脚,芯片内置了USB上拉电阻,将UD+和UD-引脚直接连接到USB总线上。PC机发送的数据通过UD+和UD-引脚传送到CH341中。
图2中的R1是保护电阻从USB接口取出的电路总电流不得超过250mA,否则电阻R1将烧坏,电路断开[4]。因此当发生电路短路或所接外电路总电流过大时可保护CH341芯片及外电路中一些较昂贵的芯片。
CH341芯片XI和XO引脚之间接12MHz晶振和2个20pF电容可为CH341提供正常工作所需的时钟信号。
51单片机Flash闪速存储器可通过SPI同步串行接口进行在线编程,SPI串行接口包含时钟引脚SCK(Pin1.7)、串行数据输入引脚 MOSI(P1.5)和串行数据输出引脚MISO(P1.6)。将单片机复位引脚RST(Pin9)拉高后,在其它操作前必须发出编程使能指令,并在编程前擦除芯片。编程时单片机的电源电路与时钟电路需正常工作,且编程串行时钟SCK不得超过单片机片外晶振时钟的1/16。具体的串行编程采用如下进程[5]。
(1)上电次序:将电源加在Vcc和GND引脚,RST置为“H”,等候10ms;
(2)将编程使能指令发送到MOSI(Pin1.5),编程时钟接至SCK(Pin1.7),此频率需小于晶体时钟频率的1/16;
(3)代码阵列的编程可选字节模式或页模式。写周期是自身定时的,一般不大于0.5ms(5V电压时);
(4)任意代码单元均可通过MISO(Pin1.6)和读指令选择相应的地址回读数据进行校验;
(5)编程结束应将RST置为“L”以结束操作;
(6)断电次序:假如没有使用晶体,将XATL置为低,RST置为低,关断电源Vcc。
串行编程指令设置为一个4字节协议,具体格式请参见文献[3],对AT89S51/52单片机串行编程共有9条命令,分别用来实现编程允许、芯片擦除、读/写数据(字节或页模式两种)、读加密位以及读签名字节内容等功能。CH341通过 DIN、DOUT、SCK模拟SPI接口信号,完成对AT89S51/52单片机串行编程和校验。AT89S51/52编程和校验时序如图3所示。对AT89S51/52编程或校验时,字节数据总是高位在前,低位在后。写数据(编程)时,在SCK为低电平期间,将数据送到MOSI(P1.5),而读数据(校验)是在SCK为高电平时将数据输出到MISO(P1.6)。
图3 AT89S51单片机串行编程与校验时序图
PC端上位机软件设计采用VB(Visual Basic)语言编写,实现对AT89S51/52芯片程序擦除、下载和回读等功能。
上位机软件主要包括以下内容:打开文件、全片擦除、下载代码、读入代码、自动完成、读单ID和文件更新后自动下载等。
VB可以调用 CH341动态链接库中的函数CH341OpenDevice()打开CH341设备,若打开成功则可对CH341设备进行如下的一系列操作:调用CH341SetStream()设置CH341同步串口流模式,使CH341数据流模式为SPI数据流,并且为高位在前的传输模式,与AT89S51/52的ISP编程规则一致;调用CH341StreamSPI4()函数处理SPI数据流,烧写AT89S51/52时通过编程指令将PC机中的代码从USB接口发送到CH341,CH341再通过MOSI引脚发送到AT89S51/52,读取代码时通过读指令将AT89S51/52闪存中的代码从MISO引脚回送到CH341,CH341再通过USB接口将代码传回PC机;调用CH341CloseDevice()关闭CH341设备,此后不能操作CH341。因此要操作CH341设备,必须先调用CH341OpenDevice函数打开CH341设备;调用CH341SetDeviceNotify()检测CH341设备是否与PC机相连。
图4是AT89S51/52代码下载的程序流程图。
图4 下载代码流程图
[1] 梁睿,等.ISP技术在AT89SX单片机中的应用[D].徐州:中国矿业大学电学院,2004
[2] 杨恒新,等.ISP技术在单片机程序升级中的应用[D].南京:南京邮电大学光电工程学院,2006
[3] 南京沁恒电子有限公司.CH341[Z],2008
[4] 廖济林.USB2.0应用系统开发实例精讲[M].北京:电子工业出版社,2006
[5] 欧阳文.ATMEL89系列单片机的原理与开发实践[M].北京:中国电力出版社,2007
[6] Atmel Corporation.AT89S51[Z],2001