摘要
介绍一种简便实用的PIC
编程器实现方案。设计思想是:以单片机
作为主控机,欲写入的PIC
程序代码存放在主控机中,由主控机提供PIC
芯片编程所需信号,并监测整个编程流程。在时钟脉冲信号作用下,把代码写入PIC
的Flash
中以达到对芯片编程的目的。该方案可以在脱离PC
的环境下运行,适用于对批量的PIC
芯片进行编程。
关键词 PIClOF202
串行编程 89C51
随着工业生产的扩大,存在着对同一型号芯片进行相同代码编程的需要。目前采用的编程方式是通过专用的编程器来执行,其编程过程离不开PC
机。在对一定批量的芯片编程时,操作比较烦琐,保密性能差,且难以在工业现场进行。
本编程器设计简单,操作方便,保密性好,易携带,需要的外部设备少。编程器以PIClOF202
为例进行设计。PIClOF2xx
系列是Microchip
公司生产的低功耗,高性能Flash单片机
。其封装小,易于使用,成本低。性能稳定,在通用电子设计中被广泛使用。本设计的基本思想适用于其他类型的单片机
。
1 PICl0F2xx
的存储结构及编程方法
1
.1
存储空间映射
以PICl0F202
为例,其内部程序存储空间映射如下:
0000H
~0lFFH
是用户可以使用的代码存储空间,0200H
~03FFH
是系统的配置空间。其中01FFH
单元是复位向量,系统复位后程序指针PC
将指向此地址单元。0200H
~0203H
是用户ID
信息存储区间。0204H
地址单元存放的是备份的OSCCAL
值,被预留用来测试内部晶振,因此该值在任何情况下都不应该被更改。一旦被擦除,必须恢复该值,否则芯片不能正常工作。03FF
地址单元存放系统的配置字,其他地址单元系统保留。
1.2
芯片编程方法
采用串行在线编程的方式,串行时钟信号由主控单元的I
/O
口发出,从PIC
的时钟引脚ISCLK
输入。在串行时钟信号作用下,串行数据从数据引脚ISDAT
输入/输出,完成对芯片的Flash
的代码写入。
只有在进入编程模式后,PIClOF202
才能允许对其存储空间的操作,如图l
所示。当保持ISDAT(
串行数据输入端)
和ISCLK(
串行时钟输入端)
为低电平时,VCC(
芯片电源)
上升到高电平。经tl
延时,MCLR(
编程模式选择端)
上升到高电平,再经t2
延时,开始时钟脉冲和数据的输入/输出。此时PIClOF202
进入编程模式。
2
系统硬件
结构
系统逻辑框图如图2
所示,由主控机、控制模块、监控显示模块和目标芯片组成。主控机选用89C
51单片机
,用单片机
的2
个I
/O
口分别提供ISDAT
和ISCLK
信号;目标芯片即PIC
。PIC
的MCLR
端为编程模式选择端。为了让PIC10F202
能够进入编程状态,需要由控制模块实现对MCLR
端的电平控制。监控显示模块用于指示目前系统的工作状态和监控系统运行。
2
.1
控制模块的实现
为了实现控制模块对MCLR
端的电平控制,使用2
个晶体管T1
、T2
,如图3
所示。当单片机
I
/O
口为高电位时,T1
导通,其发射级为低电位,T2
导通,于是电源VPP
与PIC
的MCLR
端接通;当I
/O
口为低电位时,T1
截止,其发射级为高电位,T2
截止,VPP
和MCLR
端之间断开。
2.2
监控显示模块
采用一组发光二极管来显示系统状态和编程结果。系统的工作状态包括:目标芯片检测、就绪等待、编程进行中、代码校验等。系统在就绪等待状态下,就绪状态灯亮,主控机监控按键指令;接到指令后即进入编程状态,同时编程灯亮,编程后执行校验,校验完成后结束灯亮,说明完成整个缩程工作。整个编程过程中,若遇到故障,相应故障灯显示。
3
系统软件设计
3
.1
数据(
命令)
输入方法
无论是指令还是需要写入的代码数据,都在相应的时钟节拍下由串行数据端输入。串行时钟始终与串行数据的要求一致。对于不同的命令,时钟脉冲间的时间参数t1~t6
的要求是不同的。在相应时钟脉冲下降沿,PIC
对数据端采样,命令代码在前,一段时间延时后,输入代码数据。数据低位在前,高位在后,如图4
所示。时间参数的具体要求见参考文献。
下面以数据导入为例简要说明。
代码举例如下:
由命令字表中可知,若导人数据的命令字是xx0010B
,低位在前由ISDAT
输入,每次ISCLK
的下降沿对ISDAT
采样。以上代码实现了“0”
、“1”
的输入,其他命令的输入类似。数据输入和命令输入都是下降沿有效。每次导入1
字节的数据为12
位,但是必须在16
个时钟脉冲中完成。前6
个时钟脉冲的下降沿输入命令字,且前4
位有效。一段时间参数的延迟后,数据开始输入,第1
个时钟下降沿输入起始位,后第2
~13
个时钟的下降沿输入1
字节的数据,共12
位。第14
、15
个时钟下降沿输入数据无效,最后一个下降沿输入停止位(
起始位和停止位固定为O)
。
3
.2 PC
指针的处理及寻址方法
在对其编程的过程中,需要知道当前PIC
的PC
指针指向的Flash
存储区单元地址,也就是当前的操作单元。由于无法直接读取其PC
指针的值,故采用在89C
5l
的RAM
区定义一个变量用来记录PIC
的PC
指针(12
位,占用2
字节)
。该变量的值始终和PIC
的PC
指针一致,读取该值便可取得当前所操作的PIC
的Flash
存储单元地址。
变量的操作应该遵循如下运算规则:
①
只有“
加1”
这一种运算;
②03FF+1=0000(03FF
为PIC10F202
的存储器末地址)}
③
当变量的值不等于03FF
时,其“
加l”
运算与指针值“
加1”
同步;
④
初始情况下,指针的值指向03FF
。
PICl0F202
的Flash
单元地址为0000H
~03FFH
。在以上运算规则下,记录PC
指针的变量值也只能是0000H
~03FFH
,通过“
加1”
运算即可寻址到每一个Flash
存储单元。
3
.3
数据的读取
从Flash
存储单元中读取数据位的方法:先是6
个时钟下降沿输入6
位命令字,在接收到这个命令字后,PIC
将当前PC
指针所对应ROM
存储单元的值按位由ISDAT
输出。在第6
个下降沿结束后,经延时,在时钟脉冲每个上升沿对ISDAT
采样,一共16
个上升沿,输出16
位的数据。第2
~13
位是12
位的数据;14
、15
位无效;首位和末位分别是起始位和结束位,如图5
所示。
读取数据时有两点值得注意:
①
命令字的输入和其他操作相同,但数据输出时是上升沿有效;
②
由于01FFH
和0204H
是系统预定值单元,当寻址到这两个单元时,执行读取指令后必须保留其内容,以便编程时恢复。
3
.4
写入Flash
方法
数据写入Flash
的过程如下:
每次导入一个字节的数据(12
位)
,输入开始写入的指令码,经过一段时间参数的延时,再输人结束写入指令码,就完成一个字节的写入过程。但需要注意的是,无论是数据读取还是写入,都是对当前PC
指针所指向的F1ash
单元进行的;而且数据写入只有在当前存储单元已经被擦除的情况下才可以正确地实现。
指令输入形式(
如芯片擦除、开始写入、结束写入和地址加1
等)
可以查得其命令宇,其输入方法与图4
和图5
类似,每个指令都需要时钟脉冲的6
个下降沿输入。仅有“
导入数据”
和“
读取数据”2
条命令需要后跟数据字节,其他的指令在输入完成后,经延时,便可以进行下一条指令的输入。字节写入流程如图6
所示。
3
.5
配置字编程及代码保护的处理
配置字是关于PIC
的设置,包括是否使能看门狗,是否采用I
/O
弱上拉,以及MCLR
引脚的配置等。配置字在03FFH
单元,PIC
进入编程模式时,配置字单元就是Pc
指针所指向的单元。配置字的写入方法与一般的代码写入方法一致。一旦设置了代码保护,用户代码空间的0040H
以上的字节读出为“0”
,其他的配置空间依旧可以正确读出,包括配置字单元和用户ID
区。配置字可以被多次写入,但是在任何情况下擦除配置字单元,用户储存区的代码也同时被擦除。可以通过图7
的方法解除代码保护,但是这样的处理会将整个Flastl
存储空间全部清除,所以在代码保护使能的情况下,是不可能正确读取代码值的。即使可以重写配置字,但是重写过程中代码已经被清除。
3
.6
预定值的处理
每个PIC
芯片都没有厂家设定的预定值。这些值是不应该被更改的,否则PIC
芯片就无法正常工作。ROM
区的01FFH
单元保存复位向量,系统复位后,PC
指针将指向该单元。0204H
单元保存着OSSCAL
的值。这两个单元的值应该先读出并且保存在一个临时单元(
因为在芯片擦除的过程中会丢失)
,待到需要编程的代码执行完毕,再从临时单元读出并写入相应的位置。其实际过程就是一个“
读取保存恢复”
的过程。
要读取预定值,首先必须寻址到预定值所在的单元。其寻址的过程如图8
所示:进入编程模式后,此时指向的存储单元是03FFH
,89C
51
中记录PC
指针的变量的值也应该设置成03FF
。按照该变量的运算规则,执行地址加1
指令,变量值也加1
,并查询当前变量的值,直到所需的存储单元为止。恢复的过程是先寻址到01FF
和0204
单元,然后把保留的值写入,具体流程与图8
类似。
3
.7
软件流程
系统在初始化中,如果检测到目标芯片已经安装就绪,监控显示模块便会显示系统处于就绪状态,然后监控按键。一旦按键按下。编程开始,如图9
所示。先读取系统预定值并保存在主控机的RAM
中,然后PIC
芯片擦除,包括用户使用的代码区和PIC
系统配置区。擦除完成后,将PC
指向首地址0000H
,开始代码写入,每次写入l
个字节的代码,写完后校验。所有代码写完后,恢复已保存的预定值,恢复的过程与代码写入一致。
寻址到配置字单元后进行配置字写入,在先前的擦除工作中,配置字单元已经擦除。写入的过程也与代码写入一致。
整个编程过程中,监控显示模块会显示目前的系统状态。写入过程中(
包括代码、预定值和配置字等)
出现的任何错误,编程会报错停止,并回到就绪等待状态,等待下次编程的开始。
若无任何错误的状况发生,系统显示编程成功,整个芯片编程过程结束。
4
小结
本系统操作简单,性能稳定,编程速度快,无需PC
机的支持。所有的代码均保存在主控机的ROM
区中。在主控机ROM
写保护的情况下,代码不可能被读出,具有很强的保密性。需要的外部设备少,易于携带,而且成本低。本方法对于工业现场的批量芯片编程有一定借鉴意义。
|