结论:Atmel并不是那么无聊
起因:Atmel的STK500v2的协议里有着一段对于高压编程的ControlStack的说明,半年多前,我在AVR 4in1上做高压并行编程时以为那些数据只是Atmel的开发人员无聊而发送的无意义的数据(后来我发现,是我错了)。直到2008年元旦,我开始做高压穿行编程(参考了部分AVR-Doper的代码),无意间,我发现了这些“无聊的”数据的重大的意义。研究了高压穿行编程的时序后,发现SII引脚上串出的数据其实就是高压并行编程时的控制口的信号,第一次以字节的方式看高压并行编程的控制信号,参考了AVRStudio中的AVRDragon帮助文档,了解了这个20芯的接口,对不同芯片操作时,接口的信号定义会有所不同,这让我突然想到了ControlStack,以前只是以单个信号的角度来看这些控制信号是发现不了ControlStack的意义的。
资料:
2.AVRDragon上的Mega2560控制HVPP接口的引脚定义(感谢Atmel赠送的AVRDragon,虽然已死):
BS2 PC0
RDY PC1
nOE PC2
nWR PC3
BS1 PC4
XA0 PC5
XA1 PC6
PAGEL PC7
分析:就拿我最常用的Mega48芯片来说:
0x0E,0x1E,0x0F,0x1F,0x2E,0x3E,0x2F,0x3F,0x4E,0x5E,0x4F,0x5F,0x6E,0x7E,0x6F,0x7F,0x66,0x76,0x67,0x77,0x6A,0x7A,0x6B,0x7B,0xBE,0xFD,0x00,0x01
0x0E对应的控制信号为:nWR,nOE,RDY,也就时说XA0,XA1和BS0,BS1都为0,对应高压编程的LoadAddressLowByte命令
0x1E为0x0E基础上,BS1为1,也就是LoadAddressHighByte命令
0x0F为LoadAddressExtLowByte
0x1F为LoadAddressExtHighByte
更具这个规律,整个数据分析如下:
0x0E,0x1E,0x0F,0x1F,0x2E,0x3E,0x2F,0x3F,0x4E,0x5E,0x4F,0x5F,0x6E,0x7E,0x6F,0x7F,0x66,0x76,0x67,0x77,0x6A,0x7A,0x6B,0x7B,0xBE,0xFD,0x00,0x01
LoadAddr(0) ,LoadData(4) ,LoadCommand(8) ,LoadNone(12) ,nWR(16) ,nOE(20) ,PAGEL(24), ,Pin Of RDY(27)
Low ,High ,ExtL ,ExtH,........