第一次玩博客也不知道該寫什么,正好這幾天在折騰一塊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花了太多時間,調試方式的限制以及出現錯誤時會出現各種奇怪的現象,讓我的調試過程很痛苦。。。。
玩這個芯片要注意,雖然固件代碼很簡單很少,但是弄錯一點細節都會導致很奇怪的現象出現。。。。