历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2020年03月23日 | 自制avr下载线

2020-03-23 来源:eefocus

为了搞懂usb协议原理,我看了很多天的书,感觉很多东西不太确定。然后发现一个好东西,就是usbisp(usbasp),开源的avr下载线,看代码可以把usb原理彻底搞懂,甚至连底层的信号传输都是用软件实现的。并且这个东西功能很简单。但是没有说明书,读代码很累,读了很多很多天,90%多的东西都搞懂了。于是就可以改一些源代码,做做试验什么的。


首先atmega48的源代码不变,刷进去,没有成功。并且单片机发热。找各种原因,每个引脚的接线都看了一遍,没发现问题,陷入困惑中。usb接头用的是一个坏的usb延长线,因为万用表的表笔插入usb接口比较费劲,我只是草率的测过一遍,线的颜色红白绿黑顺序是对的。现在找不到头绪,于是我就又找了一根坏的usb延长线,我把这根线的母头剪下来,然后插到那根待测试的usb接头,我又四根线全部用万用表量了一下,依然没有发现问题,这根母头的线每个颜色都能对上那根待测试的线的颜色。……发愁,找不到原因。然后我想了一下,虽然线的颜色顺序对,但也有可能顺序是整个相反的。于是测了一下,又喜又气。所有正规的usb线都是红色接正,黑色接负,但是我找的这两根线都是顺序相反的……。这两根线是截然不同的,一根很结实的样子,还有磁环,另一根虽然没有磁环,但是线也很粗,做工都不是很差,就是有些坑爹。正负极相反,单片机发热,猜是烧了,然后证实了,为了找毛病用了两个atmega48,全部阵亡。


后来想改一下源代码,让下载线变成hid设备。源代码只改3处,usbconfig.h里边class改成3,USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH   改成 43       。  usbdrv.c里边再设备描述符前加入


PROGMEM char usbDescriptorHidReport[] = {

0x06, 0x00, 0xFF, // USAGE_PAGE (Generic Desktop) 

0x09, 0x01, // USAGE (Vendor Usage 1)

0xA1, 0x01, // COLLECTION (Application)

0x15, 0x00, // LOGICAL_MINIMUM (0)

0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255)

0x75, 0x08, // REPORT_SIZE (8 bits) 

// 14 bytes Feature report#1 ( 8 bytes sent to/from host) 

0x85, 0x01, // Global Report ID (cannot be 0) Command Report 8 bytes + ID 

0x95, 0x08, // Global Report Count 8 (number of Report Size fields) 

0x09, 0x00, // Usage Undefined 

0x15, 0x00, // Local Usage Minimum (each Report Count must be associated with a Usage) 

0x26, 0xFF, 0x00, // Local Usage Maximum 

0xB2, 0x02, 0x01, // Main Feature (Data,Var,Abs,Buf) 

// 28 bytes Feature report#2 ( 16 bytes sent to/from host) 

0x85, 0x02, // Global Report ID (cannot be 0) Data Report 16bytes + ID 

0x95, 0x10, // Global Report Count 16 (number of Report Size fields) 

0x09, 0x00, // Usage Undefined 

0x15, 0x00, // Local Usage Minimum (each Report Count must be associated with a Usage) 

0x26, 0xFF, 0x00, // Local Usage Maximum 

0xB2, 0x02, 0x01, // Main Feature (Data,Var,Abs,Buf) 

// 42 buytes 

0xC0 // END_COLLECTION 

};


这个hid报表描述符,我从网上看了很多教程,然后又找的现成的描述符,试了好几个,都是插入电脑只有接入声音没有拔出声音。我用的wireshark3.2.0,来分析usb数据。每次发送完设备描述符,配置描述符,字符串描述符,然后请求报表描述符,请求3次,设备没有回应,然后复位usb设备,然后反复循环如此。于是各种改源代码找原因。看不见摸不着的东西找问题很费劲,于是又接上一个指示灯。每次都要执行到一个switch里边,把灯亮语句放在switch的开头就亮  ,放到结尾就不亮。怀疑是到哪个case出了问题,于是10来个case各种删除然后编译,有时删了这个case正常有时删那个正常,最后总结case只要删的多就正常,最后明白了------>atmega48容量太小,程序超过了4k,刷机时不提示任何错误。最后把不重要的功能删除,刷入,正常。


开始我用的libusb开源库做的实验,改成hid设备之后发现libusb用不了了,又学了一下hidapi开源库。

推荐阅读

史海拾趣

GradConn Ltd公司的发展小趣事

GradConn Ltd的创立初期,公司便明确了其专注于电子连接器和同轴电缆组件的市场定位。这一战略选择使GradConn能够迅速在通讯、工业、医疗和汽车等领域建立起稳定的客户基础。通过不断研发创新,GradConn推出了一系列高质量的产品,如板对板连接器、电缆组件连接器以及SIM卡连接器等,满足了市场对精密、可靠连接解决方案的迫切需求。

Chauvin Arnoux公司的发展小趣事

1934年,Chauvin Arnoux再次引领技术潮流,发明了电流互感器钳形表,这是世界上第一个非接触式电流表。这一发明不仅改变了电流测量的传统方式,而且极大地提高了测量的便捷性和安全性。非接触式电流表的出现,为电气工程师和技术人员提供了更为高效和安全的测量工具,推动了电气行业的发展。

AIM - American Iron and Metal公司的发展小趣事

随着国内市场的饱和,AIM开始寻求海外市场的拓展。公司制定了详细的国际化战略,通过参加国际展览、建立海外销售渠道等方式,逐步打开了欧美、东南亚等地区的市场。AIM的产品质量和技术水平得到了国际客户的认可,出口额逐年攀升。

Cornell Dubilier公司的发展小趣事

在1936年至1962年期间,Cornell Dubilier公司在汉密尔顿工业园运营,专门制造电子零件和组件。然而,在这一时期,公司在生产过程中使用了含有多氯联苯(PCB)和其他有害物质的材料,并将其直接倾倒在现场土壤中。这一行为导致了严重的环境污染问题,使得该场地在后续被众多商业企业占据后,仍面临着环境保护的挑战。

和芯润德(CoreChips)公司的发展小趣事

在2010年代初,中国的集成电路市场仍被国际巨头所主导,技术壁垒高筑。然而,和芯润德科技有限公司(以下简称“和芯润德”)却勇敢地挑战了这一现状。公司创始人团队凭借对技术的深刻理解和不懈追求,成功研发出首款具有自主知识产权的以太网网络芯片,打破了美系技术的长期垄断。这一突破不仅为和芯润德赢得了市场的认可,也为中国集成电路产业赢得了宝贵的尊严。

FDI [Future Designs , Inc.]公司的发展小趣事

随着环保意识的提高,电子产品的绿色环保问题日益受到关注。FDI公司积极响应这一趋势,投入大量资源研发绿色电子产品。公司采用环保材料和生产工艺,推出了一系列符合国际环保标准的电子产品。这些产品不仅具有优良的性能和品质,而且对环境友好,深受消费者的喜爱。

问答坊 | AI 解惑

靠车吃饭,靠油生存,现在车贵,油贵,疯了!

如今燃油税又涨了,最苦的就是我们这些靠车吃饭的普通车主,每天靠车运货、拉生意,现在油价涨了,真不知到将来怎么讨生活。…

查看全部问答>

2-60V可调

最近打算做一个2-60V可调电源,最大电流为10A,纹波<100mv,不知大家有什么建议给我吗?虽然做过电源但是还没有做过这么大功率的,第一次尝试,不知该考虑些什么? 希望各位大虾多给提点意见 …

查看全部问答>

讨教一下,有没有能在win7/08server下可以使用的stc-isp驱动捏??

RT!!! 下载了http://www.mcu-memory.com/提供的5.01海外版!还是不行!!! We are trying to connect to your MCU ... Chinese:正在尝试与 MCU/单片机 握手连接 ... Connection is failure. You can try: 1.Give your MCU Power On Reset. 2 ...…

查看全部问答>

自己的4*4键盘扫描实现

本人刚开始学弹片,对C语言也是刚刚接触,看了 对于入门还不错. 在这里贴出自己写的键盘扫描实现,小弟初学者,也没考虑那么多,如效率之类的 有不足之处 欢迎大家讨论 #include #include #define uint unsigned int #define uchar unsigned char s ...…

查看全部问答>

求一个 vs2005 下 C# 写的适用于 2440+wince5.0 的串口通讯程序

求一个 vs2005 下 C# 写的适用于 2440+wince5.0 的串口通讯程序 越详细越好 我刚接触这一块 C#的语法还没学全 以前也从没在win下编过程 但是头儿要求的特别急 想找个例程边看边学 希望有大侠能指点一下 同时希望有这种例程的能给我 ...…

查看全部问答>

请教高手 jffs2_get_inode_nodes(): Data CRC failed on node...问题

/bin/mount -n -t jffs2 /dev/mtdblock/3 -o rw,noatime /app jffs2: Erase block size too small (16KiB). Using virtual blocks size (32KiB) instead Empty flash at 0x02407104 ends at 0x02407200 set hw ether and ip of eth0 eth0: Sett ...…

查看全部问答>

申请ez430-RF2500 开发板

不敢说项目中就会用它,但是可以多一种方案多一个选择。 完成后分享过程中的点滴。   [ 本帖最后由 sblpp 于 2010-10-13 18:55 编辑 ]…

查看全部问答>

ST给的Demo中的STM3210E-EVAL如何产生的?

IAR编译器下本来的工程应该是Debug,Release,但是ST给的Demo中的 TM3210E-EVAL如何产生的?属于Debug呢还是Release呢?…

查看全部问答>

1602显示问题

我的电路和程序如下,按照郭天祥教程做的,为什么仿真不了??             感谢各路大侠指导     [ 本帖最后由 sphshine 于 2011-10-29 20:29 编辑 ]…

查看全部问答>

P1REN没有定义?

我刚开始学430在编译下面代码的时候,IAR报错 Error[Pe020]: identifier \"P1REN\" is undefined E:\\workspace\\main.c 12 #include \"io430.h\"#include \"intrinsics.h\" int main( void ){  // Stop watchdog timer to prevent time out ...…

查看全部问答>