国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

如何使用STM32的USB非控制端點發送多個數據包

發布時間:2009-11-25 18:06    發布者:STM32
關鍵詞: USB , 端點 , 數據
以下是網友提出的問題和我對這個問題的說明。

SMT32F103,根據例程Custom_HID修改,利用EP1 以EP_INTERRUPT 的方式發送包,原來的例程每次發送2個字節,現在修改后包的長度不超過64字節時發送是正常的,但當一個包長超過64字節時就發送失敗,沒有數據出來(程序沒有死機),該改的地方都已經修改了,不知道哪個地方還沒有改到位,謝謝!

現象就是 超過63字節的包死活也發不出去,而且發送包的大小 還與 CustomHID_ConfigDescriptor里面的 EP1 IN endpoint 描述里包大小有關 ,沒道理啊,其他的MCU 這地方設置為8 照樣發送256B 以上的包。

在Custom_HID例程上修改了如下代碼:
1.usb_proc.c 的CustomHID_Reset()里  SetEPTxCount(ENDP1, 64);
2.關閉 DMA中斷,不讓ADC采樣后發送EP1包
3.在main.c里 重復發送一個128B的包,
   while(1){
    for(i=0;i<2;i++)
       { SetEPTxAddr(ENDP1, ENDP1_TXADDR+i*64);
      SetEPTxValid(ENDP1);   
       Delay(10000);      
        }
     }      
4. 由于一個包是128B,最大包長是64B,所以分兩次發送出來,奇怪的是所有例程發送包時都沒有查發送狀態的處理,也沒有找到相應的狀態等待函數,這樣的話,是不是出現第一個包還沒有發送完,第二個包就沖掉了第一個包的數據?
5. 所以問題很簡單,就是如何發送一個多數據包,發送函數要如何寫?

以下是關于這個問題的解答:
分兩次發送是對的,但關鍵是每次發送前需要檢查上次發送是否完成。

檢查一個端點的發送是否結束有2種方法,第一種方法是當發送結束(設備收到ACK)時,有一個發送結束中斷,這個中斷由USB庫處理,并通過EP1_IN_Callback這個回調函數交由用戶程序確認,你可以搜索一下,例子中把EP1_IN_Callback定義為NOP_Process,沒有處理這個回調事件。如果要用這種方法檢測端點發送結束,你需要自己定義回調函數并做相應處理。

檢測端點發送結束的另一個方法是查詢這個端點的狀態,如果端點狀態處于EP_TX_VALID,說明發送未結束,如果端點狀態處于EP_TX_NAK,說明發送結束。使用下述調用可以得到端點1的發送狀態:
   GetEPTxStatus(ENDP1)

按照你的思路,可以使用第二種方法實現發送多個數據包的功能。

假定要發送150個字節的MyBuffer,EP1的最大包長設為64字節。

u8 MyBuffer[150];
int packetN;
packetN = 3;
while (1) {
   if (packetN < 3) { // 有數據需要發送時置packetN為'0'
     if (GetEPTxStatus(ENDP1) == EP_TX_NAK) {
       if (packetN == 0) { // 拷貝頭64字節到發送緩沖區
         UserToPMABufferCopy(MyBuffer, ENDP1_TXADDR, 64);
         SetEPTxCount(ENDP1, 64);
       }
       else if (packetN == 1) { // 拷貝第2個64字節到發送緩沖區
         UserToPMABufferCopy(MyBuffer+64, ENDP1_TXADDR, 64);
         SetEPTxCount(ENDP1, 64);
       }
       else if (packetN == 2) { // 拷貝最后22字節到發送緩沖區
         UserToPMABufferCopy(MyBuffer+128, ENDP1_TXADDR, 22);
         SetEPTxCount(ENDP1, 22);
       }
       packetN++;
       SetEPTxStatus(ENDP1, EP_TX_VALID);
     }
   }
   ...... // 其它操作
}

這里使用了一個變量記錄應該發送第幾個數據包,當程序的其它部分準備好數據后只要設置這個變量packetN=0,上述發送操作就會啟動,程序的其它部分只需檢測packetN==3即可知道MyBuffer是否已經騰空,程序的其它部分可以使用MyBuffer繼續其它操作,注意這時數據不一定已經全部發送完畢。

你的另一個問題在于這一行:SetEPTxAddr(ENDP1, ENDP1_TXADDR+i*64);

ENDP1_TXADDR是專門的發送緩沖區,它的長度是有限的,而且是每32位編址中只有低16位有效;所以需要使用函數UserToPMABufferCopy()操作這個發送緩沖區,這個函數已經在USB庫的手冊中說明。

最后一個問題是:如果你的程序中使用了ENDP1_RXADDR,因為你改變了ENDP1包的長度,即改變了發送緩沖區的長度,需要在usb_conf.h中重新定義以下ENDP1_RXADDR的地址。

最初發表日期:2008-8-29
本文地址:http://m.qingdxww.cn/thread-5775-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區

相關在線工具

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本免费黄色网址 | 青青草一区 | 91久久婷婷 | 欧美黄色tv| 国产精品亚洲专区在线观看 | 日本在线不卡视频 | 天天噜| 欧美成人全部视频 | 欧美一区二区三区视频在线观看 | 婷婷六月激情 | 欧美亚洲日本在线 | 亚洲国产精品激情在线观看 | 精品72久久久久久久中文字幕 | 在线成人97观看 | 国产热| 在线免费观看麻豆 | 亚洲国产片 | 99热在这里只有免费精品 | 中文字幕在线精品视频入口一区 | 神兵小将第一季免费播放 | 中文在线最新版天堂 | 亚洲国产精品欧美日韩一区二区 | 日韩 视频在线播放 | 亚洲福利天堂网福利在线观看 | 国产日韩欧美亚洲青青草原 | 免费视频精品一区二区 | 亚洲一区二区三区在线播放 | 亚洲免费视频播放 | 欧美成人久久久免费播放 | 两个人免费观看视频高清视频 | 99re热精品视频国产免费 | 牛牛色婷婷在线视频播放 | 国产理论在线观看 | 中国国产一级毛片视频 | 四虎国产精品永久地址99 | 欧美精品二区 | 久久福利资源站免费观看i 久久福利资源网站免费看 久久福利影院 | 999网| 婷婷色在线视频 | 日本亚洲天堂 | 幻女free性zozo |