×
单片机 > 单片机程序设计 > 详情

自制avr下载线

发布时间:2024-05-31 发布时间:
|

为了搞懂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开源库。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STC89C52的电子密码锁设计与仿真