老师,这个描述符我在 STC8H8K64U样例上修改,没有起作用
https://www.usbzh.com/article/detail-525.html
https://www.usbzh.com/article/detail-527.html
给你两个USB HID描述符较详细的说明,你对照着看看 hsrzq 发表于 2024-7-17 17:05
什么叫不起作用?这个描述符修改了之后,对应的收发程序也需要需要改,包括PC端的和MCU端的。 ...
老师,我做了相应的修改 hsrzq 发表于 2024-7-17 17:05
什么叫不起作用?这个描述符修改了之后,对应的收发程序也需要需要改,包括PC端的和MCU端的。 ...
老师,我做了相应修改,
BYTE usb_bulk_intr_out(BYTE *pData, BYTE ep)
{
BYTE cnt;
#if 01
BYTE cnt1;
cnt1 = cnt = usb_read_reg(COUNT0);
while (cnt1--)
{
//*pData++ =
pData = usb_read_reg((BYTE)(FIFO0 + ep));
WrUsbBuf1 %= USBBUFLEN;
}
#else
cnt = usb_read_fifo((BYTE)(FIFO0 + ep), pData);
#endif
usb_write_reg(OUTCSR1, 0);
return cnt;
}
void pcRunMain(void)
{
#ifdef USBINF
#if 0
while(WrUsbBuf1 != RdUsbBuf1)
{
pcAnalyse2(*(UsbBuffer+RdUsbBuf1++));
RdUsbBuf1 %= USBBUFLEN;
}
#else
{
while(WrUsbBuf1 != RdUsbBuf1){
UsbSendBuf = UsbBuffer;
RdUsbBuf1 %= USBBUFLEN;
}
if(ocnt1){
usb_bulk_intr_in(UsbSendBuf, ocnt1, 1);
ocnt1 = 0;
}
}
#endif
#else
while(PcWriteCount != PcReadCount)
{
pcAnalyse2(*(pPcReadDat+PcReadCount));
PcReadCount = (PcReadCount+1)%PCRXDNUM;
}
#endif
hsrzq 发表于 2024-7-17 17:05
什么叫不起作用?这个描述符修改了之后,对应的收发程序也需要需要改,包括PC端的和MCU端的。 ...
老师谢谢,PC端我不会,需要同事改 hsrzq 发表于 2024-7-17 17:15
https://www.usbzh.com/article/detail-525.html
https://www.usbzh.com/article/detail-527.html
给你两 ...
感恩老师,STC8H8K64u样例(第60个样例)HID代码中,描述符没有report id的定义,代码也没有相应的处理,请问老师,是STC8H8K64u不支持吗?我在芯片资料里也还没有找到相应的介绍 鼎银电子 发表于 2024-7-21 09:05
感恩老师,STC8H8K64u样例(第60个样例)HID代码中,描述符没有report id的定义,代码也没有相应的处理, ...
1. ReportID属于USB应用层的HID协议下的内容,是个纯纯软件层面的东西,与芯片无关
2. 默认ReportID是0,但不能直接在描述符中使用值为0的ReportID,相当于必须省略了 hsrzq 发表于 2024-7-21 11:35
1. ReportID属于USB应用层的HID协议下的内容,是个纯纯软件层面的东西,与芯片无关
2. 默认ReportID是0, ...
感恩老师的回复,明白了
看来USB不简单啊 soma 发表于 2024-7-21 21:50
看来USB不简单啊
这种软件层面的东西好搞,就是要查的资料多一点而已。
硬件设计才是真的难啊,一个LED点电路都能玩死人…… hsrzq 发表于 2024-7-21 11:35
1. ReportID属于USB应用层的HID协议下的内容,是个纯纯软件层面的东西,与芯片无关
2. 默认ReportID是0, ...
老师好,请问USB中断问题,代码如下,在没有接收HID数据,或者没有向USB口发送数据,USB就不产生中断(P24不会翻转状态),理论上应该1ms产生一次中断呢,是不是某些寄存器为没有清除呢?
目的是想在USB中断里,使用usb_in_ep4()函数完成串口数据的转发,而不是在主程序里查询方式发送(uart_polling())
void usb_isr() interrupt 25
{
static BYTE cdc1cnt=0;
BYTE intrusb;
BYTE intrin;
BYTE introut;
BYTE adrTemp;
adrTemp = USBADR; //USBADR 现场保存,避免主循环里写完 USBADR 后产生中断,在中断里修改了 USBADR 内容
intrusb = usb_read_reg(INTRUSB);
intrin = usb_read_reg(INTRIN1);
introut = usb_read_reg(INTROUT1);
if (intrusb & RSUIF) usb_resume();
if (intrusb & RSTIF) usb_reset();
if (intrin & EP0IF) usb_setup();
#ifdef EN_EP1IN
if (intrin & EP1INIF) usb_in_ep1();
#endif
#ifdef EN_EP2IN
if (intrin & EP2INIF) usb_in_ep2();
#endif
#ifdef EN_EP3IN
if (intrin & EP3INIF) usb_in_ep3();
#endif
#ifdef EN_EP4IN
if (intrin & EP4INIF) usb_in_ep4();
#endif
#ifdef EN_EP5IN
if (intrin & EP5INIF) usb_in_ep5();
#endif
#ifdef EN_EP1OUT
if (introut & EP1OUTIF) usb_out_ep1();
#endif
#ifdef EN_EP2OUT
if (introut & EP2OUTIF) usb_out_ep2();
#endif
#ifdef EN_EP3OUT
if (introut & EP3OUTIF) usb_out_ep3();
#endif
#ifdef EN_EP4OUT
if (introut & EP4OUTIF) usb_out_ep4();
#endif
#ifdef EN_EP5OUT
if (introut & EP5OUTIF) usb_out_ep5();
#endif
if (intrusb & SUSIF) usb_suspend();
USBADR = adrTemp; //USBADR 现场恢复
++cdc1cnt;
if(!cdc1cnt)P24^=1;
}
页:
1
[2]