8H8K64U USB OUT端点4 接收长度超过128不能触发中断?
如题。手册显示,USB OUT4有256字节的FIFO,应该能够接收并产生中断。用这个端点作为USB-CDC Bulk out,描述符写MaxPacketSize <= 0x80时正常,大于0x80就无法触发中断。
部分代码如下:
void usb_out_ep4() using 1
{
BYTE csr;
BYTE cnt;
u8 i = 0;
usb_write_reg(INDEX, 4);
csr = usb_read_reg(OUTCSR1);
if (csr & OUTSTSTL) {
usb_write_reg(OUTCSR1, OUTCLRDT);
}
if (csr & OUTOPRDY) {
LED = ~LED; // 进中断应该看到LED亮起/熄灭
cnt = usb_read_reg(OUTCOUNT1);
if (Uart3TxBufSel) { // previous using buffer1
while (i < cnt) {
Uart3TxBuffer2 = usb_read_reg(FIFO4);
}
//cnt = usb_bulk_intr_out(Uart3TxBuffer2,4);
UART3_DMA_Transmit(Uart3TxBuffer2, cnt);
} else {
while (i < cnt) {
Uart3TxBuffer = usb_read_reg(FIFO4);
}
//cnt = usb_bulk_intr_out(Uart3TxBuffer,4);
UART3_DMA_Transmit(Uart3TxBuffer, cnt);
}
Uart3TxBufSel = ~Uart3TxBufSel;
Ep4OutBusy = 1;
}
}
到底是什么问题?项目需要一次性发送>128字节的才可能正常工作。
这个寄存器配置了吗
本帖最后由 scutly 于 2023-4-20 16:09 编辑
即便配置了也没有用,用STC-ISP工具打开并发送,只能触发一次,就再也不能触发了;用其他串口工具,一次也不能触发。
配置是写INDEX = 4然后OUTMAXP = 32
又发现即便用STC-ISP发送,只要数据量大过配置的MaxPacketSize,就会卡住好一会,中断也不触发。
接收处理完没有给告知"已经接收完毕",usb不会再继续接收了,也就没有接收中断发生。
给OUTCSR1写0
晓奇 发表于 2023-4-20 16:53
接收处理完没有给告知"已经接收完毕",usb不会再继续接收了,也就没有接收中断发生。
给OUTCSR1写0
...
128B以下能接收,说明早就写0了啊。。 我刚试了一下,128缓冲区没事,用8h做的,对比一下 本帖最后由 晓奇 于 2023-4-20 18:32 编辑
128以下能接收,只是上一个任务后有写0,你这里的配置描述、端点定义、端点IN/OUT_SIZE等是否都统一,需要仔细核查
前面的程序用了ep5,刚改成ep4也没事
感谢晓奇兄为8051世界添砖加瓦{:4_196:} 本帖最后由 scutly 于 2023-4-20 19:23 编辑
我这里也是128是没事啊,超过128就寄qwq
另外,代码是参考一箭双雕的,描述符基本没改,就动了MaxPacketSize,0x80以下一切正常,0x81或更高就不行了
本帖最后由 晓奇 于 2023-4-20 19:46 编辑
把你的工程发出来看看,不了解全部没法说.
我这个工程是用示波器代码简化过来的,任务单一比较好处理,收发也很直观
页:
[1]
2