关注晕哥论坛好久,刚看完新世界结局完美!希望早日战胜疫情迎来我们的新世界!
假期太长了,闲着没事把年前做的CH552的51板子移植了cmsis dap v2,测试下载速度有20k,还行。
当时做这板子主要震惊于51还能跑USB而且不需要晶振,还支持触摸按键,而且1块钱!
明天上传程序,有ch552的可以试试,再一同改进一下!
离线
啊, 坐等, 感谢分享!
离线
和我撞车了,我也在做,不过还没写好(手动捂脸
先等等楼主的版本,做一回伸手党,哈哈
离线
我也撞车了,不过我做的是SPI flash烧写器,给我的高云FPGA小板用的。速度卡在flash上,硬伤,要想灵活调代码还得搞JTAG。
FPGA板子的传送门在此:https://www.eevblog.com/forum/projects/(poll)-fpga-board-form-factor/
离线
DAP-20200212-删除打印.7z
我只实现了SWD功能!
Program Size: data=56.0 xdata=1009 code=7828
代码空间应还有,还可以加东西,后期可能加上串口!
修改自keil安装目录下的 LPC-Link-II V2,驱动也在该工程文件夹里!
最近编辑记录 ljbfly (2020-02-21 07:10:00)
离线
大佬牛逼!
离线
66666666, 大佬牛逼!
离线
拜读了一下代码,有一点比较疑惑,楼主似乎没有按照CMSIS-DAP v2的要求添加WinUSB描述符,也没有相关的0xEE描述符或BOS描述符,这样也可以自动安装驱动吗?在我的Win10上不这么做的话不能自动安装驱动。
另外,在字符串描述符里面默认应该是Unicode编码的字符串,我这边如果不改成Unicode编码会造成显示乱码。
离线
不太懂,需要手动装驱动,我只是代码搬运工,哈哈,大家一起改
找个可以自动装驱动的DAP-link看一下枚举过程,改一下枚举就行了吧
最近编辑记录 ljbfly (2020-02-21 11:56:54)
离线
不太懂,需要手动装驱动,我只是代码搬运工,哈哈,大家一起改
找个可以自动装驱动的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)
离线
@metro 厉害,USB我不太懂,弄这个小板子就是想学学USB
@metro有没有学USB的相关资料,今天晚上加上去试试
最近编辑记录 ljbfly (2020-02-21 12:26:31)
离线
@metro 厉害,USB我不太懂,弄这个小板子就是想学学USB
@metro有没有学USB的相关资料,今天晚上加上去试试
可以看看我发过的博文:Category: USB | MetroCores
不过一些比较新的东西我还没整理上去,一般我也是看看网上的博客或者直接啃标准
离线
@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; //清中断标志
}
}
代码应该没有问题呀,咋提示没有兼容驱动
离线
@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描述符里面的对应长度)就可以用了。
离线
@metro 厉害,驱动好了,可是Keil识别不到是那的问题呢!是字符描述吗
离线
@metro 厉害,驱动好了,可是Keil识别不到是那的问题呢!是字符描述吗
有可能是,你按照官方的VID/PID和描述符改改,我这边是可以正常识别的。
离线
有可能是,你按照官方的VID/PID和描述符改改,我这边是可以正常识别的。
这个是程序问题,获取描述长度大于255了,我只看了低字节,导致回应错误不能识别!
再次感谢@metro大神!
离线
这个是程序问题,获取描述长度大于255了,我只看了低字节,导致回应错误不能识别!
再次感谢@metro大神!
DAP-20200222-免驱动.7zhttps://whycan.cn/files/members/390/TIM截图20200222150610.png
客气了,希望早日见到成品,哈哈。
现在我在重写DAP部分的核心代码,估计短时间内搞不定了,到时候也可以在你的板子上验证一下效果。
离线
我也撞车了,不过我做的是SPI flash烧写器,给我的高云FPGA小板用的。速度卡在flash上,硬伤,要想灵活调代码还得搞JTAG。
FPGA板子的传送门在此:https://www.eevblog.com/forum/projects/(poll)-fpga-board-form-factor/
看了下这个FPGA,感觉东西不错啊,好低调
离线
感谢分享~不过CH552的IO默认是5V的,连接到3.3V的目标芯片的IO上会不会有点风险
最近编辑记录 wuxx (2020-02-22 21:07:40)
离线
读了一下楼主的代码,有几个疑问想请教一下楼主:
1. SW_DP.c中,原版代码是有PIN_SWDIO_OUT_ENABLE这一个切换SWDIO的功能的宏的,我看在楼主的代码里面并没有使用,而是直接将这个IO设置为1。请问IO在PP模式下可以直接这样读取到SWDIO的值吗?
2. DAP.c的DAP_SWJ_Clock函数中,原版代码是有设置快速和慢速的区分,而楼主代码里面则是强制设置为快速,并取消掉所有的IO延时。请问这样在实际使用中是否有发现问题?
离线
读了一下楼主的代码,有几个疑问想请教一下楼主:
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函数确实比较复杂,需要花点时间重写。
离线
感谢分享~不过CH552的IO默认是5V的,连接到3.3V的目标芯片的IO上会不会有点风险
STM32的调试口写的是兼容5V的
读了一下楼主的代码,有几个疑问想请教一下楼主:
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功能,代码中肯定还有需要改进的地方,我只是简单的实现一下功能!
设备管理器为什么只显示USB 串行设备呢,不能改名字吗?@metro
离线
这个也太慢了点............
离线
STM32的调试口写的是兼容5V的
1.能读到,这个可能和GPIO的结构有关
2.感觉51速度慢,就没有加延时,强制快速就行了今天加了USB转串口CDC功能,代码中肯定还有需要改进的地方,我只是简单的实现一下功能!
设备管理器为什么只显示USB 串行设备呢,不能改名字吗?@metro
https://whycan.cn/files/members/390/TIM截图20200223170326.png
CDC类的默认串口驱动好像就是这样的,没看过可以指定名称的方式,应该是需要自己写驱动才行。
离线
有人用CH552模拟CH341得时序做编程器
离线
这个是程序问题,获取描述长度大于255了,我只看了低字节,导致回应错误不能识别!
再次感谢@metro大神!
DAP-20200222-免驱动.7zhttps://whycan.cn/files/members/390/TIM截图20200222150610.png
这个PCB文件能分享吗?
离线
大佬牛逼!
离线
这个DAP Link速度有点慢
离线
这个DAP Link速度有点慢
可以优化,参见 metro 的帖子
我的板子现在的程序, keil下载FLASH不擦除、不校验,应该是30K左右,有时间用汇编优化试试
https://whycan.cn/viewtopic.php?id=3766
最近编辑记录 ljbfly (2020-03-04 10:33:48)
离线
DAP-20200223+CDC.7z 这个文件下载不了。
离线
离线
试试这个
感谢楼主的分享,下了DAP-20200223+CDC.7z这个代码,编译运行可以找到CMSIS-DAP v2和DAPLink-CDCExt两个设备,不过DAPLink-CDCExt一直提示“这个设备没有兼容驱动程序。”,手动指定位置安装CMSIS-DAP_CDC_Driver.inf还是驱动不了,系统是win8.1,已经禁用过签名了,还请指点一下,是这个代码需要专用的inf驱动文件吗?
离线
感谢楼主的分享,下了DAP-20200223+CDC.7z这个代码,编译运行可以找到CMSIS-DAP v2和DAPLink-CDCExt两个设备,不过DAPLink-CDCExt一直提示“这个设备没有兼容驱动程序。”,手动指定位置安装CMSIS-DAP_CDC_Driver.inf还是驱动不了,系统是win8.1,已经禁用过签名了,还请指点一下,是这个代码需要专用的inf驱动文件吗?
用DAP-20200302.7z那版试试,win10能用
离线
用DAP-20200302.7z那版试试,win10能用
我打字复制时写错了,DAP-20200223+CDC.7z这个下载不了,就是用的DAP-20200302.7z这个代码,因为看到设备名是DAPLink-CDCExt有点特别,一般是显示的CMSIS-DAP CDC或者前面截图中的“USB 串行设备”这样的,这个设备名字变化和.inf的驱动有没有对应关系呢?或者可能是我系统的问题?我用的win8.1的笔记本,用这系统的比较少
离线
应该是系统的问题,刚想起来又去试了一下blue pill小板的CMSIS-DAP v2带的CDC也是驱动装不上,这个小板在win7和win10下是能安装上驱动的
离线
等有下载权限了,下载一下试试!
离线
wch的这些小芯片又便宜又好使
离线
大佬在吗?我下载了DAP-20200302.7z这个版本,无需安装驱动就能检测到一个串口设备和一个CMSIS Dap V2,但是Keil里面检测不到,之前的两版程序也是一样的问题,请问如何解决呢
离线
不错帖子
离线
DAP-20200212-删除打印.7z
我只实现了SWD功能!
Program Size: data=56.0 xdata=1009 code=7828
代码空间应还有,还可以加东西,后期可能加上串口!
修改自keil安装目录下的 LPC-Link-II V2,驱动也在该工程文件夹里!
大侠在不,有没有DAP的驱动,我安装KEIL后,在 LPC-Link-II V2找不到驱动,WIN7下使用.
离线
大侠在不,有没有DAP的驱动,我安装KEIL后,在 LPC-Link-II V2找不到驱动,WIN7下使用.
离线
这个可以试试看。高手啊
离线
wch的这些小芯片又便宜又好使
离线
编译器不支持双DPTR?
离线
编译器不支持双DPTR?
一直好奇stc等51都吹嘘双dptr,什么编译器可以支持双dptr?难道用到这个功能的人都玩汇编的吗?
离线
一直好奇stc等51都吹嘘双dptr,什么编译器可以支持双dptr?难道用到这个功能的人都玩汇编的吗?
还可以内嵌汇编嘛
离线
谢谢大侠.,现在积分不够..等够了再下载.
离线
努力学习大侠发的文档.,一边学习一边赚积分。
离线
等有下载权限了,下载一下试试!
离线
ch552好像可以做很多东西,虽然51很慢,但有必要学习下
离线
这个速度真的靠谱不,我记得
离线
赞!这下调试成本低多了。看看能不能移植到SDCC。
离线
还可以内嵌汇编嘛
那不是很麻烦,虽然stc的example也是这么做的
离线
蹭蹭USB的门
离线
等有下载权限了,下载一下试试!too
离线
大佬牛逼,WCH官方的demo对应就是缺个winusb的,对应这个希望能有所启发。
离线
贴一下 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区)可能烧写不正常。
离线
一直想做一个CH552的调试器,正好和楼主想到一起去了
离线
求问一下LZ,代码中 bUEPn_BUF_MOD 都置为了0,那是不是在单缓冲下工作?那样的话,Ep2BufferO,Ep3BufferO应该不用那么大?
离线
把LZ的代码移植到了SDCC,这样不用keil也能编译。暂时使用的是V1的HID协议,省内存,也比较简单。
配图是用CH552调试Arduino Zero。用Arduino环境测试烧写4KB/S,读取10KB/S。我在时钟上加了1us延迟,应该还是大有优化空间。
离线
https://github.com/Lotlab/nrf52-keyboard/tree/master/usb
这是我看到这个帖子之后自己移植的,由于是一个产品的一部分,所以可能看上去会有点复杂
离线
离线
CH552 这小单片机还是挺不错的~
离线
折腾了半天没找到驱动,还好在45楼找到,谢谢大家的无私分享。
离线
楼主的通信方式是winusb还是hid呢
离线
ch551可以吗
离线
因为CH552G买不到,使用了CH554,使用WCH工具,通过USB线下载了楼主的各个版本程序,都识别不到设备,(未知设备都没有)。以下是我的电路图纸:
DAP_link_Project.zip
http://103.47.82.49/share/DAP_link_Project.zip
麻烦各位大哥看看。
最近编辑记录 LinjieGuo (2021-07-24 14:57:36)
离线
@metro
您好,您整理的USB相关资料,原博文链接挂了,能再分享一下吗。
离线
离线
CH552在3.3V下只有16M,上限太低了,很多应用只能做到能用而已
离线
刚好想学习学习51的usb部分,感谢
离线
winusb 值得学习
离线
感觉论坛里好多用沁恒芯片做DAPLink的啊
离线
学习中,试试win7能不能用link-V2
离线
现在已经成功了么
离线
串口和dap同时使用的么
离线
好东西,使用国产低成本带USB单片机
离线
离线
离线
欢迎探讨
开源CH551/2实现的汇编优化高速DAP-Link (CMSIS-DAP v2)
https://whycan.com/t_7786.html
离线
CH552估计是最便宜的USB单片机吧,做USB下载器仿真器真不错
离线
好东西,看看能不能做个无线的DAP
离线
调试和仿真用下来不错的,但是有一个问题就是串口在快速收发数据的时候会丢失数据
离线
买了个ch552的小板子,里面固件居然是CMSIS-DAP v2,不知道是不是这个
离线
楼主 这个用3.3V供电的话 误码率很高啊
离线
@ljbfly
我也遇到这个问题, mdk 不识别 但是设备管理器下面是正常, 想请教您 是哪里导致的啊?
离线
电脑可以识别 keil5识别不出来啊 大佬遇到过这个问题嘛 win10系统
离线
东西不错 准备用CH582移一个
离线
win11识别不出DAPLINK,只有USB compostive device?咋整
离线
电脑可以识别 keil5识别不出来啊 大佬遇到过这个问题嘛 win10系统
可以试着在设备管理器中卸载该设备 然后重新拔插CH552
当然,keil版本过低也有可能导致识别不出来
离线
mini_uc 说:大侠在不,有没有DAP的驱动,我安装KEIL后,在 LPC-Link-II V2找不到驱动,WIN7下使用.
大佬您好,请教下daplink的MSC拖拽下载功能应该如何实现
离线
@metro,大佬您好,请教下daplink的MSC拖拽下载功能应该如何实现
离线
感谢分享,我下载下来学习一下,官方的dap看不懂
离线
Thanks for sharing. looks very uninteresting to learn - I have already got CH552 chips that i was hoping one day to put in use.
离线
ljbfly 说:mini_uc 说:大侠在不,有没有DAP的驱动,我安装KEIL后,在 LPC-Link-II V2找不到驱动,WIN7下使用.
大佬您好,请教下daplink的MSC拖拽下载功能应该如何实现
MSC 掛上去 可能要增加不少Code size.
參考:
CH552 特点
增强型E8051内核CPU,速度比标准MCS51快8-15倍,特有XRAM数据快速复制指令;
内置16KB Code Flash、1KB XRAM和内部256B iRAM、128B DataFlash,支持字节方式读写;
内置2KB BootLoader,支持USB和串口ISP,提供ISP下载库;
内嵌USB控制器和USB 收发器,支持USB-Device 设备模式,支持USB type-C主从检测,支持USB 2.0 全速12Mbps或者低速1.5Mbps。支持最大64 字节数据包,内置FIFO,支持DMA;
离线
CH552和CH559是不是一个系列啊,楼主这个代码不知可以移植到CH559没有?
离线
不錯的內容,不知道在spi 轉SWD相容的部分有沒有更多的分享呢?
离线
你好,大佬,请问如何解决的不支持SWD软复位的问题,能分享下经验吗,多谢!
离线