介绍一种简便实用的PIC编程器实现方案。设计思想是:以单片机作为主控机,欲写入的PIC程序代码存放在主控机中,由主控机提供PIC芯片编程所需信号,并监测整个编程流程。在时钟脉冲信号作用下,把代码写入PIC的Flash中以达到对芯片编程的目的。该方案可以在脱离PC的环境下运行,适用于对批量的PIC芯片进行编程。
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所示,由主控机、控制模块、监控显示模块和目标芯片组成。主控机选用89C51单片机,用单片机的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所示。时间参数的具体要求见参考文献。
下面以数据导入为例简要说明。
代码举例如下:
file:///Z|/%CD%F8%D2%B3%D7%CA%C1%CF/%D2%BB%D6%D6%CA%B5%D3%C3%B5%C4PIC%B1%E0%B3%CC%CF%F9%B5%C4%C9%E8%BC%C6%B7%BD%B7%A8%20-%2021IC%D6%D0%B9%FA%B5%E7%D7%D3%CD%F8.files/6d.jpg
由命令字表中可知,若导人数据的命令字是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指针的值,故采用在89C5l的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,89C51中记录PC指针的变量的值也应该设置成03FF。按照该变量的运算规则,执行地址加1指令,变量值也加1,并查询当前变量的值,直到所需的存储单元为止。恢复的过程是先寻址到01FF和0204单元,然后把保留的值写入,具体流程与图8类似。
3.7 软件流程
系统在初始化中,如果检测到目标芯片已经安装就绪,监控显示模块便会显示系统处于就绪状态,然后监控按键。一旦按键按下。编程开始,如图9所示。先读取系统预定值并保存在主控机的RAM中,然后PIC芯片擦除,包括用户使用的代码区和PIC系统配置区。擦除完成后,将PC指向首地址0000H,开始代码写入,每次写入l个字节的代码,写完后校验。所有代码写完后,恢复已保存的预定值,恢复的过程与代码写入一致。
寻址到配置字单元后进行配置字写入,在先前的擦除工作中,配置字单元已经擦除。写入的过程也与代码写入一致。
整个编程过程中,监控显示模块会显示目前的系统状态。写入过程中(包括代码、预定值和配置字等)出现的任何错误,编程会报错停止,并回到就绪等待状态,等待下次编程的开始。
若无任何错误的状况发生,系统显示编程成功,整个芯片编程过程结束。
4 小结
本系统操作简单,性能稳定,编程速度快,无需PC机的支持。所有的代码均保存在主控机的ROM区中。在主控机ROM写保护的情况下,代码不可能被读出,具有很强的保密性。需要的外部设备少,易于携带,而且成本低。本方法对于工业现场的批量芯片编程有一定借鉴意义。
| |
|