STM32 USB虚拟串口与PC机软件实现流控出错

Linux-OS 2013-12-08 10:18:59
使用平台:STM32F103R8T6.
USB虚拟串口已经成功,想实现PC机端软件发送数据到 EP3,接收到的数据直接写入FLASH。EP1来实现向PC机发送0XAA,实现流控制。
但是一直有问题。不知道什么原因。

端点配置如下:

usb_prob.c文件:

/* Initialize Endpoint 0 */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_STALL);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPRxValid(ENDP0);

/* Initialize Endpoint 1 */
SetEPType(ENDP1, EP_BULK);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxStatus(ENDP1, EP_TX_NAK);
SetEPRxStatus(ENDP1, EP_RX_DIS);

/* Initialize Endpoint 2 */
SetEPType(ENDP2, EP_INTERRUPT);
SetEPTxAddr(ENDP2, ENDP2_TXADDR);
SetEPRxStatus(ENDP2, EP_RX_DIS);
SetEPTxStatus(ENDP2, EP_TX_NAK);

/* Initialize Endpoint 3 */
SetEPType(ENDP3, EP_BULK);
SetEPRxAddr(ENDP3, ENDP3_RXADDR);
SetEPRxCount(ENDP3, VIRTUAL_COM_PORT_DATA_SIZE);
SetEPRxStatus(ENDP3, EP_RX_VALID);
SetEPTxStatus(ENDP3, EP_TX_DIS);

usb_endp.c文件:

void EP1_IN_Callback()
{
uint8_t pDat[64];

pDat[0] = 0xAA;

UserToPMABufferCopy(pDat, ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);

}

/*******************************************************************************
* Function Name : EP3_OUT_Callback
* Description :
* Input : None.
* Output : None.
* Return : None.
*******************************************************************************/
void EP3_OUT_Callback(void)
{

/* Get the received data buffer and update the counter */
USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);

FLASH_Unlock();
EE_BufferWrite(WriteAddr,USB_Rx_Cnt,USB_Rx_Buffer);
WriteAddr += USB_Rx_Cnt;
//USBSendDataFlag = 1;
SetEPTxValid(ENDP1);

/* Enable the receive of data on EP3 */
SetEPRxValid(ENDP3);

}
出现PC机端软件读取虚拟串口数据,不能读到0XAA。PC机软件采用C#编写。

如果把SetEPTxValid(ENDP1);放在void EP1_IN_Callback()中PC机端软件就能收到数据0xAA。但是放在EP3_OUT_Callback中就不能收到数据。
实现这种方式主要是因为PC机端上位机软件将数据发送到虚拟串口,下位机直接将其写入FLASH。不加流控就会出现数据覆盖。0xAA就是用来告诉PC机,先不要再发了,等数据写入FLASH再继续发送64字节数据。
...全文
467 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Linux-OS 2013-12-10
  • 打赏
  • 举报
回复
有高人指点说。USB其实根本不用自己增加流控。端点1完全不用。 EE_BufferWrite(WriteAddr,USB_Rx_Cnt,USB_Rx_Buffer); WriteAddr += USB_Rx_Cnt; SetEPTxValid(ENDP3); 就这样就行了。因为SetEPTxValid(ENDP3);是在 EE_BufferWrite之后,也就是说,端点3只有在 数据完全写入FLASH后,才有效。而在写入FLASH期间,由于ENDP3一直处于无效状态。主机发送来的 OUT令牌,ENDP3都回送NAK。 这个观点由于没有测试,现在还是比较认同。
Linux-OS 2013-12-09
  • 打赏
  • 举报
回复
奥,是我没说明白。就是你说的意思。不过没有人知道原因吗?
libai 2013-12-09
  • 打赏
  • 举报
回复
你每次发数据当然要SetEPTxValid(ENDP1);,不然 数据怎么能发送出去
pathletboy 2013-12-08
  • 打赏
  • 举报
回复
你的逻辑不对,应该是STM写完flash告诉PC机你继续发,不该告诉PC机你先不要发。
xqhrs232 2013-12-08
  • 打赏
  • 举报
回复
玩的这么牛!

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧