最近突发奇想,把USBasp和USB-Blaster整到一起去了,自我感觉良好
最近突发奇想,把 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) 顶顶顶! mark 支持,学习了,有空也搞一个玩玩.... 不错。。。。。。。。。。。 现在AVR、FPGA都是用并口,有空我也做个玩玩! mark,期待USB-Blaster程序 顶顶顶! 回复【楼主位】xiaobenyi
-----------------------------------------------------------------------
标记,有空自己做一个回来玩玩! Mark 嗯,不错,好东西 mark,好东西。 佩服楼主!不过有两个疑问:
1、您的USBASP支持S51和S52吗?
2、您的USBASP支持自动调速吗? 回复【12楼】minier
-----------------------------------------------------------------------
这个USBasp是按最新的USBasp固件改的,支持自动调速
在调试的时候抓USB数据包,因为开始不顺利,抓到的智峰软件发的Connect命令包,后面紧跟一个EnterProgramMode的命令包
一开始程序不对,所以总会失败,我发现失败的时候这两个命令会重发7次,每次Connect带的参数都在递减,说明Connect命令里面带了调速的命令,于是就把固件改了
switch(Setup.bRequest)
{
case USBASP_FUNC_CONNECT:
ispSetSCKOption(Setup.wValue.i);
AddrModeDW = 0;
ispConnect();
ispEnableClock(Setup.wIndex.i);
DataSize = 0;
EP0_Status = EP_TX;
break;
这个就是Connect命令的处理,楼主位里面有源代码的,Setup包的wValue就是速度信息,wIndex决定是否提供时钟
至于是否支持S51和S52,我没测过,不过支不支持是由上位机软件决定的,应该没有问题,改天测一下,呵呵 昨天又发现一个切换的问题,就是在插上目标板的时候,如果速度慢了,要求供电的AVR板子会被认为是不需要供电的板子
估计是4脚先接地了,而2脚还是悬空的,就被判断成这样了,速度快点就没问题
还得改,苦啊,就这么个问题,折腾死了 期待USB-Blaster程序 progisp 自动调速,输出解锁时钟,选择cpu类型的协议见下面的程序。这样,不用抓包了,呵呵!
if(data == USBASP_FUNC_CONNECT)
{
ispConnect(data,data); //data=speed,data=cpu type
if(data==1) //data= out clock
init_6M();
ledRedOn();
data = pgm_read_byte(0x1ffb); //read serial
data = pgm_read_byte(0x1ffc);
data = pgm_read_byte(0x1ffd);
data = pgm_read_byte(0x1ffe);
len = 4;
}
自行修改usbasp固件,就可以让progisp支持了。 回复【16楼】zhifeng
-----------------------------------------------------------------------
感谢!感谢!
有个 cpu type,看来支不支持S51还是个未知数
原来这里还读了序列号,我说怎么Setup.wLength=4,而德国固件只回复了一个空包.
目前还只测了MEGA48和2313,各种功能都试了一下,还不小心把我的MEGA48给锁死了,郁闷 mark 回复【6楼】liurangzhou
-----------------------------------------------------------------------
回复【15楼】liurangzhou
-----------------------------------------------------------------------
您已经期待了两次了,呵呵
不过由于某些XX原因,USB-Blaster的程序我暂时不想公开 终于决定放弃自动判断自供电和下载线供电的AVR板子
测试很久,终于发现AVR的低功耗不是吹的,一个50uA的上拉电流,就能把电源拉到2V
智峰的那个用软件开设定是否供电看起来是个不错的选择 学习了 学习了,楼主强 期待USB-Blaster程序 来Mark一下。顺带问一下,支持AS和PS模式吗?
页:
[1]