WhyCan Forum(哇酷开发者社区)

我们能随心所欲"有问题百度(谷歌)一下", 这得感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn

您尚未登录。

#1 2020-02-20 22:32:38

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

CH552 版 CMSIS-DAP v2

关注晕哥论坛好久,刚看完新世界结局完美!希望早日战胜疫情迎来我们的新世界!

假期太长了,闲着没事把年前做的CH552的51板子移植了cmsis dap v2,测试下载速度有20k,还行。
当时做这板子主要震惊于51还能跑USB而且不需要晶振,还支持触摸按键,而且1块钱!
明天上传程序,有ch552的可以试试,再一同改进一下!

离线

#2 2020-02-20 22:44:22

firstman
会员
注册时间: 2019-04-06
累计积分: 278

Re: CH552 版 CMSIS-DAP v2

啊, 坐等, 感谢分享!

离线

#3 2020-02-20 22:50:32

晕哥
管理员
注册时间: 2017-09-06
累计积分: 9,188

Re: CH552 版 CMSIS-DAP v2

坐等, 感谢分享!

离线

#4 2020-02-20 23:22:11

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

和我撞车了,我也在做,不过还没写好(手动捂脸
先等等楼主的版本,做一回伸手党,哈哈

离线

#5 2020-02-21 01:02:59

Blueskull
会员
注册时间: 2020-02-20
累计积分: 189

Re: CH552 版 CMSIS-DAP v2

我也撞车了,不过我做的是SPI flash烧写器,给我的高云FPGA小板用的。速度卡在flash上,硬伤,要想灵活调代码还得搞JTAG。

FPGA板子的传送门在此:https://www.eevblog.com/forum/projects/(poll)-fpga-board-form-factor/

离线

#6 2020-02-21 07:05:11

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

DAP-20200212-删除打印.7z
我只实现了SWD功能! wink
Program Size: data=56.0 xdata=1009 code=7828
代码空间应还有,还可以加东西,后期可能加上串口!
修改自keil安装目录下的 LPC-Link-II V2,驱动也在该工程文件夹里!

最近编辑记录 ljbfly (2020-02-21 07:10:00)

离线

#7 2020-02-21 08:08:13

jiangming1399
会员
注册时间: 2018-06-14
累计积分: 110

Re: CH552 版 CMSIS-DAP v2

大佬牛逼!

离线

#8 2020-02-21 08:53:03

红白机
会员
注册时间: 2020-01-02
累计积分: 133

Re: CH552 版 CMSIS-DAP v2

66666666, 大佬牛逼!

离线

#9 2020-02-21 11:35:11

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

拜读了一下代码,有一点比较疑惑,楼主似乎没有按照CMSIS-DAP v2的要求添加WinUSB描述符,也没有相关的0xEE描述符或BOS描述符,这样也可以自动安装驱动吗?在我的Win10上不这么做的话不能自动安装驱动。
另外,在字符串描述符里面默认应该是Unicode编码的字符串,我这边如果不改成Unicode编码会造成显示乱码。

离线

#10 2020-02-21 11:52:29

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

不太懂,需要手动装驱动,我只是代码搬运工,哈哈,大家一起改
找个可以自动装驱动的DAP-link看一下枚举过程,改一下枚举就行了吧

最近编辑记录 ljbfly (2020-02-21 11:56:54)

离线

#11 2020-02-21 12:17:34

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

不太懂,需要手动装驱动,我只是代码搬运工,哈哈,大家一起改
找个可以自动装驱动的DAP-link看一下枚举过程,改一下枚举就行了吧

那我贴一下我的这部分代码吧,献丑了。
WinUSB我是实现的MS 2.0描述符,需要改bcdUSB为0210,之后需要响应Get Descriptor里面的BOS Descriptor,之后还需要响应一个Vendor Request,说起来麻烦但其实蛮简单的,参考开源版本的DAPLink就可以实现。

下面是BOS Descriptor的内容,其中USB_DESCRIPTOR_TYPE_BOS为15,USBD_WINUSB_VENDOR_CODE就是Vendor Request的bRequest的值。USB 2.0 Extension是我为了通过USB测试工具加上去的。

static __code uint8_t BOSDescriptor[] = {
    5, // bLength
    USB_DESCRIPTOR_TYPE_BOS,
    _WBVAL(40), // wTotalLength
    2, // bNumDeviceCaps
    // USB 2.0 Extension
    7, // bLength
    USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY,
    USB_DEVICE_CAPABILITY_TYPE_USB_20_EXTENSION,
    0x00, 0x00, 0x00, 0x00, // bmAttributes
    // WinUSB
    28, // bLength
    USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, // bDescriptorType
    USB_DEVICE_CAPABILITY_TYPE_PLATFORM, // bDevCapabilityType
    0x00, // bReserved
    0xDF, 0x60, 0xDD, 0xD8,
    0x89, 0x45, 0xC7, 0x4C,
    0x9C, 0xD2, 0x65, 0x9D,
    0x9E, 0x64, 0x8A, 0x9F, // PlatformCapabilityUUID
    // CapabilityData (Descriptor Set Information)
    0x00, 0x00, 0x03, 0x06, // dwWindowsVersion
    _WBVAL(162), // wDescriptorSetTotalLength
    USBD_WINUSB_VENDOR_CODE, // bVendorCode
    0 // bAltEnumCode
};

之后是WinUSB描述符,这个描述符就是在USBD_WINUSB_VENDOR_CODE对应的Vendor Request返回的东西。

static __code uint8_t WinUSBDescriptorSet[] = {
    // set header
    _WBVAL(10), // wLength
    _WBVAL(MS_OS_20_SET_HEADER_DESCRIPTOR),
    0x00, 0x00, 0x03, 0x06, // dwWindowsVersion
    _WBVAL(162), // wTotalLength
    // compatible ID descriptor
    _WBVAL(20), // wLength
    _WBVAL(MS_OS_20_FEATURE_COMPATBLE_ID),
    'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // CompatibleID
    0, 0, 0, 0, 0, 0, 0, 0, // SubCompatibleID
    // registry property
    _WBVAL(132), // wLength
    _WBVAL(MS_OS_20_FEATURE_REG_PROPERTY),
    _WBVAL(MS_OS_20_PROPERTY_DATA_TYPE_REG_MULTI_SZ), // wPropertyDataType
    _WBVAL(42), // wPropertyNameLength
    'D', 0, 'e', 0, 'v', 0, 'i', 0, 'c', 0, 'e', 0,
    'I', 0, 'n', 0, 't', 0, 'e', 0, 'r', 0, 'f', 0, 'a', 0, 'c', 0, 'e', 0,
    'G', 0, 'U', 0, 'I', 0, 'D', 0, 's', 0, 0, 0, // PropertyName
    _WBVAL(80), // wPropertyDataLength
    '{', 0,
    'C', 0, 'D', 0, 'B', 0, '3', 0, 'B', 0, '5', 0, 'A', 0, 'D', 0, '-', 0,
    '2', 0, '9', 0, '3', 0, 'B', 0, '-', 0,
    '4', 0, '6', 0, '6', 0, '3', 0, '-', 0,
    'A', 0, 'A', 0, '3', 0, '6', 0, '-', 0,
    '1', 0, 'A', 0, 'A', 0, 'E', 0, '4', 0, '6', 0, '4', 0, '6', 0, '3', 0, '7', 0, '7', 0, '6', 0,
    '}', 0, 0, 0, 0, 0
};

最近编辑记录 metro (2020-02-21 12:18:14)

离线

#12 2020-02-21 12:23:29

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

@metro 厉害,USB我不太懂,弄这个小板子就是想学学USB
@metro有没有学USB的相关资料,今天晚上加上去试试

最近编辑记录 ljbfly (2020-02-21 12:26:31)

离线

#13 2020-02-21 12:36:50

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

@metro 厉害,USB我不太懂,弄这个小板子就是想学学USB
@metro有没有学USB的相关资料,今天晚上加上去试试

可以看看我发过的博文:Category: USB | MetroCores
不过一些比较新的东西我还没整理上去,一般我也是看看网上的博客或者直接啃标准 lol

离线

#14 2020-02-22 11:26:33

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

@metro 求助

#if (WINUSB == 1)
UINT8C DevDesc[] =
{
    0x12, 0x01, 0x10, 0x02, 0x00, 0x00, 0x00, THIS_ENDP0_SIZE,
    0x28, 0x0D, 0x04, 0x02, 0x00, 0x01, 0x01, 0x02,
    0x03, 0x01
};
UINT8C CfgDesc[] =
{
    0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0xfa, //配置描述符
    0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0x00, 0x00, 0x04, //接口描述符

    0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, //端点描述符
    0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00
};
#else
#Err no USB interface define
#endif

/*字符串描述符 略*/
// 语言描述符
UINT8C MyLangDescr[] = {0x04, 0x03, 0x09, 0x04};
// 厂家信息: KEI - Tools By ARM
UINT8C MyManuInfo[] = {0x28, 0x03, 0x4B, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4C, 0x00, 0x20, 0x00, 0x2D, 0x00, 0x20, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6c, 0x00, 0x73, 0x00, 0x20, 0x00, 0x42, 0x00, 0x79, 0x00, 0x20, 0x00, 0x41, 0x00, 0x52, 0x00, 0x4D, 0x00};
// 产品信息: DAP-Link-II
UINT8C MyProdInfo[] = {0x18, 0x03, 0x44, 0x00, 0x41, 0x00, 0x50, 0x00, 0x2D, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x6B, 0x00, 0x2D, 0x00, 0x49, 0x00, 0x49, 0x00};
// 序列号: 0001A0000000
UINT8C MySerNumber[] = {0x1A, 0x03, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x41, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00};
// 接口: CMSIS-DAP
UINT8C MyInterface[] = {0x14, 0x03, 0x43, 0x00, 0x4d, 0x00, 0x53, 0x00, 0x49, 0x00, 0x53, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x41, 0x00, 0x50, 0x00};

UINT8C USB_BOSDescriptor[0x21] =
{
    0x05, 0x0F, 0x21, 0x00, 0x01, 0x1C, 0x10, 0x05, 0x00, 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7,
    0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F, 0x00, 0x00, 0x03, 0x06, 0xAA, 0x00, 0x20,
    0x00
};

UINT8C WINUSB_Descriptor[0xAA] =
{
    0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0xAA, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,
    0xA0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x04, 0x00, 0x07, 0x00, 0x2A, 0x00, 0x44, 0x00,
    0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00,
    0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00,
    0x49, 0x00, 0x44, 0x00, 0x73, 0x00, 0x00, 0x00, 0x50, 0x00, 0x7B, 0x00, 0x43, 0x00, 0x44, 0x00,
    0x42, 0x00, 0x33, 0x00, 0x42, 0x00, 0x35, 0x00, 0x41, 0x00, 0x44, 0x00, 0x2D, 0x00, 0x32, 0x00,
    0x39, 0x00, 0x33, 0x00, 0x42, 0x00, 0x2D, 0x00, 0x34, 0x00, 0x36, 0x00, 0x36, 0x00, 0x33, 0x00,
    0x2D, 0x00, 0x41, 0x00, 0x41, 0x00, 0x33, 0x00, 0x36, 0x00, 0x2D, 0x00, 0x31, 0x00, 0x41, 0x00,
    0x41, 0x00, 0x45, 0x00, 0x34, 0x00, 0x36, 0x00, 0x34, 0x00, 0x36, 0x00, 0x33, 0x00, 0x37, 0x00,
    0x37, 0x00, 0x36, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00
};


void DeviceInterrupt(void) interrupt INT_NO_USB using 1 //USB中断服务程序,使用寄存器组1
{
    UINT8 len;
    if (UIF_TRANSFER) //USB传输完成标志
    {
        switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP))
        {
        case UIS_TOKEN_IN | 2: //endpoint 2# 端点批量上传
            UEP2_T_LEN = 0;      //预使用发送长度一定要清空
            Endp2Busy = 0;
            UEP2_CTRL = UEP2_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_NAK; //默认应答NAK
            break;
        case UIS_TOKEN_OUT | 2: //endpoint 2# 端点批量下传
            if (U_TOG_OK)         // 不同步的数据包将丢弃
            {
                len = USB_RX_LEN;
                memcpy(Ep2DataO[Ep2Oi++], Ep2BufferO, len); //待优化
                if (Ep2Oi >= DAP_PACKET_COUNT)
                    Ep2Oi = 0;
            }
            break;
        case UIS_TOKEN_SETUP | 0: //SETUP事务
            len = USB_RX_LEN;
            if (len == (sizeof(USB_SETUP_REQ)))
            {
                SetupLen = UsbSetupBuf->wLengthL;
                len = 0;           // 默认为成功并且上传0长度
                SetupReq = UsbSetupBuf->bRequest;
                if ((UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK) != USB_REQ_TYP_STANDARD) /*HID类命令*/
                {
                    if ((UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK) == USB_REQ_RECIP_DEVICE)
                    {
                        switch (SetupReq)
                        {
                        case 0x20:                         //GetReport
                            if (UsbSetupBuf->wIndexL == 0x07)
                            {
                                pDescr = WINUSB_Descriptor; //把设备描述符送到要发送的缓冲区
                                len = sizeof(WINUSB_Descriptor);
                            }
                            break;
                        default:
                            len = 0xFF; /*命令不支持*/
                            break;
                        }
                    }
                    if (SetupLen > len)
                    {
                        SetupLen = len; //限制总长度
                    }
                    len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度
                    memcpy(Ep0Buffer, pDescr, len);                                 //加载上传数据
                    SetupLen -= len;
                    pDescr += len;
                }
                else //标准请求
                {
                    switch (SetupReq) //请求码
                    {
                    case USB_GET_DESCRIPTOR:
                        switch (UsbSetupBuf->wValueH)
                        {
                        case 1:             //设备描述符
                            pDescr = DevDesc; //把设备描述符送到要发送的缓冲区
                            len = sizeof(DevDesc);
                            break;
                        case 2:             //配置描述符
                            pDescr = CfgDesc; //把设备描述符送到要发送的缓冲区
                            len = sizeof(CfgDesc);
                            break;
                        case 3: // 字符串描述符
                            switch (UsbSetupBuf->wValueL)
                            {
                            case 0:
                                pDescr = (PUINT8)(&MyLangDescr[0]);
                                len = sizeof(MyLangDescr);
                                break;
                            case 1:
                                pDescr = (PUINT8)(&MyManuInfo[0]);
                                len = sizeof(MyManuInfo);
                                break;
                            case 2:
                                pDescr = (PUINT8)(&MyProdInfo[0]);
                                len = sizeof(MyProdInfo);
                                break;
                            case 3:
                                pDescr = (PUINT8)(&MySerNumber[0]);
                                len = sizeof(MySerNumber);
                                break;
                            case 4:
                                pDescr = (PUINT8)(&MyInterface[0]);
                                len = sizeof(MyInterface);
                                break;
                            default:
                                len = 0xFF; // 不支持的字符串描述符
                                break;
                            }
                            break;
                        case 15:
                            pDescr = (PUINT8)(&USB_BOSDescriptor[0]);
                            len = sizeof(USB_BOSDescriptor);
                            break;
                        default:
                            len = 0xff; //不支持的命令或者出错
                            break;
                        }
                        if (SetupLen > len)
                        {
                            SetupLen = len; //限制总长度
                        }
                        len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度
                        memcpy(Ep0Buffer, pDescr, len);                                 //加载上传数据
                        SetupLen -= len;
                        pDescr += len;
                        break;
                    case USB_SET_ADDRESS:
                        SetupLen = UsbSetupBuf->wValueL; //暂存USB设备地址
                        break;
                    case USB_GET_CONFIGURATION:
                        Ep0Buffer[0] = UsbConfig;
                        if (SetupLen >= 1)
                        {
                            len = 1;
                        }
                        break;
                    case USB_SET_CONFIGURATION:
                        UsbConfig = UsbSetupBuf->wValueL;
                        if (UsbConfig)
                        {
                            Ready = 1; //set config命令一般代表usb枚举完成的标志
                        }
                        break;
                    case 0x0A:
                        break;
                    case USB_CLEAR_FEATURE:                                                       //Clear Feature
                        if ((UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK) == USB_REQ_RECIP_ENDP) // 端点
                        {
                            switch (UsbSetupBuf->wIndexL)
                            {
                            case 0x82:
                                UEP2_CTRL = UEP2_CTRL & ~(bUEP_T_TOG | MASK_UEP_T_RES) | UEP_T_RES_NAK;
                                break;
                            case 0x81:
                                UEP1_CTRL = UEP1_CTRL & ~(bUEP_T_TOG | MASK_UEP_T_RES) | UEP_T_RES_NAK;
                                break;
                            case 0x02:
                                UEP2_CTRL = UEP2_CTRL & ~(bUEP_R_TOG | MASK_UEP_R_RES) | UEP_R_RES_ACK;
                                break;
                            default:
                                len = 0xFF; // 不支持的端点
                                break;
                            }
                        }
                        else
                        {
                            len = 0xFF; // 不是端点不支持
                        }
                        break;
                    case USB_SET_FEATURE:                             /* Set Feature */
                        if ((UsbSetupBuf->bRequestType & 0x1F) == 0x00) /* 设置设备 */
                        {
                            if ((((UINT16)UsbSetupBuf->wValueH << 8) | UsbSetupBuf->wValueL) == 0x01)
                            {
                                if (CfgDesc[7] & 0x20)
                                {
                                    /* 设置唤醒使能标志 */
                                }
                                else
                                {
                                    len = 0xFF; /* 操作失败 */
                                }
                            }
                            else
                            {
                                len = 0xFF; /* 操作失败 */
                            }
                        }
                        else if ((UsbSetupBuf->bRequestType & 0x1F) == 0x02) /* 设置端点 */
                        {
                            if ((((UINT16)UsbSetupBuf->wValueH << 8) | UsbSetupBuf->wValueL) == 0x00)
                            {
                                switch (((UINT16)UsbSetupBuf->wIndexH << 8) | UsbSetupBuf->wIndexL)
                                {
                                case 0x82:
                                    UEP2_CTRL = UEP2_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL; /* 设置端点2 IN STALL */
                                    break;
                                case 0x02:
                                    UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL; /* 设置端点2 OUT Stall */
                                    break;
                                case 0x81:
                                    UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL; /* 设置端点1 IN STALL */
                                    break;
                                default:
                                    len = 0xFF; /* 操作失败 */
                                    break;
                                }
                            }
                            else
                            {
                                len = 0xFF; /* 操作失败 */
                            }
                        }
                        else
                        {
                            len = 0xFF; /* 操作失败 */
                        }
                        break;
                    case USB_GET_STATUS:
                        Ep0Buffer[0] = 0x00;
                        Ep0Buffer[1] = 0x00;
                        if (SetupLen >= 2)
                        {
                            len = 2;
                        }
                        else
                        {
                            len = SetupLen;
                        }
                        break;
                    default:
                        len = 0xff; //操作失败
                        break;
                    }
                }
            }
            else
            {
                len = 0xff; //包长度错误
            }
            if (len == 0xff)
            {
                SetupReq = 0xFF;
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL; //STALL
            }
            else if (len <= THIS_ENDP0_SIZE) //上传数据或者状态阶段返回0长度包
            {
                UEP0_T_LEN = len;
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //默认数据包是DATA1,返回应答ACK
            }
            else
            {
                UEP0_T_LEN = 0;                                                      //虽然尚未到状态阶段,但是提前预置上传0长度数据包以防主机提前进入状态阶段
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //默认数据包是DATA1,返回应答ACK
            }
            break;
        case UIS_TOKEN_IN | 0: //endpoint0 IN
            switch (SetupReq)
            {
            case USB_GET_DESCRIPTOR:
            case 0x20:
                len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度
                memcpy(Ep0Buffer, pDescr, len);                                 //加载上传数据
                SetupLen -= len;
                pDescr += len;
                UEP0_T_LEN = len;
                UEP0_CTRL ^= bUEP_T_TOG; //同步标志位翻转
                break;
            case USB_SET_ADDRESS:
                USB_DEV_AD = USB_DEV_AD & bUDA_GP_BIT | SetupLen;
                UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
                break;
            default:
                UEP0_T_LEN = 0; //状态阶段完成中断或者是强制上传0长度数据包结束控制传输
                UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
                break;
            }
            break;
        case UIS_TOKEN_OUT | 0: // endpoint0 OUT
            len = USB_RX_LEN;
            if (SetupReq == 0x09)
            {
                if (Ep0Buffer[0])
                {
                }
                else if (Ep0Buffer[0] == 0)
                {
                }
            }
            UEP0_CTRL ^= bUEP_R_TOG; //同步标志位翻转
            break;
        default:
            break;
        }
        UIF_TRANSFER = 0; //写0清空中断
    }
    if (UIF_BUS_RST) //设备模式USB总线复位中断
    {
        UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
        UEP1_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK;
        UEP2_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK | UEP_T_RES_NAK;
        USB_DEV_AD = 0x00;
        UIF_SUSPEND = 0;
        UIF_TRANSFER = 0;
        Endp2Busy = 0;
        UIF_BUS_RST = 0; //清中断标志
    }
    if (UIF_SUSPEND) //USB总线挂起/唤醒完成
    {
        UIF_SUSPEND = 0;
        if (USB_MIS_ST & bUMS_SUSPEND) //挂起
        {
        }
    }
    else
    {
        //意外的中断,不可能发生的情况
        USB_INT_FG = 0xFF; //清中断标志
    }
}

代码应该没有问题呀,咋提示没有兼容驱动

FluxBB bbcode 测试

离线

#15 2020-02-22 12:58:20

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

@metro 求助

#if (WINUSB == 1)
UINT8C DevDesc[] =
{
    0x12, 0x01, 0x10, 0x02, 0x00, 0x00, 0x00, THIS_ENDP0_SIZE,
    0x28, 0x0D, 0x04, 0x02, 0x00, 0x01, 0x01, 0x02,
    0x03, 0x01
};
UINT8C CfgDesc[] =
{
    0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0xfa, //配置描述符
    0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0x00, 0x00, 0x04, //接口描述符

    0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, //端点描述符
    0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00
};
#else
#Err no USB interface define
#endif

/*字符串描述符 略*/
// 语言描述符
UINT8C MyLangDescr[] = {0x04, 0x03, 0x09, 0x04};
// 厂家信息: KEI - Tools By ARM
UINT8C MyManuInfo[] = {0x28, 0x03, 0x4B, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4C, 0x00, 0x20, 0x00, 0x2D, 0x00, 0x20, 0x00, 0x54, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x6c, 0x00, 0x73, 0x00, 0x20, 0x00, 0x42, 0x00, 0x79, 0x00, 0x20, 0x00, 0x41, 0x00, 0x52, 0x00, 0x4D, 0x00};
// 产品信息: DAP-Link-II
UINT8C MyProdInfo[] = {0x18, 0x03, 0x44, 0x00, 0x41, 0x00, 0x50, 0x00, 0x2D, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x6B, 0x00, 0x2D, 0x00, 0x49, 0x00, 0x49, 0x00};
// 序列号: 0001A0000000
UINT8C MySerNumber[] = {0x1A, 0x03, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x41, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00};
// 接口: CMSIS-DAP
UINT8C MyInterface[] = {0x14, 0x03, 0x43, 0x00, 0x4d, 0x00, 0x53, 0x00, 0x49, 0x00, 0x53, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x41, 0x00, 0x50, 0x00};

UINT8C USB_BOSDescriptor[0x21] =
{
    0x05, 0x0F, 0x21, 0x00, 0x01, 0x1C, 0x10, 0x05, 0x00, 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7,
    0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F, 0x00, 0x00, 0x03, 0x06, 0xAA, 0x00, 0x20,
    0x00
};

UINT8C WINUSB_Descriptor[0xAA] =
{
    0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0xAA, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,
    0xA0, 0x00, 0x14, 0x00, 0x03, 0x00, 0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x04, 0x00, 0x07, 0x00, 0x2A, 0x00, 0x44, 0x00,
    0x65, 0x00, 0x76, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00,
    0x65, 0x00, 0x72, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x47, 0x00, 0x55, 0x00,
    0x49, 0x00, 0x44, 0x00, 0x73, 0x00, 0x00, 0x00, 0x50, 0x00, 0x7B, 0x00, 0x43, 0x00, 0x44, 0x00,
    0x42, 0x00, 0x33, 0x00, 0x42, 0x00, 0x35, 0x00, 0x41, 0x00, 0x44, 0x00, 0x2D, 0x00, 0x32, 0x00,
    0x39, 0x00, 0x33, 0x00, 0x42, 0x00, 0x2D, 0x00, 0x34, 0x00, 0x36, 0x00, 0x36, 0x00, 0x33, 0x00,
    0x2D, 0x00, 0x41, 0x00, 0x41, 0x00, 0x33, 0x00, 0x36, 0x00, 0x2D, 0x00, 0x31, 0x00, 0x41, 0x00,
    0x41, 0x00, 0x45, 0x00, 0x34, 0x00, 0x36, 0x00, 0x34, 0x00, 0x36, 0x00, 0x33, 0x00, 0x37, 0x00,
    0x37, 0x00, 0x36, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00
};


void DeviceInterrupt(void) interrupt INT_NO_USB using 1 //USB中断服务程序,使用寄存器组1
{
    UINT8 len;
    if (UIF_TRANSFER) //USB传输完成标志
    {
        switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP))
        {
        case UIS_TOKEN_IN | 2: //endpoint 2# 端点批量上传
            UEP2_T_LEN = 0;      //预使用发送长度一定要清空
            Endp2Busy = 0;
            UEP2_CTRL = UEP2_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_NAK; //默认应答NAK
            break;
        case UIS_TOKEN_OUT | 2: //endpoint 2# 端点批量下传
            if (U_TOG_OK)         // 不同步的数据包将丢弃
            {
                len = USB_RX_LEN;
                memcpy(Ep2DataO[Ep2Oi++], Ep2BufferO, len); //待优化
                if (Ep2Oi >= DAP_PACKET_COUNT)
                    Ep2Oi = 0;
            }
            break;
        case UIS_TOKEN_SETUP | 0: //SETUP事务
            len = USB_RX_LEN;
            if (len == (sizeof(USB_SETUP_REQ)))
            {
                SetupLen = UsbSetupBuf->wLengthL;
                len = 0;           // 默认为成功并且上传0长度
                SetupReq = UsbSetupBuf->bRequest;
                if ((UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK) != USB_REQ_TYP_STANDARD) /*HID类命令*/
                {
                    if ((UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK) == USB_REQ_RECIP_DEVICE)
                    {
                        switch (SetupReq)
                        {
                        case 0x20:                         //GetReport
                            if (UsbSetupBuf->wIndexL == 0x07)
                            {
                                pDescr = WINUSB_Descriptor; //把设备描述符送到要发送的缓冲区
                                len = sizeof(WINUSB_Descriptor);
                            }
                            break;
                        default:
                            len = 0xFF; /*命令不支持*/
                            break;
                        }
                    }
                    if (SetupLen > len)
                    {
                        SetupLen = len; //限制总长度
                    }
                    len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度
                    memcpy(Ep0Buffer, pDescr, len);                                 //加载上传数据
                    SetupLen -= len;
                    pDescr += len;
                }
                else //标准请求
                {
                    switch (SetupReq) //请求码
                    {
                    case USB_GET_DESCRIPTOR:
                        switch (UsbSetupBuf->wValueH)
                        {
                        case 1:             //设备描述符
                            pDescr = DevDesc; //把设备描述符送到要发送的缓冲区
                            len = sizeof(DevDesc);
                            break;
                        case 2:             //配置描述符
                            pDescr = CfgDesc; //把设备描述符送到要发送的缓冲区
                            len = sizeof(CfgDesc);
                            break;
                        case 3: // 字符串描述符
                            switch (UsbSetupBuf->wValueL)
                            {
                            case 0:
                                pDescr = (PUINT8)(&MyLangDescr[0]);
                                len = sizeof(MyLangDescr);
                                break;
                            case 1:
                                pDescr = (PUINT8)(&MyManuInfo[0]);
                                len = sizeof(MyManuInfo);
                                break;
                            case 2:
                                pDescr = (PUINT8)(&MyProdInfo[0]);
                                len = sizeof(MyProdInfo);
                                break;
                            case 3:
                                pDescr = (PUINT8)(&MySerNumber[0]);
                                len = sizeof(MySerNumber);
                                break;
                            case 4:
                                pDescr = (PUINT8)(&MyInterface[0]);
                                len = sizeof(MyInterface);
                                break;
                            default:
                                len = 0xFF; // 不支持的字符串描述符
                                break;
                            }
                            break;
                        case 15:
                            pDescr = (PUINT8)(&USB_BOSDescriptor[0]);
                            len = sizeof(USB_BOSDescriptor);
                            break;
                        default:
                            len = 0xff; //不支持的命令或者出错
                            break;
                        }
                        if (SetupLen > len)
                        {
                            SetupLen = len; //限制总长度
                        }
                        len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度
                        memcpy(Ep0Buffer, pDescr, len);                                 //加载上传数据
                        SetupLen -= len;
                        pDescr += len;
                        break;
                    case USB_SET_ADDRESS:
                        SetupLen = UsbSetupBuf->wValueL; //暂存USB设备地址
                        break;
                    case USB_GET_CONFIGURATION:
                        Ep0Buffer[0] = UsbConfig;
                        if (SetupLen >= 1)
                        {
                            len = 1;
                        }
                        break;
                    case USB_SET_CONFIGURATION:
                        UsbConfig = UsbSetupBuf->wValueL;
                        if (UsbConfig)
                        {
                            Ready = 1; //set config命令一般代表usb枚举完成的标志
                        }
                        break;
                    case 0x0A:
                        break;
                    case USB_CLEAR_FEATURE:                                                       //Clear Feature
                        if ((UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK) == USB_REQ_RECIP_ENDP) // 端点
                        {
                            switch (UsbSetupBuf->wIndexL)
                            {
                            case 0x82:
                                UEP2_CTRL = UEP2_CTRL & ~(bUEP_T_TOG | MASK_UEP_T_RES) | UEP_T_RES_NAK;
                                break;
                            case 0x81:
                                UEP1_CTRL = UEP1_CTRL & ~(bUEP_T_TOG | MASK_UEP_T_RES) | UEP_T_RES_NAK;
                                break;
                            case 0x02:
                                UEP2_CTRL = UEP2_CTRL & ~(bUEP_R_TOG | MASK_UEP_R_RES) | UEP_R_RES_ACK;
                                break;
                            default:
                                len = 0xFF; // 不支持的端点
                                break;
                            }
                        }
                        else
                        {
                            len = 0xFF; // 不是端点不支持
                        }
                        break;
                    case USB_SET_FEATURE:                             /* Set Feature */
                        if ((UsbSetupBuf->bRequestType & 0x1F) == 0x00) /* 设置设备 */
                        {
                            if ((((UINT16)UsbSetupBuf->wValueH << 8) | UsbSetupBuf->wValueL) == 0x01)
                            {
                                if (CfgDesc[7] & 0x20)
                                {
                                    /* 设置唤醒使能标志 */
                                }
                                else
                                {
                                    len = 0xFF; /* 操作失败 */
                                }
                            }
                            else
                            {
                                len = 0xFF; /* 操作失败 */
                            }
                        }
                        else if ((UsbSetupBuf->bRequestType & 0x1F) == 0x02) /* 设置端点 */
                        {
                            if ((((UINT16)UsbSetupBuf->wValueH << 8) | UsbSetupBuf->wValueL) == 0x00)
                            {
                                switch (((UINT16)UsbSetupBuf->wIndexH << 8) | UsbSetupBuf->wIndexL)
                                {
                                case 0x82:
                                    UEP2_CTRL = UEP2_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL; /* 设置端点2 IN STALL */
                                    break;
                                case 0x02:
                                    UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL; /* 设置端点2 OUT Stall */
                                    break;
                                case 0x81:
                                    UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL; /* 设置端点1 IN STALL */
                                    break;
                                default:
                                    len = 0xFF; /* 操作失败 */
                                    break;
                                }
                            }
                            else
                            {
                                len = 0xFF; /* 操作失败 */
                            }
                        }
                        else
                        {
                            len = 0xFF; /* 操作失败 */
                        }
                        break;
                    case USB_GET_STATUS:
                        Ep0Buffer[0] = 0x00;
                        Ep0Buffer[1] = 0x00;
                        if (SetupLen >= 2)
                        {
                            len = 2;
                        }
                        else
                        {
                            len = SetupLen;
                        }
                        break;
                    default:
                        len = 0xff; //操作失败
                        break;
                    }
                }
            }
            else
            {
                len = 0xff; //包长度错误
            }
            if (len == 0xff)
            {
                SetupReq = 0xFF;
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL; //STALL
            }
            else if (len <= THIS_ENDP0_SIZE) //上传数据或者状态阶段返回0长度包
            {
                UEP0_T_LEN = len;
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //默认数据包是DATA1,返回应答ACK
            }
            else
            {
                UEP0_T_LEN = 0;                                                      //虽然尚未到状态阶段,但是提前预置上传0长度数据包以防主机提前进入状态阶段
                UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //默认数据包是DATA1,返回应答ACK
            }
            break;
        case UIS_TOKEN_IN | 0: //endpoint0 IN
            switch (SetupReq)
            {
            case USB_GET_DESCRIPTOR:
            case 0x20:
                len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度
                memcpy(Ep0Buffer, pDescr, len);                                 //加载上传数据
                SetupLen -= len;
                pDescr += len;
                UEP0_T_LEN = len;
                UEP0_CTRL ^= bUEP_T_TOG; //同步标志位翻转
                break;
            case USB_SET_ADDRESS:
                USB_DEV_AD = USB_DEV_AD & bUDA_GP_BIT | SetupLen;
                UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
                break;
            default:
                UEP0_T_LEN = 0; //状态阶段完成中断或者是强制上传0长度数据包结束控制传输
                UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
                break;
            }
            break;
        case UIS_TOKEN_OUT | 0: // endpoint0 OUT
            len = USB_RX_LEN;
            if (SetupReq == 0x09)
            {
                if (Ep0Buffer[0])
                {
                }
                else if (Ep0Buffer[0] == 0)
                {
                }
            }
            UEP0_CTRL ^= bUEP_R_TOG; //同步标志位翻转
            break;
        default:
            break;
        }
        UIF_TRANSFER = 0; //写0清空中断
    }
    if (UIF_BUS_RST) //设备模式USB总线复位中断
    {
        UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK;
        UEP1_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK;
        UEP2_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK | UEP_T_RES_NAK;
        USB_DEV_AD = 0x00;
        UIF_SUSPEND = 0;
        UIF_TRANSFER = 0;
        Endp2Busy = 0;
        UIF_BUS_RST = 0; //清中断标志
    }
    if (UIF_SUSPEND) //USB总线挂起/唤醒完成
    {
        UIF_SUSPEND = 0;
        if (USB_MIS_ST & bUMS_SUSPEND) //挂起
        {
        }
    }
    else
    {
        //意外的中断,不可能发生的情况
        USB_INT_FG = 0xFF; //清中断标志
    }
}

代码应该没有问题呀,咋提示没有兼容驱动

https://whycan.cn/files/members/390/TIM%E6%88%AA%E5%9B%BE20200222112207_20200222-1123.png

这个代码是从DAPLink来的吧?我遇到过类似的问题,结果发现是WinUSB描述符里面有个function subset header(对应于0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0x00那段),但是在只有一个function的时候不应该添加这个,否则就会报找不到驱动的错误,删除掉相关选项(顺便修改BOS和WinUSB描述符里面的对应长度)就可以用了。

离线

#16 2020-02-22 13:43:04

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

@metro 厉害,驱动好了,可是Keil识别不到是那的问题呢!是字符描述吗

离线

#17 2020-02-22 13:47:11

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

@metro 厉害,驱动好了,可是Keil识别不到是那的问题呢!是字符描述吗

有可能是,你按照官方的VID/PID和描述符改改,我这边是可以正常识别的。

离线

#18 2020-02-22 15:08:35

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

metro 说:

有可能是,你按照官方的VID/PID和描述符改改,我这边是可以正常识别的。

这个是程序问题,获取描述长度大于255了,我只看了低字节,导致回应错误不能识别!

再次感谢@metro大神!

DAP-20200222-免驱动.7zTIM截图20200222150610.png

离线

#19 2020-02-22 16:21:10

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

这个是程序问题,获取描述长度大于255了,我只看了低字节,导致回应错误不能识别!

再次感谢@metro大神!

DAP-20200222-免驱动.7zhttps://whycan.cn/files/members/390/TIM截图20200222150610.png

客气了,希望早日见到成品,哈哈。
现在我在重写DAP部分的核心代码,估计短时间内搞不定了,到时候也可以在你的板子上验证一下效果。

离线

#20 2020-02-22 20:18:50

演技担当黄晓明
会员
注册时间: 2017-10-17
累计积分: 117

Re: CH552 版 CMSIS-DAP v2

Blueskull 说:

我也撞车了,不过我做的是SPI flash烧写器,给我的高云FPGA小板用的。速度卡在flash上,硬伤,要想灵活调代码还得搞JTAG。

FPGA板子的传送门在此:https://www.eevblog.com/forum/projects/(poll)-fpga-board-form-factor/

看了下这个FPGA,感觉东西不错啊,好低调

离线

#21 2020-02-22 20:59:58

wuxx
会员
注册时间: 2018-01-03
累计积分: 30

Re: CH552 版 CMSIS-DAP v2

感谢分享~不过CH552的IO默认是5V的,连接到3.3V的目标芯片的IO上会不会有点风险

最近编辑记录 wuxx (2020-02-22 21:07:40)

离线

#22 2020-02-23 12:01:56

jiangming1399
会员
注册时间: 2018-06-14
累计积分: 110

Re: CH552 版 CMSIS-DAP v2

读了一下楼主的代码,有几个疑问想请教一下楼主:
1. SW_DP.c中,原版代码是有PIN_SWDIO_OUT_ENABLE这一个切换SWDIO的功能的宏的,我看在楼主的代码里面并没有使用,而是直接将这个IO设置为1。请问IO在PP模式下可以直接这样读取到SWDIO的值吗?
2. DAP.c的DAP_SWJ_Clock函数中,原版代码是有设置快速和慢速的区分,而楼主代码里面则是强制设置为快速,并取消掉所有的IO延时。请问这样在实际使用中是否有发现问题?

离线

#23 2020-02-23 12:59:06

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

jiangming1399 说:

读了一下楼主的代码,有几个疑问想请教一下楼主:
1. SW_DP.c中,原版代码是有PIN_SWDIO_OUT_ENABLE这一个切换SWDIO的功能的宏的,我看在楼主的代码里面并没有使用,而是直接将这个IO设置为1。请问IO在PP模式下可以直接这样读取到SWDIO的值吗?
2. DAP.c的DAP_SWJ_Clock函数中,原版代码是有设置快速和慢速的区分,而楼主代码里面则是强制设置为快速,并取消掉所有的IO延时。请问这样在实际使用中是否有发现问题?

关于时钟频率的问题,CH552在3.3V下只能跑到16 MHz,就算是用上SPI最高也就是8 MHz,用IO模拟最高只能到(16/7) MHz(读1位需要7个周期),而且是汇编情况下的理想值,实际上应该是到不了的。在这种情况下,如果要新增一个TransferSlow,就会显著增加代码体积。我估计根本的解决方法应该还是要用汇编重写这部分代码,目前就在做相关工作,不过DAP_SWD_Transfer函数确实比较复杂,需要花点时间重写。

离线

#24 2020-02-23 17:06:00

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

wuxx 说:

感谢分享~不过CH552的IO默认是5V的,连接到3.3V的目标芯片的IO上会不会有点风险

STM32的调试口写的是兼容5V的



jiangming1399 说:

读了一下楼主的代码,有几个疑问想请教一下楼主:
1. SW_DP.c中,原版代码是有PIN_SWDIO_OUT_ENABLE这一个切换SWDIO的功能的宏的,我看在楼主的代码里面并没有使用,而是直接将这个IO设置为1。请问IO在PP模式下可以直接这样读取到SWDIO的值吗?
2. DAP.c的DAP_SWJ_Clock函数中,原版代码是有设置快速和慢速的区分,而楼主代码里面则是强制设置为快速,并取消掉所有的IO延时。请问这样在实际使用中是否有发现问题?


1.能读到,这个可能和GPIO的结构有关
2.感觉51速度慢,就没有加延时,强制快速就行了


今天加了USB转串口CDC功能,代码中肯定还有需要改进的地方,我只是简单的实现一下功能!

DAP-20200223+CDC.7z

设备管理器为什么只显示USB 串行设备呢,不能改名字吗?@metro
TIM截图20200223170326.png

离线

#25 2020-02-23 17:38:04

演技担当黄晓明
会员
注册时间: 2017-10-17
累计积分: 117

Re: CH552 版 CMSIS-DAP v2

这个也太慢了点............

离线

#26 2020-02-23 17:39:52

metro
会员
注册时间: 2019-03-09
累计积分: 281

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

STM32的调试口写的是兼容5V的






1.能读到,这个可能和GPIO的结构有关
2.感觉51速度慢,就没有加延时,强制快速就行了


今天加了USB转串口CDC功能,代码中肯定还有需要改进的地方,我只是简单的实现一下功能!

DAP-20200223+CDC.7z

设备管理器为什么只显示USB 串行设备呢,不能改名字吗?@metro
https://whycan.cn/files/members/390/TIM截图20200223170326.png

CDC类的默认串口驱动好像就是这样的,没看过可以指定名称的方式,应该是需要自己写驱动才行。

离线

#27 2020-02-23 21:14:10

演技担当黄晓明
会员
注册时间: 2017-10-17
累计积分: 117

Re: CH552 版 CMSIS-DAP v2

有人用CH552模拟CH341得时序做编程器

离线

#28 2020-02-29 23:23:17

waku
会员
注册时间: 2020-02-29
累计积分: 7

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

这个是程序问题,获取描述长度大于255了,我只看了低字节,导致回应错误不能识别!

再次感谢@metro大神!

DAP-20200222-免驱动.7zhttps://whycan.cn/files/members/390/TIM截图20200222150610.png

这个PCB文件能分享吗?

离线

#29 2020-03-01 09:22:01

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

这个PCB文件能分享吗?

这个板子没有3.3电源,管脚电压都是5V的,两个触摸按键

PCB1.7z

离线

#30 2020-03-01 20:16:07

mmdy9142
会员
注册时间: 2020-03-01
累计积分: 1

Re: CH552 版 CMSIS-DAP v2

大佬牛逼!

离线

#31 2020-03-03 21:43:20

sy373466062
会员
注册时间: 2018-11-12
累计积分: 67

Re: CH552 版 CMSIS-DAP v2

这个DAP Link速度有点慢

离线

#32 2020-03-04 10:32:56

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

sy373466062 说:

这个DAP Link速度有点慢

可以优化,参见 metro 的帖子
我的板子现在的程序, keil下载FLASH不擦除、不校验,应该是30K左右,有时间用汇编优化试试
https://whycan.cn/viewtopic.php?id=3766

最近编辑记录 ljbfly (2020-03-04 10:33:48)

离线

#33 2020-03-04 10:57:07

anve
会员
注册时间: 2019-01-10
累计积分: 4

Re: CH552 版 CMSIS-DAP v2

DAP-20200223+CDC.7z   这个文件下载不了。

离线

#34 2020-03-04 11:20:14

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

anve 说:

DAP-20200223+CDC.7z   这个文件下载不了。

试试这个

DAP-20200302.7z

离线

#35 2020-03-06 13:37:23

waku
会员
注册时间: 2020-02-29
累计积分: 7

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

这个板子没有3.3电源,管脚电压都是5V的,两个触摸按键

PCB1.7z

不设计3v3电源是出于什么考虑才舍弃吗?

离线

#36 2020-03-29 14:12:14

gddddd
会员
注册时间: 2020-03-27
累计积分: 24

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

试试这个

DAP-20200302.7z

感谢楼主的分享,下了DAP-20200223+CDC.7z这个代码,编译运行可以找到CMSIS-DAP v2和DAPLink-CDCExt两个设备,不过DAPLink-CDCExt一直提示“这个设备没有兼容驱动程序。”,手动指定位置安装CMSIS-DAP_CDC_Driver.inf还是驱动不了,系统是win8.1,已经禁用过签名了,还请指点一下,是这个代码需要专用的inf驱动文件吗?

离线

#37 2020-03-30 12:22:52

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

gddddd 说:

感谢楼主的分享,下了DAP-20200223+CDC.7z这个代码,编译运行可以找到CMSIS-DAP v2和DAPLink-CDCExt两个设备,不过DAPLink-CDCExt一直提示“这个设备没有兼容驱动程序。”,手动指定位置安装CMSIS-DAP_CDC_Driver.inf还是驱动不了,系统是win8.1,已经禁用过签名了,还请指点一下,是这个代码需要专用的inf驱动文件吗?

用DAP-20200302.7z那版试试,win10能用

离线

#38 2020-03-30 13:46:15

gddddd
会员
注册时间: 2020-03-27
累计积分: 24

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

用DAP-20200302.7z那版试试,win10能用

我打字复制时写错了,DAP-20200223+CDC.7z这个下载不了,就是用的DAP-20200302.7z这个代码,因为看到设备名是DAPLink-CDCExt有点特别,一般是显示的CMSIS-DAP CDC或者前面截图中的“USB 串行设备”这样的,这个设备名字变化和.inf的驱动有没有对应关系呢?或者可能是我系统的问题?我用的win8.1的笔记本,用这系统的比较少

离线

#39 2020-03-30 13:49:55

gddddd
会员
注册时间: 2020-03-27
累计积分: 24

Re: CH552 版 CMSIS-DAP v2

应该是系统的问题,刚想起来又去试了一下blue pill小板的CMSIS-DAP v2带的CDC也是驱动装不上,这个小板在win7和win10下是能安装上驱动的

离线

#40 2020-04-18 16:40:22

3551217182
会员
注册时间: 2020-04-18
累计积分: 9

Re: CH552 版 CMSIS-DAP v2

等有下载权限了,下载一下试试!

离线

#41 2020-04-19 22:39:42

gavinfree
会员
注册时间: 2020-04-19
累计积分: 10

Re: CH552 版 CMSIS-DAP v2

wch的这些小芯片又便宜又好使

离线

#42 2020-04-24 23:15:01

JZH1996
会员
注册时间: 2019-09-25
累计积分: 8

Re: CH552 版 CMSIS-DAP v2

大佬在吗?我下载了DAP-20200302.7z这个版本,无需安装驱动就能检测到一个串口设备和一个CMSIS Dap V2,但是Keil里面检测不到,之前的两版程序也是一样的问题,请问如何解决呢

离线

#43 2020-04-26 11:30:27

jony5
会员
注册时间: 2020-04-08
累计积分: 8

Re: CH552 版 CMSIS-DAP v2

不错帖子

离线

#44 2020-04-30 16:43:40

mini_uc
会员
注册时间: 2020-03-05
累计积分: 8

Re: CH552 版 CMSIS-DAP v2

ljbfly 说:

DAP-20200212-删除打印.7z
我只实现了SWD功能! wink
Program Size: data=56.0 xdata=1009 code=7828
代码空间应还有,还可以加东西,后期可能加上串口!
修改自keil安装目录下的 LPC-Link-II V2,驱动也在该工程文件夹里!


大侠在不,有没有DAP的驱动,我安装KEIL后,在 LPC-Link-II V2找不到驱动,WIN7下使用.

离线

#45 2020-05-01 14:34:52

ljbfly
会员
注册时间: 2017-12-07
累计积分: 36

Re: CH552 版 CMSIS-DAP v2

mini_uc 说:

大侠在不,有没有DAP的驱动,我安装KEIL后,在 LPC-Link-II V2找不到驱动,WIN7下使用.

LPC-Link-II.zip

离线

#46 2020-05-05 20:24:00

hfpostxx
会员
注册时间: 2020-05-05
累计积分: 5

Re: CH552 版 CMSIS-DAP v2

这个可以试试看。高手啊

离线

#47 2020-05-06 12:00:29

wuchuangxing
会员
注册时间: 2020-05-02
累计积分: 2

Re: CH552 版 CMSIS-DAP v2

wch的这些小芯片又便宜又好使

离线

#48 2020-05-06 13:39:22

演技担当黄晓明
会员
注册时间: 2017-10-17
累计积分: 117

Re: CH552 版 CMSIS-DAP v2

编译器不支持双DPTR?

离线

#49 2020-05-08 09:07:22

ifree64
会员
注册时间: 2019-06-27
累计积分: 51

Re: CH552 版 CMSIS-DAP v2

演技担当黄晓明 说:

编译器不支持双DPTR?

一直好奇stc等51都吹嘘双dptr,什么编译器可以支持双dptr?难道用到这个功能的人都玩汇编的吗?

离线

#50 2020-05-08 09:09:57

孤星泪
会员
注册时间: 2020-03-18
累计积分: 45

Re: CH552 版 CMSIS-DAP v2

ifree64 说:

一直好奇stc等51都吹嘘双dptr,什么编译器可以支持双dptr?难道用到这个功能的人都玩汇编的吗?

还可以内嵌汇编嘛

离线

#51 2020-05-11 11:10:23

mini_uc
会员
注册时间: 2020-03-05
累计积分: 8

Re: CH552 版 CMSIS-DAP v2

谢谢大侠.,现在积分不够..等够了再下载.

离线

#52 2020-05-17 10:49:08

duanhnhy
会员
注册时间: 2020-05-16
累计积分: 7

Re: CH552 版 CMSIS-DAP v2

努力学习大侠发的文档.,一边学习一边赚积分。

离线

#53 2020-05-26 20:43:33

KK666
会员
注册时间: 2020-05-26
累计积分: 4

Re: CH552 版 CMSIS-DAP v2

等有下载权限了,下载一下试试!

离线

#54 2020-05-28 17:30:07

jake2020
会员
注册时间: 2020-04-09
累计积分: 8

Re: CH552 版 CMSIS-DAP v2

ch552好像可以做很多东西,虽然51很慢,但有必要学习下

离线

#55 2020-06-01 18:07:18

1847123212
会员
注册时间: 2019-11-21
累计积分: 21

Re: CH552 版 CMSIS-DAP v2

这个速度真的靠谱不,我记得

离线

#56 2020-06-06 01:47:12

iamseer
会员
注册时间: 2020-06-06
累计积分: 13

Re: CH552 版 CMSIS-DAP v2

赞!这下调试成本低多了。看看能不能移植到SDCC。

离线

#57 2020-06-06 19:05:51

1847123212
会员
注册时间: 2019-11-21
累计积分: 21

Re: CH552 版 CMSIS-DAP v2

孤星泪 说:

还可以内嵌汇编嘛

那不是很麻烦,虽然stc的example也是这么做的

离线

#58 2020-06-08 08:48:44

XZHDJH
会员
注册时间: 2020-01-18
累计积分: 29

Re: CH552 版 CMSIS-DAP v2

蹭蹭USB的门

离线

#59 2020-06-14 10:03:00

qq445807936
会员
注册时间: 2020-06-14
累计积分: 3

Re: CH552 版 CMSIS-DAP v2

等有下载权限了,下载一下试试!too

离线

#60 2020-06-20 14:22:53

xifengzui
会员
注册时间: 2020-06-20
累计积分: 8

Re: CH552 版 CMSIS-DAP v2

大佬牛逼,WCH官方的demo对应就是缺个winusb的,对应这个希望能有所启发。

离线

#61 2020-06-21 04:14:20

iamseer
会员
注册时间: 2020-06-06
累计积分: 13

Re: CH552 版 CMSIS-DAP v2

贴一下 blueskull 在 https://www.eevblog.com/ 贴出的有关3.3V的信息:

Despite being discouraged in the datasheet, the chip can be programmed reliably at 3.3V. Due to power distribution network dropout, the last 2kB (which is the ISP) may or may not be reliably programmed, but the first 14KB should be fine, as I was told by WCH's tech support.

客服确认了3.3V烧写没问题,只是最后2K存储器(Bootloader区)可能烧写不正常。

离线

#62 2020-07-02 00:28:22

老痰酸菜泡面
会员
注册时间: 2020-07-01
累计积分: 3

Re: CH552 版 CMSIS-DAP v2

一直想做一个CH552的调试器,正好和楼主想到一起去了

离线

页脚

工信部备案:粤ICP备20025096号-1 Powered by FluxBB