历史上的今天
今天是: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开源库。
史海拾趣
|
讨教一下,有没有能在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 ...… 查看全部问答> |
|
本人刚开始学弹片,对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 ...… 查看全部问答> |
|
不敢说项目中就会用它,但是可以多一种方案多一个选择。 完成后分享过程中的点滴。 [ 本帖最后由 sblpp 于 2010-10-13 18:55 编辑 ]… 查看全部问答> |
|
IAR编译器下本来的工程应该是Debug,Release,但是ST给的Demo中的 TM3210E-EVAL如何产生的?属于Debug呢还是Release呢?… 查看全部问答> |
|
我刚开始学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 ...… 查看全部问答> |




