This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2531EMK:CC2531 USB 器件、特定于供应商的协议

Guru**** 2535750 points
Other Parts Discussed in Thread: CC2531

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/805519/cc2531emk-cc2531-usb-device-vendor-specific-protocol

器件型号:CC2531EMK
主题中讨论的其他器件:CC2531

我正在使用 CC2531 USB 软件狗进行产品开发、并使用 USB 示例源代码(swrc088)开发特定于供应商的类和协议、下面是我的描述符配置

配置描述符:
wTotalLength: 0x0019
bNumInterfaces: 0x01
bConfigurationValue:0x01
iConfiguration: 0x00
bmAttributes: 0x80 (总线供电)
最大功率: 0x19 (50mA)

接口描述符:
bInterfaceNumber: 0x00
bAlternateSetting:0x00
bNumEndpoints: 0x01
bInterfaceClass: 0xFF
bInterfaceSubClass:0xFF
bInterfaceProtocol:0xFF
iInterface: 0x00

端点描述符:
bEndpointAddress: 0x83
传输类型: 批量
wMaxPacketSize: 0x0040 (64)
b 间隔: 0x05 

 下面是我的数据包的 Wireshark 转储,按照 USB_framework.c,我应该在 usbSetupData.pbuffer (usbfwSetupHandler())中接收数据,但当我调试时,我总是会看到一些垃圾数据。  

void usbfwSetupHandler (void)
{
uint8 controlReg;
uint8 bytesNow;
uint8 oldEndpoint;

//保存旧索引设置,然后选择端点0并获取控制寄存
器 oldEndpoint = USBFW_GET_SELECT_END终结 点();
USBFW_SELECT_终结 点(0);
controlReg = USBCS0;


//如果
(usbfwData.ep0Status = EP_RX){

//读取 FIFO
字节 Now = USBCNT0;
usbfwReadFifo (&USBF0、bytesNow、usbSetupData.pbuffer);
usbSetupData.bytesLeft --=字节 Now;
usbSetupData.pbuffer +=字节 Now;

// Arm the 终结点
USBCS0 = usbSetupData.bytesLeft? USBCS0_CLR_OUTPKT_RDY:(USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END);

//完成后,对相应的请求处理程序进行调用
if (usbSetupData.bytesLeft = 0){
if (ProcessFunc) ProcessFunc();
usbfwData.ep0Status = EP_IDLE;
}

//返回此处,因为在下一个中断之前不会再发生任何情况
USBFW_SELECT_终结 点(oldEndpoint);
return;

//让应用程序处理接收
}否则,如果(usbfwData.ep0Status == EP_MANUAL_RX){
ProcessFunc();
} 

请提供我在这里遗漏的内容  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我想知道什么是问题 usbfwSetupHandler(),  FIFO 读取必须受到中断保护,下面是最终测试的代码

    //如果
    (usbfwData.ep0Status == EP_RX){
    
    HAL_ENTER_CRITICAL_SECTION (intState);
    
    //读取 FIFO
    字节 Now = USBCNT0;
    usbfwReadFifo (&USB0、字节 Ntesow、usbSetupData.pbuffer);
    usbSetupData.bytesLeft=;
    usbSetupData.pbuffer +=字节 Now;
    
    HAL_EXIT_CRITICE_SECTION (intState);
    
    // Arm the 终结点
    USBCS0 = usbSetupData.bytesLeft? USBCS0_CLR_OUTPKT_RDY:(USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END);
    
    //完成后,对相应的请求处理程序进行调用
    if (usbSetupData.bytesLeft =0){
    if (ProcessFunc){
    ProcessFunc ();
    }
    usbfwData.ep0Status = EP_IDLE;
    }
    
    //返回此处,因为在下一个中断之前不会再发生任何情况
    USBFW_SELECT_终结 点(oldEndpoint);
    return;
    
    //让应用程序处理接收
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Dattatray、

    感谢您跟进并提供您的解决方案!

    此致、
    Ryan