4899|2

2131

帖子

0

TA的资源

至上芯片

楼主
 

大家有没有调试过USB的呢? [复制链接]

最近看了一下USB,不知道大家不没有学习USB的经验,可否分享一下!如:注意事项,难点!

最新回复

偶是菜鸟,不知道这个概念,于是上网搜索了下,与你分享个文章: 在网上下载了一个 USB调试工具,特别好用,我在程序中建立了一个USB发送任务,如果接收正确就进行数据发送,最后调试成功,只是必须接收、发送固定长度的数据,因为程序判断接收、发送成功的条件 就是 看接收、发送的实际长度和预接收、发送的长度是否一样来判断的。     1、对于/*************** 定义 USB 接收或发送控制块 **********************/ typedef struct tagUsb_Struct { uint8   *pBuff;   //接收或发送缓冲区指针数组 uint32  Max;   //接收或发送字节数, 也作为接收或发送完成标志 uint32  Cnt;       //接收或发送字节计数器 uint8   EndFlag; uint8   OneFlag;     }CTRL_USB; 的扩充,增加 uint8   EndFlag; uint8   OneFlag; 以便在接收、发送主程序、中断程序中,进行条件判断,以便对uint32  Max;   //接收或发送字节数, 也作为接收或发送完成标志 uint32  Cnt;       //接收或发送字节计数器  进行赋值、清零,例如,在第一次发送程序中要对Cnt,进行一次清零,在此次发送结束之前就不能再清零了,接收也是一样的,只不过可能在接收中断程序中进行。 这个相当重要。 2、整个程序,从阅读分析到整理、修改(从多任务接收、发送改为单任务)基本上对整个框架,和细节部分都有了一个大体的了解,可以说可以分为几大部分: (1)D12 底层驱动部分,像在做24c16时的时序一样, (2)描述符定义、赋值部分,这是USB特有的部分。 (3)描述符函数实现部分,描述符根据函数地址统一访问函数部分。 (4)控制发送、接收函数实现部分 (5)其他端点发送、接收函数实现部分 (6)其他端点发送、接收中断函数实现部分 (7)D12中断函数部分,这是数据接收、发送的接口、窗口。 总之,所有这些器件都遵循一个道理:首先是底层操作,然后是建立在底层上面的各种函数实现。 如24c16存储,在完成了,底层操作函数后就的考虑 数据 读取、存储实现方法了, 其中上面 (5)其他端点发送、接收函数实现部分 (6)其他端点发送、接收中断函数实现部分 是有机结合的,他们都是在任务中调用(5)设定好发送、接收参数,并进行一次发送、接收后若 没完则等待OSTimeDly(6)来继续完成后取消(5)的等待OSTimeDlyResume(pUsb->Prio),由(5)返回结果。 因为 D12是不能主动发送数据的,USB一切传输都是由主机发起 最后,注意在此程序中如果要移植到其他程序中使用,应该进行修改,如,本程序是采用外部总线来连接D12的因此他的一些端口定义都是外部的//PDIUSBD12命令与数据地址 #define D12_COM      (*((volatile uint8 *) 0x82000001))  //命令地址 #define D12_DAT      (*((volatile uint8 *) 0x82000000))  //数据地址 #define D12_NOP   (*((volatile uint8 *) 0x80000000)) 在移植时注意修改,还有使用这些端口的相关的函数操作。  详情 回复 发表于 2009-11-6 12:01
点赞 关注
个人签名处处留心皆学问!

回复
举报

51

帖子

3643

TA的资源

纯净的硅(初级)

沙发
 

回复 楼主 daicheng 的帖子

堪称经典的USB调试经验:
在枚举usb设备时,在SetConfiguration后一定不要忘了SetInterface,没走这一步80%的设备认不了。这一点很多51+SL811的例程都忘了。我也是后来用bus hound抓总线小样时才发现的。bus hound真是颗救命稻草,建议所有调usb的朋友,开门四件事:看《usb2.0原理与工程开发》前六章;下载例程;看要做器件所属usb设备类的说明;学会用bus hound!这四件事都做好再开始,福神才会最大地保佑你。

赞赏

1

查看全部赞赏

 
 

回复

3836

帖子

19

TA的资源

纯净的硅(中级)

板凳
 

回复 楼主 daicheng 的帖子

偶是菜鸟,不知道这个概念,于是上网搜索了下,与你分享个文章:

在网上下载了一个 USB调试工具,特别好用,我在程序中建立了一个USB发送任务,如果接收正确就进行数据发送,最后调试成功,只是必须接收、发送固定长度的数据,因为程序判断接收、发送成功的条件 就是 看接收、发送的实际长度和预接收、发送的长度是否一样来判断的。

    1、对于/*************** 定义 USB 接收或发送控制块 **********************/
typedef struct tagUsb_Struct
{
uint8   *pBuff;   //接收或发送缓冲区指针数组

uint32  Max;   //接收或发送字节数, 也作为接收或发送完成标志
uint32  Cnt;       //接收或发送字节计数器
uint8   EndFlag;
uint8   OneFlag;
   
}CTRL_USB;

的扩充,增加 uint8   EndFlag; uint8   OneFlag; 以便在接收、发送主程序、中断程序中,进行条件判断,以便对uint32  Max;   //接收或发送字节数, 也作为接收或发送完成标志
uint32  Cnt;       //接收或发送字节计数器  进行赋值、清零,例如,在第一次发送程序中要对Cnt,进行一次清零,在此次发送结束之前就不能再清零了,接收也是一样的,只不过可能在接收中断程序中进行。

这个相当重要。

2、整个程序,从阅读分析到整理、修改(从多任务接收、发送改为单任务)基本上对整个框架,和细节部分都有了一个大体的了解,可以说可以分为几大部分:

(1)D12 底层驱动部分,像在做24c16时的时序一样,

(2)描述符定义、赋值部分,这是USB特有的部分。

(3)描述符函数实现部分,描述符根据函数地址统一访问函数部分。

(4)控制发送、接收函数实现部分

(5)其他端点发送、接收函数实现部分

(6)其他端点发送、接收中断函数实现部分

(7)D12中断函数部分,这是数据接收、发送的接口、窗口。

总之,所有这些器件都遵循一个道理:首先是底层操作,然后是建立在底层上面的各种函数实现。

如24c16存储,在完成了,底层操作函数后就的考虑 数据 读取、存储实现方法了,

其中上面

(5)其他端点发送、接收函数实现部分

(6)其他端点发送、接收中断函数实现部分

是有机结合的,他们都是在任务中调用(5)设定好发送、接收参数,并进行一次发送、接收后若 没完则等待OSTimeDly(6)来继续完成后取消(5)的等待OSTimeDlyResume(pUsb->Prio),由(5)返回结果。

因为 D12是不能主动发送数据的,USB一切传输都是由主机发起

最后,注意在此程序中如果要移植到其他程序中使用,应该进行修改,如,本程序是采用外部总线来连接D12的因此他的一些端口定义都是外部的//PDIUSBD12命令与数据地址
#define D12_COM      (*((volatile uint8 *) 0x82000001))  //命令地址
#define D12_DAT      (*((volatile uint8 *) 0x82000000))  //数据地址
#define D12_NOP   (*((volatile uint8 *) 0x80000000))

在移植时注意修改,还有使用这些端口的相关的函数操作。

赞赏

1

查看全部赞赏

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表