#1楼主:[作品]:MEGA8做的USB下载线,欢迎拍砖
文章发表于:2008-09-14 11:08
第二页16楼中发布了地址修正的固件(上位机软件PROGISP),带源码,数据指示LED在读写FLASH过程中闪烁。
早就想改改USBASP的固件,没想到一改就改了一周。
先是将原USBASP的固件读懂,移植到了圈圈的USB学习板上(见http://blog.ednchina.com/billowtust/159574/message.aspx),但是因为51的IO口驱动能力不好,所以在编S5x芯片的时候,如果复位线上有复位电路,十有八九是要出错的。个人认为是当P1.4(RST)脚输出高电平的时候,被5x单片机上电复位电路上的约10K电阻分压,导致目标芯片的RST脚电压仍为低,无法进入编程模式,所以我试过编S5x成功的时候都是没加复位电路的。而MEGA单片机因为是低电平复位,就没有这个问题了,100uF加10K组成的复位电路,也能正确进入编程模式。
然后,因为原先的USBASP固件是不支持大FLASH编程的,比如MEGA128的128K FLASH在原固件下只能写入前64K,如果你的程序大于64K,那么超过64K的部分会在0地址重新开始写,结果就是:0地址校验错误。于是,于是……,眼光停留在了桌子上的USBISP上,这个编程器是找别人借来的,SL的产品,肯定是能写入整128K的,于是…… SL 的USBISP也是用MEGA模拟的USB通信,USBASP也是,为什么不能让USBASP兼容SLISP软件呢?于是开工,经过两天时间,解决了命令字的问题,终于让SLISP软件识别出USBISP硬件来(实际上是USBASP编程板),然后写了一些代码来屏蔽两个编程器硬件上的差别……,最后的结果是,SLISP软件被骗了,大家请看:
(以下图片点击查看大图)

光这样还不够,接着来:





这次编程是对MEGA128进行操作的,写入的文件长度是131072字节,也就是MEGA128满片都被写入了。结论:我解决了USBASP编程器原固件只能写入前64K的问题。
做完这件事,突发奇想,智峰的软件一直不错,按理说是会不笨到不更新高位地址的,于是再回去用BUS HOUND看写MEGA128时候的数据,而且是满片写入的数据(因为是原固件,所以编程结果是失败了的),看了N长的数据,终于让我找到一点线索:厂商自定义请求的0x09号请求代码。以前就见过这个09号请求,但是没发现有什么特别,刚开始以为是PROGISP软件用来定义编程速度的,结果后来被自己否决了。而在写入MEGA128的时候,突然发现这个09号请求后面带的数据是和06号请求(FLASH写入)后面带的地址数据是一样的,而且在超过64K后,09号请求的地址是给出了高位的,而06号写FLASH请求却没有。
这是低于64K时候的数据:
c0 09 00 f7 00 00 04 00 VENDOR
40 06 00 f7 00 10 00 01 VENDOR
而当高于64K后,数据变成了这样:
c0 09 00 02 01 00 04 00 VENDOR
40 06 00 02 00 10 00 01 VENDOR
看到了没,09请求的地址变成了 01 02 00,而06请求的地址是02 00,这就是为什么以前没办法写全片128K FLASH的原因了。只要稍微修改一下固件,就能支持全片128K FLASH的读写了。于是原固件的这个问题也被我修正了。大家要是感兴趣,可以自己试着修改一下代码。
接下来SHOW一下我的USBASP电路:







那个蜂鸣器是能提示编程操作正确与否的,正确长鸣一声,否则4声短鸣。三个LED感觉有些多了,其实两个就够的,绿的那个是编程连接指示,进入编程时亮直,结束时灭。中间那个红的是读写指示,当进行FLASH或EEPROM读写操作时会闪烁,读写越快,闪的越快。最下面的那个是电源指示灯了。
因为以前直接给板子上5V电源时,很多笔记本电脑都不识别,所以这次加了个LDO,给板子上的3.3V电源,所以MEGA8是跑在3.3V电压下的,而目标板通常是5V,于是加了片244作为隔离。板子做好后在以前不能识别USBASP的电脑上都试了一遍,结果是那些电脑都认USBASP了,哈哈。编程器也能向目标板供电,并且是3.3V和5V可选,供电线上还加了1N5819,防止目标板自供电时向USB口回灌电流。
好了,就写这么多吧,大伙有什么意见,欢迎拍砖,呵呵。