CH579 USB HOST 同步标志位反转

以下是论坛里找到的沁恒厂商提供的CH579与BLE外设混合使用的例程DEMO

打开工程编译不过,发现缺少源文件,也是醉了,重新移植,看了这坨祖传的代码,看得真是心累,这是厂家雇大一学生写的吗?各种莫名其妙。不能规范一点么,为了节省成本真是不要face

原工程链接见附件:

icon_rar.gifPeripheral_usb_host_work_with_spug.rar

言归正传!!!!!---------------------------------------------->

1. 同步标志位为什么要做反转,

2.这个数据收发的DEMO写得有什么问题没,为什么移植到目标芯片上就只收发成功了一次,后边全乱了套了。

/*发送数据长度*/

uint8_t UsbOutuint8_t *pBuf,uint8_t len )  // 中断端点3发送

{

    uint8_t TxCnt,s,endp;

    endp = ThisUsbDev.GpVar[1];

    while ( len ) {

        //mDelayuS( 200 );

        R8_UH_TX_LEN = len >= 32 ? 32 : len;

        for ( TxCnt = 0; TxCnt != R8_UH_TX_LEN; TxCnt ++ ) {

            TxBuffer[ TxCnt ] = *pBuf;

            pBuf ++;

        }

        s = USBHostTransact( USB_PID_OUT << 4 |( endp & 0x7F), endp & 0x80 ? RB_UH_R_TOG | RB_UH_T_TOG : 00 );  // OUT数据

        if ( s == ERR_SUCCESS ) {

            len -= R8_UH_TX_LEN;

            endp ^= 0x80;  // 同步标志翻转

            ThisUsbDev.GpVar[1] = endp;  // 保存同步标志位

            

        }

        else return( s );

    }

    return ERR_SUCCESS;

}

/*返回数据接收长度,数据存放RxBuffer*/

uint8_t UsbBulkInvoid )

{

    uint8_t i,s,len,endp = ThisUsbDev.GpVar[0];

    s = USBHostTransact( USB_PID_IN << 4 | (endp & 0x7F), endp & 0x80 ? RB_UH_R_TOG | RB_UH_T_TOG : 00 );

    if ( s == ERR_SUCCESS ) {

        endp ^= 0x80;  // 同步标志翻转

        ThisUsbDev.GpVar[0] = endp;  // 保存同步标志位

        //tmos_memcpy(RX_BUF,RxBuffer,11);

        len = sizeof(RX_BUF);  // 接收到的数据长度

        if ( len ) {

            if(m_handlers)

            {

                usb_host_app_event_t event;

                event.type = USB_HOST_APP_DATA_IN;

                event.data.p_data = RxBuffer;

                //tmos_memcpy(event.data.p_data,RxBuffer,len);

                event.data.bytes = len;

                m_handlers(&event);

            }

//            USB_LOG("CH579 In data: \n");

//            for ( i = 0; i < len; i ++ ) USB_LOG("%02X ",(UINT16)(RxBuffer[i]) );

//            USB_LOG("\n");

        }

        return len;

    }

    else if ( s != ( USB_PID_NAK | ERR_USB_TRANSFER ) ) USB_LOG(" error %02x\n",(UINT16)s);  // 可能是断开了

    return 0;

}


1、同步标志位翻转是USB通讯协议的要求,必须要这么这么做的,如果想看原版协议,可以到USB ORG上下载USB的规范看看协议要求,学一门知识,东西还是比较多的,没法细讲。
2、主机收发,看代码写的没什么问题,你说的能收发一次,代码里面加点打印看看程序运行,如果乱了,一般可能是误操作,导致设备断连;或者设备还没准备好数据,没收到也有可能。
多加点打印跟踪一下。


只有登录才能回复,可以选择微信账号登录