2007
09-16

PIC之ICSP

呵呵,PIC讲堂再度开张。嗯。保持每周一篇,也很不错么。

今次要说的是ICSP。ICSP,全称In-Circuit Serial Programming,在线串行编程。这行英文和ICSP这四个字母,一般使用时都带有TM标记的,也就是说,这是MICROCHIP的商标。也是MC独有的吧。呵呵。

从名字可以看出来,ICSP是一种编程方法,也就是说是一种烧写手段。这种手段可以在线烧写——即不需要将芯片取下就可以在板子上烧写。而这种烧写方法使用串行的数据。在线烧写其实也不是什么新闻了,大家熟悉的TI的DSP,一向可以使用JTAG口进行烧写,那就是标准的在线烧写。

MC的ICSP,使用起来极为方便,应用ICSP进行烧写,只需要使用芯片上的5个脚就可以,其中包括VDD VSS,这两个电源一定要供上。然后就是VPP编程电压,这个是肯定的,对FLASH进行烧写,当然需要高一点的电压。随后就是输入的数据和时钟两个脚。一般是PORTB口的RB6和RB7——当然,那些不分PORT只有GPIO的芯片请参看DATASHEET找到相应的ICSP口——那么也就是说,其实,真正的和烧写数据有关的就两个脚。标准的串行的风格呢,呵呵。

其原理,MICROCHIP官方没有说的太多,只是对每一种芯片都给了一个Programming Specification。上面详细给出了通过ICSP方式连接芯片时,对芯片内存储空间操作的各指令的具体形式。从那些文档中推断,我们可以简单的认为在PIC芯片中,烧写模式下,FLASHROM和外部接口之间有一个“处理接口”,该接口从外部通过串行方式接收命令,移位译码后进行外部设备需要的操作,随后如需要结果的话就把结果同样串行输出。当然实际上这个所谓的接口可能只是一块电路。但是可以肯定的是,FLASH并不是暴露在外直接和外界连接的,而是先要连到ICSP模块,然后才能连上外界。

这就有个好处,就是加密安全性的问题。因为FLASHROM并不是直接和外界相连,所以外界如果要读取FLASHROM内部的内容,正常情况下就必须通过ICSP模块。而ICSP模块如果检测到加密位有设置的话,那就拒绝执行外部的相应的读取命令,返回全0值。但是其实,数据在芯片内部并没有被加密,所以正常的程序访问不会受到干扰。

呵呵,不过其实,我想现在的芯片应该都是这个原理来加密的吧。要不然让软件自己实现软解密再执行也忒有点难度了。。那么这个原理加密的芯片就有几点不好,第一就是数据在FLASHROM里面是未加密的。也就是说,数据的安全性完全取决于ICSP模块的安全性。如果ICSP模块设计有任何的考虑不周,那么程序基本就等于没加密。。事实上MICROCHIP的某些老产品的ICSP模块设计就有问题。我手里一块解密的16F73芯片,据说只是使用了一些很简单的手法就绕过了ICSP加密。。。另外,还是因为数据没有加密,所以,物理解密仍然是不可防御的。只要别人能够到达你的FLASHROM区域,那么你的程序就宣告破解了。这一点是没有办法的。目前所有的单片机都会有这样的问题。但是貌似TI的DSP在这一块做的非常好。据前辈透露:TI的DSP内核是两层,上层是应用及处理层,下层才是FLASHROM层。这样即使物理法拿出了内核,也会因为内核是两层,无法较好的去除上一层而露出下一层的FLASHROM。从而大大加强了芯片的安全性。。。当然,同时也大大加强了成本。。

另外要补充一点的是:ICSP这种方式,外部实现是极为简单的,只要能提供完全符合Programming Specification的信号就行。所以网上可以看见很多种骨灰级玩家自制的烧写器。使用起来和原厂的PICSTART+之类没什么区别——事实上,也有自制PICSTART+的。。——并且,在有新芯片出来时,烧写器可以很方便的升级,只要重写一下烧写器内部芯片的代码,加入新芯片的烧写命令代码就行了。而烧写器的内部芯片。。一般也是PIC。。。可以ICSP升级。。嗯。。用ICSP升级PIC以支持新的PIC的ICSP。。是不是很像绕口令?呵呵。。

那么,ICSP这个东西具体应该怎么使用呢?呵呵,这个问题问的好。首先我们要解释一点就是:除了一些很老的产品如16C5X系列之外,基本所有的MICROCHIP芯片均采用ICSP技术。而且,只要采用了ICSP技术,那么烧写时肯定使用ICSP烧写。也就是说:在烧芯片时,虽然看起来是把芯片的28pin或者40pin全部放在烧写器的芯片座上的,但是实际上,起作用的也就那5个脚。。。很惊讶吧,呵呵。有时候有的东西就是这么神奇。去看看自制烧写器的原理图就明白了~

那么,真正用在板子上的话,就是把我们要用到的5个脚引出来,就可以使用ICSP了。但是,当然也有需要注意的地方:首先,VPP脚,就是芯片的MCLR脚,一般是1脚,在编程时会有大约13V的电压。鉴于一般设计时,会将该脚连接一5V电源电路,所以就需要注意确保,烧写的13V电压不会倒灌回5V电源电路造成损坏。而且,根据Programming Specification,烧写时VDD和VPP加电压的时序是需要保证的,所以在VPP上不要有太大的电容负载,避免造成电压上升时间过慢从而影响到烧写。另一方面,烧写器会供给芯片5V的电源,所以一般不需要自己外供电。但是一般的编程器供电能力有限,据称也就是几个mA的级别。就算PROMATE II这类自带专门ICSP口的工业级烧写器,其输出电流也不过几十个mA而已。所以,如果你的板子工作电流较大,那就需要自己供电,或者将芯片的供电电路设计成可隔离的,烧写时断开芯片的VDD和外部电源的连接,烧写器的供电仅供给芯片即可。然后,作为ICSP数据的通路,RB6和RB7在烧写时,最好也和外部电路隔离开,就是要保证其上传输的时钟和数据不被外部电路干扰而造成失真。而且,还有一点就是,使用时要保证,你的ICSP连接线和芯片是直接连接的,其间尤其不能有二极管等单向通路元件,否则会造成芯片认不出等异常现象。

另一方面,烧写器的连接的话,专业级的烧写器会提供ICSP接口,应该就是一个5芯的排线,可以接出插到目标板上。如果没有这种昂贵的专业烧写器,只有简单的烧写器的话,可以考虑自制一个转换线,就是一端为28或者40的双排针接头(比如一个28pin或者40pin的芯片座就是一个很好的选择),然后将这些针中对应的脚接出来,做成一个5芯排线使用。这类转接线尤其需要注意的是:第一,使用时插在烧写器上的双排针接头不要插反。。插反的话,肯定没有效果。。。第二就是,由于负载能力有限,建议线长不要超过20cm。

关于ICSP线的自制,我过段时间可能要做几个试验,因为公司的烧写器是PICSTART,而准备使用贴片的PIC,所以ICSP是必要的。所以转换线是必要的。。。如果成功实现我尽量把制作方法和注意事项写出来。呵呵

其实,ICSP给人的感觉好像就是一个集成的BOOTLOADER一样。只是ICSP在正常使用时并不需要,而不像BOOTLOADER那样正常使用时还需要把外部代码载入内存。。。而且ICSP对加密还是有一点好处的。不过感觉好像还是有点脆弱。。呵呵。。但是越新的芯片,其ICSP模块应该越安全。各位选型时也不妨注意一下。

最后顺便说一句,如果真的觉得ICSP很脆弱,可能非物理就能破解的话,那么我们可以使用一个狠招:ICSP的灵魂在于RB6和RB7,那么程序设计时,在程序中不要使用这两个脚。然后烧写完成后,对这两脚使用加大电流等方法直接使内部电路报废,就是把这两个脚直接烧掉。那么,恭喜你,你的芯片的FLASHROM使用软件法应该再也不能访问了,包括你自己再想烧也烧不了了。这个芯片目前就是一块外界不可访问,只能自己工作的芯片了~呵呵……

嗯。今次就到这里吧。其实这些资料很多都是在论坛里看见的别人的经验,我这里只是总结了一下而已。感谢那些大虾~呵呵~~

最后编辑:
作者:龙天
这个作者貌似有点懒,什么都没有留下。

PIC之ICSP》有 3 条评论

  1. 龙天说道:

    呵呵,可不是纸上谈兵哦。我们现在有产品使用这种烧写模式。请多指教。呵呵。具体实现可参看 PIC之ICSP二 以及 用PICSTART进行ICSP

  2. 匿名说道:

    看了半天,原理是纸上谈兵

  3. wjw说道:

    写得不错,收了

匿名的回复 取消回复

你的email不会被公开。