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