python2 python3 通信_python与USB通信
Date
周三 04 十一月 2015
Tags
USB
/
Python
PyUSB依賴于一些USB的驅動程序, 這個貌似叫做無驅驅動, 其中libusb是一統天下者, 當然就要用這個咯. 那么問題來了, libusb這個驅動是怎么裝到要開發的設備上呢? 在windows下答案是Zadig, 這個和rtlsdr用的方案是一致的.
下載了最新的Zadig然后選list all device, 可選擇的列表里只有WinUSB(這是微軟的吧?), libusbk(貴圈好亂), libusb-win32. libusb官網不是說和libusb-win32合并了么? 好吧, 只有選這個了. 但這個相當于libusb 0.1版本的, 估計和OS有關, 我是老邁的xp.
裝上后, 給Python裝上PyUSB(官網下載后, 按里面說明裝),
import usb
usb.core.show_devices()
呵呵~好簡單~ PyUSB教程, 文檔: 建一個bat文件 pydoc -b 運行, 然后在瀏覽器里找到usb這個package的幫助.
接下來搞PC-FX2-FPGA的Loopback, 悲劇, 在用device那個類的write方法給端點寫數據時, 很是詭異, 各種錯, 但按照AN61345中描述的用Control Center收發一個文件數據的方法, 工作正常, 經仔細思考, 可能有以下層面問題:
Cypress的FX2LP 工作在slave FIFO + 自動發包模式時, 在向上位機機發送時, 沒滿一個包是不會發的, 因此數數很重要, 數不對就等著timeout吧.
FPGA部分copy的Cypress的AN61345, 自己只是寫了個簡單的testbench玩了一下, 與其說是驗證功能, 不如說是我學習它的工作原理.
cy7c68013a FW bug, 這個也是copy的AN61345.
PyUSB坑爹 or Python代碼問題.
硬件錯誤.
于是為了簡化問題, 上邏輯分析儀, 另外把這個打包的大小改小. 于是我查了 USB Spec 2.0 5.8.3 Bulk Transfer Packet Size Constraints, 并沒有直說不能設小, 那就沒問題咯, 于是在FX2中改了AUTOINLEN寄存器(slave.c)和Endpoint Descriptor(dscr.asm) 為2B, 嘗試python繼續各種錯, 邏輯分析儀一看, 這是啥情況?
解釋: Channel0 為clk, 10M, 由于采樣率不夠(?)的原因, 因此看起來奇怪, slrd與sloe拉低(有效)是因為看到FLAG A, 也就是EP2 EF(Empty Flag)拉高(不是Empty了), 這是應從FX2讀入fpga的FIFO, 讀完后由于FLAG A回到低, 此時應是從FPGA的FIFO到FX2, 可以看到FIFOADD選擇了EP6, FLAG B是EP6的FF(Full Flag), 高意思是現在不是滿的, 可以寫. 但此時slwr應該拉低才對啊?
發2 word時, slwr工作正常. 但是, 細節圖:
只寫了一個word(上升沿寫入). 為毛少一個?
糾結一段時間后終于找到問題, 而且是通過fpga的testbench找到的, 在看cy7c68013a的datasheet時, Slave FIFO Synchronous Write的那個圖給了我靈感, 在數據讀出后, Flag(由FX2驅動)會改變狀態, 這個時間是tXFLG, 最大10ns. 于是我在isim里試了一下, 悲劇. 1個word.
2個word, 少發一個. SLWR也只有一個.
always@(*)begin
if((current_loop_back_state == loop_back_read) & (flag_ef == 1'b1))begin
slrd_n = 1'b0;
sloe_n = 1'b0;
end else begin
slrd_n = 1'b1;
sloe_n = 1'b1;
end
end
always@(*) begin
...
loop_back_read:begin
if(flag_ef == 1'b0)
next_loop_back_state = loop_back_wait_flag_ff;
else
next_loop_back_state = loop_back_read;
end
...
問題代碼, 這樣子生成的組合邏輯, 只要FLAG EF是1, 就會讓slrd和sloe拉低. 且會轉換狀態為wait_flag_ff. 也就是說會在FIFO鎖存數據的同時轉換狀態, 則應是存在一個競爭關系. 于是我把slrd和sloe換為鐘控.
搞定.
實測1個word.
后來又發現傳輸數據時, 多向FPGA內的FIFO寫一個數據, 在和Cypress的例程戰斗了一段時間后, 我最終放棄了, 自己寫了一個狀態機, 加一個Xilinx的FIFO IP, 搞定.
全對. :)
接下來實現了從FPGA發送數據到Python.
Python顯示實時數據的框架由之前在python下實時顯示麥克風波形與頻譜提供. 將數據源從pyaudio換為PyUSB, 搞定.
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python2 python3 通信_python与USB通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑生成siri语音_米家智能台灯1S全
- 下一篇: python安装路径查看_查看pytho