IT技術互動交流平臺

CY68013FPGA通信聯調總結

來源:IT165收集  發布日期:2016-10-28 19:56:24

1. 簡介

CY68013是一款USB 2.0芯片,常用作fpga與pc的接口芯片,其硬件可以自動處理USB協議,也可以在里面下載對應的固件程序,由固件程序來完成USB協議的通信。我們只關心USB數據的傳輸,協議的不作深究,能用就行。

2. 開發

2.1 CY68013

2.1.1 CY68013資料摘抄

主要參考文檔:

參考文檔 描述
EZ-USB_TRM_001-13670_0E.pdf fx2的參考手冊,相當于UserGuide
CY7C68013A.pdf fx2的電氣特性,相當于DataSheet,slave fifo各個控制信號的時序圖在這份文檔中有寫
EZ-USB FX2單片機原理、編程及應用_錢峰編.pdf 實際上是TRM的翻譯,翻得通俗一點
AN61345.pdf Cypress 提供的 slave fifo的接口介紹,以及demo代碼的分析
圈圈教你玩USB.pdf 這個是一款飛利浦的USB PHY芯片的參考書,USB協議需要自己處理,有助于理解USB的專業術語的含義及協議

詳細摘抄

《EZ_USB FX2單片機原理、編程及應用 讀書筆記》
《FX2 TRM 摘抄》

其余相關的Cypress USB開發資料:
Cypress的開發環境:
cy3684_ez_usb_fx2lp_development_kit_15.exe
CySuiteUSB_3_4_4_B184.exe

一個是開發固件程序的,里面自帶了一個簡化版的Keil;另一個是開發上位機軟件的,還包含了Cypress默認的驅動程序、API庫等等。安裝的時候最好默認都安裝在C盤下,會省很多麻煩。

cy7c68013 實現slave fifo: AN61345 + 例程demo

AN63787 - EZ-USB® FX2LP GPIF and Slave FIFO Configuration Examples Using an 8-Bit Asynchronous Interface

AN58069 - Implementing an 8-Bit Parallel MPEG2-TS Interface Using Slave FIFO Mode in FX2LP

AN63620 - Configuring a Xilinx Spartan-3E FPGA Over USB Using EZ-USB FX2LP™

CrazyBingo系列:
Crazy Bingo CY68013開發例程
鏈接地址可能不準,直接百度即可,AET與非網上都有
(1)01:USB+FPGA攝像頭算法處理-持續更新中 http://blog.chinaaet.com/detail/34481.html
(2)02:CY7C68013特性介紹 http://blog.chinaaet.com/detail/34482.html
(3)03: CY7C68013A相關驅動版本說明 http://blog.chinaaet.com/detail/34483.html
(4)04: CY7C68013 Slave FIFO及PCB設計 http://blog.chinaaet.com/detail/34484.html
(5)05: CY3684 68013開發套件安裝指南 http://blog.chinaaet.com/detail/34485.html
(6)06: USB 68013驅動程序的安裝 http://blog.chinaaet.com/detail/34486.html
(7)07: USB68013 Driver數字證書一說 http://blog.chinaaet.com/detail/34487.html
(8)08: USB 68013 自定義VID&PID、版本、生廠商等信息 http://blog.chinaaet.com/detail/34488.html
(9)09: USB 68013調試工具的使用之CyConsole助手的使用 http://blog.chinaaet.com/detail/34489.html
(10)10: USB 68013調試工具的使用之Streamer USB傳輸測速 http://blog.chinaaet.com/detail/34490.html
(11)11: USB 68013調試開發之各種EEPROM下載處理辦法以及為什么??http://blog.chinaaet.com/detail/34534.html
(12)12:USB68013 Firmware開發指南之 CY3684固件例程分析 http://blog.chinaaet.com/detail/34534.html
(13)13:USB68013 Firmware開發指南之Keil UV4工程配置選項 http://blog.chinaaet.com/detail/34533.html
(14)14:USB68013 Firmware開發指南之8051 SFR寄存器說明 http://blog.chinaaet.com/detail/34534.html

2.1.2 Firmware開發

2.1.2.1 CY68013驅動安裝

Cypress提供了官方驅動,win7 x64 32都是支持的
安裝上驅動以后,可以使用庫函數來和fx2芯片進行通訊。
需要修改 cyusb.inf 文件來安裝對應的驅動

    ;for all platforms
    ;在這里增加對應的 VID 和 PID 設備
    [Device]
    %VID_XXXX&PID_XXXX.DeviceDesc%=CyUsb, USBVID_XXXX&PID_XXXX


    ;for windows 2000 non intel platforms
    [Device.NT]
    %VID_XXXX&PID_XXXX.DeviceDesc%=CyUsb, USBVID_XXXX&PID_XXXX


    ;for x86 platforms
    [Device.NTx86]
    %VID_XXXX&PID_XXXX.DeviceDesc%=CyUsb, USBVID_XXXX&PID_XXXX


    ;for x64 platforms
    [Device.NTamd64]
    %VID_XXXX&PID_XXXX.DeviceDesc%=CyUsb, USBVID_XXXX&PID_XXXX

    [Strings]
    ;在這里添加對應于自己的VID PID的描述
    CYUSB_Provider    = 'Cypress'
    CYUSB_Company     = 'Cypress Semiconductor Corporation'
    CYUSB_Description = 'Cypress Generic USB Driver'
    CYUSB_DisplayName = 'Cypress USB Generic'
    CYUSB_Install     = 'Cypress CYUSB Driver Installation Disk'
    VID_XXXX&PID_XXXX.DeviceDesc='Cypress USB Generic Driver (3.4.7.000)'
    CYUSB.GUID='{AE18AA60-7F6A-11d4-97DD-00010229B959}'
    CYUSB_Unused      = '.'

2.1.2.2 程序下載

Cypress 提供了開發工具包里的 CyConsoleCyUSB Center,可以用來下載程序
程序下載分兩種,

2.1.2.2.1 直接下載到RAM中運行

如果連接了eeprom,上電會從eeprom里面啟動,已經配置了寄存器;
啟動后再下載程序到RAM中運行,寄存器又被配置了一遍,但是這樣可能會受到第一次配置的影響,USB通信出現問題。
一般是用哪一位就配置哪一位,其余的寄存器的bit保留原值。

regVal |= bmBIT0;

這樣其余像 bit7->1 都是保留原值,可能會被第一次配置干擾。

爆出
error code 997,實際上是last error = 997

cy7c68013都搭配有eeprom,eeprom里面存的程序,上電啟動的時候,先把程序從eeprom加載到內部ram中,即0000-0x3FFF的區域,然后才開始運行;注意與USB相關的寄存器配置以及EP buffer都在上面0xE200-0xFFFF區域!!!這個區域不會有程序,也就是說程序下載的時候不會覆蓋到這片區域。初始程序啟動后,對usb相關寄存器進行了配置,然后連上usb,驅動配合腳本自動下載固件,這個固件被下載到0x0000-0x3FFF區域去執行,不會覆蓋0xE200-0xFFFF區域的USB急促安琪和EP buffers,下載期間不會斷電。新下載的固件啟動執行,對USB regs 和EP buffers進行操作,但是只是改變指定位的數據,其他設置保留eeprom中初始程序的USB寄存器設置,所以會發現,新固件的代碼功能并沒有提現出來或者說不正常!!! 直接把程序燒寫到eeprom就可以了!!!

2.1.2.2.2 下載到附帶配套的eeprom芯片里

上電從eeprom加載程序運行

下載程序到eeprom中造成USB通信異常的案例
① 現象描述:
一開始的時候,向CY68013的eepron里下載程序,能和pc通信上,只是數據有些不正常;
修改程序以后,重新下載程序到CY68013的eeprom中,再上電,pc提示無法識別的usb設備

無法識別的USB設備

設備管理器上顯示 unknown device
設備管理器顯示

VID / PID 都沒有顯示
設備管理器查看VID PID
usb根本沒有通信上!!!!

解決辦法
推測原因
最后一個版本的程序下載進去有問題,即eeprom里的程序有問題,
然后又每次是通過eeprom來啟動,
加載程序運行,然后每次枚舉都不成功,所以顯示未知設備

最關鍵的是要擦除eeprom里的原程序,然后更新為新程序即可。

還好,在Crazy Bingo的博客上找到了解決方案:
http://blog.chinaaet.com/crazybingo/p/34531
CrazyBingo CY68013 eeprom設計QTI1NikuPC9zdHJvbmc+PGJyIC8+CglFRVBST01zIHdpdGggZGVuc2l0aWVzIHVwIHRvIDI1NiBieXRlcyByZXF1aXJlIG9ubHkgYSBzaW5nbGUgYWRkcmVzcyBieXRlOyBsYXJnZXIgRUVQUk9NcyByZXF1aXJlIHR3byBhZGRyZXNzIGJ5dGVzLiBUaGUgRVotVVNCIG11c3QgZGV0ZXJtaW5lIHdoaWNoIEVFUFJPTSB0eXBlIGlzIGNvbm5lY3RlZCAmbWRhc2g7IG9uZSBvciB0d28gYWRkcmVzcyBieXRlcyAmbWRhc2g7IHNvIHRoYXQgaXQgY2FuIHByb3Blcmx5IHJlYWQgdGhlIEVFUFJPTS48L3A+Cgk8cD5UaGUgRVotVVNCIHVzZXMgdGhlIEVFUFJPTSBkZXZpY2UtYWRkcmVzcyBwaW5zIEEyLCBBMSwgYW5kIEEwIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNlbmQgb3V0IG9uZSBvciB0d28gYnl0ZXMgb2YgYWRkcmVzcy4gQXMgc2hvd24gaW4gVGFibGUgMTMtMTEsIHNpbmdsZSBieXRlIGFkZHJlc3MgRUVQUk9NcyBtdXN0IGJlIHN0cmFwcGVkIHRvIGFkZHJlc3MgMDAwLCA8c3Ryb25nPndoaWxlIGRvdWJsZSBieXRlIGFkZHJlc3MgRUVQUk9NcyBtdXN0IGJlIHN0cmFwcGVkIHRvIGFkZHJlc3MgMDAxLjwvc3Ryb25nPjwvcD4KPC9ibG9ja3F1b3RlPgo8cD48aW1nIGFsdD0="CY68013 TRM eeprom配置說明" src="http://www.bjxfcs.com/uploadfile/files/2016/1028/20161028192145347.png" title=""http://www.bjxfcs.com/pro/pkqt/" target="_blank" class="keylink">QTIsQTEsQTC+zcrH08PAtMXk1sO12Na3tcSjrDxzdHJvbmc+tvhmeDLWu8jPIDAwMSC1xLXY1rejrDwvc3Ryb25nPjxiciAvPgo8c3Ryb25nPta70qq4xLHkwctlZXByb221xLXY1rejrGVlcHJvbb7Nu+HKp9Cno6xmeDK+zc7et6i002VlcHJvbbzT1NizzNDyo6zWu8Tc07K8/rvYuLR1c2LH68fzPC9zdHJvbmc+PC9wPgo8cD48ZW0+MaOpz8i2zMK3SjEzo6zKubXDQTCx5LXNPC9lbT48YnIgLz4KPGVtPjKjqXVzYsGsvdO1vXBjo6y87LLitb11c2LJ6LG4o6zH/bavzt63qNfUtq+wstewPC9lbT48YnIgLz4KPGVtPjOjqcrWtq+wstewttTTprXEY3lwcmVzcyB1c2LH/bavPC9lbT48YnIgLz4KPGVtPjSjqbbPv6pKMTOjrMq5QTCx5LjftefGvTwvZW0+PGJyIC8+CjxlbT41o6m08r+qQ3lDb25zb2xlo6zPwtTYs8zQ8rW9ZWVwcm9to6xva6OsdXNizajQxbvWuLQ8L2VtPjwvcD4KPGg0IGlkPQ=="2123-a51文件的作用">2.1.2.3 .a51文件的作用

注意,.a51的文件描述符是用來上報給pc機的,用庫函數獲取到的描述符都是從這個.a51里來的
相當于這個文件決定了跟pc報告說我有哪些端點,以及端點的大小
.a51文件必須和fx2真正在運行時配置的端點一致才可以,否則會造成,上位機調用庫函數和fx2通訊不上

HighSpeedConfigDscr里面需要改成4個端點的,而且下面要寫4個端點的描述符!!
.a51配置

2.1.2.4 Max PktSize含義

最大只能發這么多

端點大小 和 Max PktSize是不一樣的
端點大小是緩存區的大小,2和6可以配置為512 和 1024兩種
4 和 8就只能配置為512

Max PktSize可以設置為64,最大usb包長為64

2.1.2.5 芯片沒辦法軟件復位!!!!

如果端點fifo滿了,仍舊連續發送,芯片會掛點,軟件復位沒有用,必須重新上電,hard reset!!!
清空FIFO,在TD_Poll()中進行FIFO_RESET,嚴格來說是在outpkt_end后進行FIFO_RESET,然后再bulkout就失敗了!!!!不知道什么原因!!!

    //FIFO復位
    SYNCDELAY;
    FIFORESET = 0x80;             // activate NAK-ALL to avoid race conditions
    SYNCDELAY;                    // see TRM section 15.14
    FIFORESET = 0x02;             // reset, FIFO 2
    SYNCDELAY;                    //
    FIFORESET = 0x04;             // reset, FIFO 4
    SYNCDELAY;                    //
    FIFORESET = 0x06;             // reset, FIFO 6
    SYNCDELAY;                    //
    FIFORESET = 0x08;             // reset, FIFO 8
    SYNCDELAY;                    //
    FIFORESET = 0x00;             // deactivate NAK-ALL
    SYNCDELAY;                    //


    //清空usb殘留,不讓usb殘留提交到slave fifo接口處
    //這樣fpga端在接收的時候不會收到亂七八糟的數據
    //加了下面這幾句話,再在這個后面執行FIFORESET就不能bulkout了,不知為何
    OUTPKTEND = 0x82; // Arm both EP2 buffers to 'prime the pump'
    SYNCDELAY;
    OUTPKTEND = 0x82;
    SYNCDELAY;
    OUTPKTEND = 0x84;
    SYNCDELAY;
    OUTPKTEND = 0x84;
    SYNCDELAY;

上下兩段換一下先OUTPKTEND 然后再 FIFORESET就會出現上面說的問題

2.2 fpga

2.2.1 slve fifo 接口控制通訊

參考文檔:

AN61345.pdf
CY69013A.pdf

截圖全部取自CY7C68013A的datasheet,不是TRM,TRM里面沒有標出來時間
IFCLK是fx2輸入腳的IFCLK,確實是上升沿去采樣的,

2.2.1.1 基本連接



2.2.1.2 時序分析

這里只采用同步讀寫的方式!!!
讀:



ToeOn 以后的數據才是有效的數據。

寫:


最壞情況下,寫入以后,滿的FLAGS需要13.5ns才能出來,超過周期的一半了,得等到下降沿以后才能檢測到IN FIFO滿

2.2.1 實驗調試經歷

2.2.1.1 stream_in

2.2.1.1.1 上電后fpga發送了很多0x00回來

PC端從USB處收到很多的0x00
一開始以為是fifo里面有緩存,而且因為配置的是512 x4大小,所以收到了512 x4的 0x00 實際上是fpga實際一直控制在寫00 00
用萬用表來測量fx2的slwr腳一直顯示為0V!!!
后來發現,fpga管腳鎖錯了!!!!!!沒有把slwr腳鎖到對應的fx2的slwr腳,造成了slave fifo的異常寫入
心中千萬只草泥馬呼嘯而過………………

2.2.1.1.2 fpga的短包發送出現問題

發送短包要拉低pkt_end信號腳,但什么時候拉低,某不知名網友說:

pkt_end <= slwr_n

然而,

pkt_end <= slwr_n 處理短包,結果不對,完全不對!!!

才發到001D,就寫了0x1D個數,flagd就拉低了,顯示fifo滿了,但是fifo可是512bytes x4大小的!!!

嘗試pkt_end <= ‘1’; 每次等齊512字節自動發送的話,這樣子,flagd就是正常的。
估計是pkt_end的操作有問題

重新翻看時序圖:

短包發送時序圖

還有TRM里的一句說明

then pulse the PKTEND pin,就是slwr_n寫到fifo里面,然后都結束了,再拉低PKTEND一個周期就可以了。

修改后重新下載,實驗結果符合預期,能夠正常收到短包數據,每次7個16bit數據;
Bulk in failed是故意嘗試只讓fpga發一次,pc機上請求讀取兩次中的第二次,返回失敗是正常的,因為fifo里確實沒有數據了。

另外注意一點,EP6FIFOCNT看起來一直為0,實際上含義不一樣,只要pkt_end以后,EP6FIFOCNT就會被清0,說這些數據已經被打包出去了,但是實際還是占用空間的,FIFO的flag該是Full還是full,所以會出現EP6 為Full,但是EP6FIFOCNT= 0。

超過512bytes用pktend發送出現問題:
開啟短包發送,但是fpga發送超過512字節給pc的時候出現問題,會收到兩個512字節數據,后面的512字節是一串亂碼
原因:
fx2程序中開了autoin,然后fpga發送端又有pkt_end拉低一個周期造成的矛盾,到了512字節已經autoin發送了,然后由pkt_end發送一遍,第二遍的時候發送的不知道是什么數據

2.2.1.2 stream_out

2.2.1.3 bulk_loopback

配置情況
fpga內配置1024 x16bit的fifo
fx2 配置為
EP2OUT 512 x4
EP6IN 512 x4

連續發9個512byte過去,然后收到的數據并不完整,收到第5包,后面的數據就沒有了(工程關閉ep6 autoin,無論是長包還是短包,都是用pkt_end來驅動發送的)
ep6fifocnt 一直為2
通過chipscope觀察,發現死在了read_sig狀態
qqGjPC9zdHJvbmc+PC9wPgo8cD7Q3tX9uvOjrNa7xNy2wbW9N7D8yv2+3aOs1+6688G9uPbK/bu5sru21KOsseSzycHLMDg8YnIgLz4KPGltZyBhbHQ9"" src="http://www.bjxfcs.com/uploadfile/files/2016/1028/20161028192147372.png" title="" />

發現第7包的前兩個字節會丟
在第七包只發了兩個字節4C4B的情況下,什么也收不到
chipscope

dout能看到有4C4B說明確實這個值是寫入到fpga的fifo中的,但是從fifo中讀出然后寫入到fx2的slave fifo中是有問題的。

關鍵的關鍵是,EP6IN fifo滿的時候,按照檢測flagd然后控制rden,又由fifo返回的valid信號來驅動slwr_n, 就會造成少寫入一個數據到EPIN6 FIFO里面,但是這個數據已經從fpga內部fifo中讀出來了,就造成了丟失一個數據。歸根到底,是因為valid信號和rd_en信號有一個時鐘周期的延時。
為了彌補這一個數據,需要在fx2中設置EP IN full的標志位提前一個單位告知FIFO FULL,
EP6FIFOCFG = 0x41; // AUTOIN=0, WORDWIDE=1 , ZEROLENIN=0, INFM1 = 1,這樣就不會漏數據了。

數據通路分析:
EP2OUT 到 fpga內部fifo:
在往fpga內部fifo寫的時候,fpga內部fifo會提前一個單元給出fifo滿信號,這樣會導致有一個單元的數據,這里對應2bytes數據,殘留在EPOUT FIFO中,得等到pc把EPIN fifo的數據讀掉一些,然后fpga內部fifo釋放出來一些空間,才會把EPOUT的殘留數據讀出來寫入fpga內部fifo。但是這個并不影響最終pc接收的情況,因為看起來還是和原來一樣512bytes取出來。

fpga內部fifo 到EP6IN:
就是前面關鍵的關鍵分析的

2.2.2 fpga小技巧

2.2.2.1 同步電路外面加一層邏輯電路保護,保證不會誤讀出來然后沒人接收

2.2.2.2 inout口處理

fdata_in專門用作輸入,真實值 或者 0
data_out專門用作輸出,真實值 或者 0

    --fdata_in作為輸入
    process (sloe)
    begin
        if (sloe)               --輸入
            fdata_in <= fdata;
        else
            fdata_in <= conv(0, 16);
        end if;
    end process;
    data <= fdata_in            --以后輸入就從fdata_in去取就行

    --data_out作為輸出
    process (sloe)
    begin
        if (sloe = '0')             --輸出
            fdata <= data_out;
        else
            fdata <= (whenothers=>'z');
        end if;
    end process;

    data_out <= 'xxxxxxxxxx';   --以后輸出都給到data_out就行  

2.2.2.3 高低字節序

從pc到fpga:

fpga fifo
din 16
dout 64

din 按順序寫入0xabcd, 0xefgh,0xijkl, 0xmnop
dout 0xabcd_efgh_ijkl_mnop (即先存入的為高16bit)

一個數 Num = 0x0102030405060708;
全部是以高字節在高地址來畫的表格,字節數變大時間在后

路徑 byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7
inbuf 0x08 0x07 0x06 0x05 0x04 0x03 0x02 0x01
slave fifo dout 16bit 0x08 0x07 0x06 0x05 0x04 0x03 0x02 0x01
fpga fifo din 16bit 0x08 0x07 0x06 0x05 0x04 0x03 0x02 0x01
fpga fifo dout 64bit 0x02 0x01 0x04 0x03 0x06 0x05 0x08 0x07

讀出來 Num2 = 0x0708050603040102

Num2 和 Num1 的關系為,高低字節倒序排列,然后每16bit內部兩字節交換。
想要輸入Num 和 讀出來的 Num2相等,
必須先對 Num 作 高低字節倒序排列,然后每16bit內部兩字節交換

從fpga 到 pc

fpga fifo
din 32
dout 16

din 0xab_cd_ef_gh
dout 按順序讀出 0xabcd, 0xefgh

同理的,reg fifo out dout為32位, Num = 0x05060708;
byte3為最高字節

路徑 byte0 byte1 byte2 byte3
reg fifo out din 32bit 0x08 0x07 0x06 0x05
reg fifo out dout 16bit 0x06 0x05 0x08 0x07
slave fifo dout 0x06 0x05 0x08 0x07
outbuf 0x06 0x05 0x08 0x07

Num2 = 0x07080506

2.2.2.4 用modelsim仿真的時候會出現紅色線段

紅色線段表示非穩定狀態,數值狀態為未知,可能的原因如下
① 信號未賦予初始值
② inout口處理不當,兩端同時進行out輸出造成不穩定狀態

2.2.2.5 chipscope無法捕獲信號

停留在轉圈圈的狀態,提示 waiting for core to be armed,slow or stopped clock

這個問題肯定是因為輸給chipscope的時鐘沒有跑起來!!!
有一些復位信號的原因,外部復位信號沒有鎖定也沒有賦值,可能就接到pll的rst上,導致一直在復位,時鐘就沒有跑起來

時鐘最好從pll的bufg之后接到chipscope上!!!

奇奇葩葩的問題:
今天碰到一個很奇怪的現象,原來的工程死活就不行,fpga程序一燒進去,就收到一大坨數據,EP6直接滿了,EP8也有數據,特別奇怪!!!后來換了一個工程就好了

2.3 上位機

2.3.1 開發環境配置

fx2上位機開發 vs2013配置1

fx2上位機開發 vs2013配置2

剩下的就是

#include 'CyAPI.h'

就可以使用了

2.3.2 Cypress 庫函數的使用

Cypress C++庫函數參考文檔

CyAPI.pdf

主要函數

2.3.2.1 open()
    Example
    CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);
    // Attempt to open device #0
    if (USBDevice->DeviceCount() && !USBDevice->Open(0)) {
    USBDevice->Reset();
    USBDevice->Open(0);
    }
2.3.2.2 EndPointOf( )
    Example
    UCHAR eptAddr = 0x82;
    CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);
    CCyUSBEndPoint *EndPt = USBDevice->EndPointOf(eptAddr);
    if (EndPt) EndPt->Reset( );
2.3.2.3 XferData( )

這個函數 IN 和 OUT端點都可以用的, bulkin的話就是接收,bulkout就是發送

    Example
    CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL);
    unsigned char buf[] = 'hello world';
    LONG length = 11;
    if (USBDevice->BulkOutEndPt)
    USBDevice->BulkOutEndPt->XferData(buf, length);

2.3.2 調試

1)控制端點操作不成功

一個是因為地址不對,另一個是因為長度不對,length必須是LONG,然后如果有連續的函數套用,必須把長度設成可更改的引用,LONG &lenth,否則會返回失敗。

2)上位機短包發送限制

每一個短包實際上占用了一個buffer緩沖,512x4 16bit的端點配置,一共就只能發送4次短包就會滿
如下圖所示:

每次發送12字節,只能發送4次,再發送就失敗了!!!!
而且一旦出現發送失敗,無論是軟件復位還是其他什么的都不好使!!!必須重新上電才可以!!!

3)大小端順序

要注意,無論是發還是收,都是小端序。
PC機先發0x03,再發0x04, 在slave_fifo里讀出來是0x0403
另外pc機內部于是小端序,所以

u8 outbuf[2];
*(u16*)&(outbuf[0]) = 0x0403;          //outbuf[0]= 0x03, outbuf[1]= 0x04

然后outbuf發送,在fpga端收到的就是0x0403,正好和發送的時候的數據是一樣的!!!

fpga發送 0x0304, pc上先收到0x04,后收到0x03

    u8 inbuf[2];
    regVal = *(u16*)&(inbuf[0]);    //inbuf[0]= 0x04, inbuf[1]= 0x03; regVal = 0x0304

3. 核心代碼

==It’s a secret!!!==

延伸閱讀:

  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
香港最快开奖现场直播结果