[CY7C68013]調試過程中遇到的問題和心得


     第一次玩博客也不知道該寫什么,正好這幾天在折騰一塊USB數據采集板的程序,那就寫一下最近調試CY7C68013遇到的一些問題吧。

     自己做了一塊GPS中頻數據采集板,CY7C68013的作用就是把AD采樣后的GPS中頻數據通過USB傳給PC,大致結構是這樣的:

     MAX2769(GPS射頻前端芯片,包括2bit的ADC)    ->    EP2C5T144(FPGA,外掛了一片512KBYTE的SRAM)   ->    CY7C68013

     由於是第一次用CY7C68013,調試花了很長的時間(盡管代碼很少),每當芯片工作不正常時,只能通過極少的信息去猜測問題原因。

     在這個設計中,我最初采用了SLAVE FIFO模式下同步寫的方式傳輸數據(AUTOIN),由FPGA提供時鍾IFCLK,BULK傳輸,

     我第一個遇到的問題是AUTOIN模式沒有開啟,現象是當FIFO FULL信號(FLAGB拉低)有效后除非我復位FIFO,不然FIFO一直保持FULL狀態,上位機程序讀不到任何數據,因此我認為芯片在FIFO寫滿后沒有打包發送出去,這也說明AUTOIN沒有啟動。由於AUTOIN是通過EPXFIFOCFG設置的,EP2FIFOCFG = EP2FIFOCFG | 0x08 (在這里我用的是端點2),為了進一步驗證我的猜測,我在BOOL DR_VendorCmnd(void)函數里里加了一個寄存器讀寫的Vendor Request,代碼如下:

 1     switch(SETUPDAT[1]){
 2          case ...:
 3             ...; break;
 4 
 5         case VR_REG_WR: 
 6             index = SETUPDAT[4];    
 7             index |= SETUPDAT[5] << 8;
 8             EP0BCH = 0;
 9             EP0BCL = 0;
10             while(EP0CS & bmEPBUSY);
11             valueL = *EP0BUF;
12             valueL |= *(EP0BUF+1) << 8;
13             value = *(EP0BUF+2);
14             value |= *(EP0BUF+3) << 8;             
15 
16             writeReg(index, value, valueL); 
17             EP0CS |= bmHSNAK; 
18             break;        
19             
20         case VR_REG_RD:
21             index = SETUPDAT[4];                
22             index |= SETUPDAT[5] << 8;   
23             value = readReg(index);
24             *EP0BUF = value & 0x00FF;
25             *(EP0BUF+1) = value >> 8; 
26             EP0BCH = 0;
27             EP0BCL = 2; // Arm endpoint with # bytes to transfer  
28             EP0CS |= bmHSNAK;
29             break;
30 
31         case ...:
32             ...; break;
33    }

        writeReg和readReg這兩個函數要做的事情及時讀寫寄存器或變量,這樣就可以通過自己的上位機程序觀察CY7C68013的寄存器了。在完成這一步之后,就可以觀察EP2FIFOCFG這個寄存器了,結果發現AUTOIN真的沒有被啟動,即EP2FIFOCFG的bit4沒有被置位。這個問題很奇怪,就算是復制官方的參考初始化代碼也不行,另外跟FIFO功能有關的EPxFIFOFLGS寄存器也不能被設置,即寫寄存器后馬上讀出來發現寄存器值未變,但是IFCONFIG和EP2CFG這兩個寄存器是可以被修改的。接下來我注意到一個問題,在板子上電之后,如果先配置FPGA(此時FPGA已經開始輸出IFCLK)后下載固件則會出現上述問題,而先下載CY7C68013固件再配置FPGA就能夠正常傳輸數據。注意到IFCLK的這個情況后,我修改了FPGA的代碼,在CY7C68013發出開始傳輸指令(一個PIN上出現下降沿)之前FPGA不會輸出IFCLK,這樣在兩種配置順序下都可以正常傳輸了。

       導致這個問題的真正原因我還不知道,或許是代碼還存在問題,也可能是芯片BUG(說不定買到了次品),總之外部IFCLK輸入很有可能導致芯片工作異常。

       現在我已經改用了異步寫FIFO方式,FPGA代碼改動不大,同時也避開了IFCLK的問題(折騰了一周,真心怕了...)。

        接下來再說一個粗心導致的錯誤。在CY7C68013初始化的時候,我不小心將:

1     EP2AUTOINLENH = 0x02;
2     SYNCDELAY;
3     EP2AUTOINLENL = 0x00;
4     SYNCDELAY;

       錯寫成:

1     EP2AUTOINLENH = 0x02;
2     SYNCDELAY;
3     EP2AUTOINLENH = 0x00;
4     SYNCDELAY;

        又因為芯片默認ZEROLENIN是開啟的(在EP2FIFOCFG里設置),導致我的PC程序一直讀到空包。

        另外,由於我將FIFO的SLWR信號的極性弄反了,同樣導致了一個現象很奇怪的錯誤。芯片上初始化后FIFO非滿(FLAGB高),然后我用錯誤的SLWR信號“寫滿”了FIFO(FLAGB置低),在我確定已經開啟了AUTOIN的情況下,芯片不會自動打包發送,並且FLAGB會一直保持低電平(就算是重置FIFO也不行,除非板子重新上電)。

        總之折騰手上這片CY7C68013花了太多時間,調試方式的限制以及出現錯誤時會出現各種奇怪的現象,讓我的調試過程很痛苦。。。。

        玩這個芯片要注意,雖然固件代碼很簡單很少,但是弄錯一點細節都會導致很奇怪的現象出現。。。。

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM