最新回复
偶是菜鸟,不知道这个概念,于是上网搜索了下,与你分享个文章:
在网上下载了一个 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
| |
个人签名处处留心皆学问!
|
|
|
|
回复 楼主 daicheng 的帖子
此帖出自嵌入式系统论坛
赞赏 | ||
|
||
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
在下载中心贡献超过4000份资料
EEWorld Datasheet 技术支持