打印

关于USB缓冲区描述表的定义问题

[复制链接]
3691|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
seawwh|  楼主 | 2011-6-5 12:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在ST提供的Virtual COM Port 的Demo中关于USB缓冲区的定义如下:

#define EP_NUM                          (4)
#define BTABLE_ADDRESS      (0x00)

#define ENDP0_RXADDR        (0x40)
#define ENDP0_TXADDR        (0x80)

#define ENDP1_TXADDR        (0xC0)
#define ENDP2_TXADDR        (0x100)
#define ENDP3_RXADDR        (0x110)

问题:
  其中使用了4个端点,每个端点占用8个字节的控制寄存器,
共需要 0x20 个空间,那么为了紧凑一些,可否定义变为:

#define ENDP0_RXADDR        (0x20)
#define ENDP0_TXADDR        (0x60)

#define ENDP1_TXADDR        (0xA0)
#define ENDP2_TXADDR        (0xE0)
#define ENDP3_RXADDR        (0xF0)

或者:

#define EP_NUM                          (4)
#define BTABLE_ADDRESS      (0x00)

#define ENDP0_RXADDR        (EP_NUM *0x08 )
#define ENDP0_TXADDR        (ENDP0_RXADDR + 0x40)
沙发
huatong| | 2011-6-6 18:52 | 只看该作者
本帖最后由 huatong 于 2011-6-6 19:20 编辑

我觉得是有问题的,如果RX接收缓冲区在前,大小是64字节,开始地址是0x40,那发送缓冲区的开始地址我就设置为66,要多出2字节来保存CRC.

我的USB程序的定义是将缓冲区描述符表放到缓冲区的最后边的,觉得好看些

typedef struct{
  u32 TxAddr;
  u32 TxCount;
  u32 RxAddr;
  u32 RxCount;
} BTABLE_INFO_TypeDef;

#define USB_BUFF_SIZE  (0x200)
#define USB_BTABLE_SIZE (8*2)  //使用多少个端点就*多少
#define USB_BTABLE_VALUE   (USB_BUFF_SIZE - USB_BTABLE_SIZE)  //这个数值就直接写入USB->BTABLE寄存器中

#define USB_BTABLE_BASE  (0x40006000 + USB_BTABLE_VALUE*2)
#defien BTable  ((BTABLE_INFO_TypeDef *)(USB_BTABLE_BASE))  //BTable[0]就是端点0的缓冲区描述符,BTable[1]是端点1的

#define EpRxCount0  (64)  //这个值就转换后写入BTable[0].RxCount
#define EpTxCount0  (64)
#define EpRxCount1  (64)
#define EpTxCount1  (64)

#define EPRX_BASE0  (0)       //这个值就写入BTable[0].RxAddr
#define EPTX_BASE0  ((EpRxCount0 > 0)?(EPRX_BASE0 + EpRxCount0 +2):(EPRX_BASE0 + EpRxCount0))  //这个值就写入 BTable[0].TxAddr
#define EPRX_BASE1  (EPTX_BASE0 + EpTxCount0)
#define EPTX_BASE1  ((EpRxCount1 >0)?(EPRX_BASE1 + EpRxCount1 +2):(EPRX_BASE1 + EpRxCount1))

#define RxBuff0  ((u32 *)(0x40006000+EPRX_BASE0*2))  //这是端点0的接收缓冲区
#define TxBuff0  ((u32 *)(0x40006000+EPTX_BASE0*2))  //这是端点0的发送缓冲区
#define RxBuff1  ((u32 *)(0x40006000+EPRX_BASE1*2))
#define TxBuff1  ((u32 *)(0x40006000+EPTX_BASE1*2))

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

368

帖子

1

粉丝