|
最近突发奇想,把 USBasp 和 USB-Blaster 整到一起去了, 先上图
![](http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607789BIGI65.jpg)
(原文件名:DSC00177.jpg)
![](http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607790MCB1ZK.jpg)
(原文件名:DSC00178.jpg)
![](http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607791TPMPEQ.jpg)
(原文件名:DSC00172.jpg)
当然第一步就是代码移植,目前还没有非AVR平台的USBasp,也没有AVR平台的USB-Blaster.
想来想去,还是把USBasp的代码移植到别的平台比较合适,毕竟USB-Blaster速度比较快,变成了低速设备,不太好.
因为之前已经把USB-Blaster移植到了C8051F的平台下,所以这次就决定把USBasp也移植到C8051F的平台下.
移植的过程不算很顺利,非常佩服德国人的代码,用AVR单片机模拟USB接口,而且把代码写成了万能模板.足足花了我一周的时间,才终于移植成功.
调试的时候才发现了几个智峰软件跟德国原版的差别(当然还有别的我不知道的差别),一个是在Connect的时候,智峰软件指定了SCK的速度,而不是把连接命令和设定速度分开,另一个是增加了提供时钟的功能,这点是在连接还是在使能编程模式的命令里面加的我就不记得了,都是用USBlyzer抓出来的数据.
移植后的源代码ourdev_607812EGCDTQ.rar(文件大小:101K) (原文件名:Firmware-USB-ASP.rar)
![](http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607813LYPQT1.gif)
硬件平台电路图(原USB-Blaster的图) (原文件名:无标题.gif)
这个电路是以前把USB-Blaster移植过去的时候画的,2脚是接地的,所以直接上USBasp还不行,于是就有了开始那几张惨不忍睹的飞线图.
接下来是固件整合在一起,并且要切换,这点确实很头疼.
切换的方法,是一件很头疼的事情,我肯定不会用跳线来跳,也不会用拨码开关,这些都显得太山寨了,呵呵
用上位机软件来切换又比较麻烦(实际情况是我还不会,呵呵),最好就是自动切换了,插上什么板子,就切换到什么模式
可是说起来容易,做起来还真不容易,USBasp的2脚要给目标板供电,而USB-Blaster的2脚是接地的,所以2脚该不该供电就成了一个问题.
还有就是如何识别目标板子是CPLD还是AVR,接口差别可以说只在2脚和4脚上,可以通过这两个脚的状态来识别,可是这又牵涉到目标板有没有上电的问题,如果没上电的话,就体现不出差别来.
这期间折腾了很久,曲折的过程就不说了,最后决定,如果目标板没上电(表现为2脚和4脚都为低电平),那就给2脚加一下电(不过要限流,否则USB过流就挂了),如果加电之后2脚电平就上去了,那就是AVR,反之就是CPLD.
原以为这样就OK了,调试时才发现,远不止这么简单,还有带电拔掉板子,不带电拔掉板子,然后再插上带电或者不带电的新板子,还有原先不带电的板子,插上后再上电的,还有不需要下载线供电的AVR板子......好多次想放弃这样的想法,直接用拨码开关得了
最后冷静下来,把能想到的情况都列出来,竟然有16种之多,整理归类之后,也就理清了.
最后再加上插拔电缆的时候的防抖动,结果就是以下的代码.
void DetectConfigue()
{
bit PowerUB=PIN4,PowerUA=PIN2;
BYTE Retry=10;
while(Retry--)
{
Delay_Main();
if((PowerUB!=PIN4)||(PowerUA!=PIN2)) return;
}
if(!(PowerUB|PowerUA)) // Target not powered
{
if(Configue!=USB_BLASTER)
{
POWER_TAR = PON;
Delay_Main();
if(!PIN2) // Power Failed
{
POWER_TAR = POFF;
SelectConfig(USB_BLASTER);
}
else
{
if(Configue==USB_ASP) return;
SelectConfig(USB_ASP);
}
}
else
POWER_TAR = POFF;
}
else if(!PowerUB) // USB_asp
{
if(Configue==USB_ASP) return;
SelectConfig(USB_ASP);
}
else if(!PowerUA) // USB_Blaster
{
POWER_TAR = POFF;
if(Configue==USB_BLASTER) return;
SelectConfig(USB_BLASTER);
}
else // Not Connect
{
POWER_TAR = POFF;
if((Configue!=USB_BLASTER)&&(Configue!=USB_ASP))
SelectConfig(USB_BLASTER);
}
}
目前测到算是稳定了,唯一的缺陷在于,之前不需要下载器供电的AVR板子如果想下载线给他供电,就得拔掉重插.这种情况应该是少之又少.
下面是工作台的乱象.
![](http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607820JA1LPQ.jpg)
(原文件名:DSC00180.jpg) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|