CH376S+SPI+C8051F 初始化失敗

初始化返回值是FA,代表啥意思?謝謝!


熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

初始化返回0xfa,說明硬件連接或者讀寫時序有問題。CH376上電之后先延時50ms在操作。


我又檢查了一遍,還是返回FA,ACT引腳的LED也沒有亮。C8051f這個SoC是有SPI的硬件接口的,我更該過的SPI_HW.C如下: 煩請指點,謝謝!

/* 提供I/O接口子程序 */

//#include "HAL.H"

/* 本例中的硬件連接方式如下(實際應用電路可以參照修改下述定義及子程序) */ /* 單片機的引腳 CH376芯片的引腳 AT89S5X C8051F020 CH376S GPIO P1.4 --> P05 NSS -X-> SCS MOSI P1.5 --> P04 MOSI --> SDI MISO P1.6 --> P03 MISO --> SDO SCK P1.7 --> P02 SCK --> SCK */ sbit P17 = P1^7; sbit P03 = P0^3; #define CH376_SPI_SCS P17 /* 假定CH376的SCS引腳 */ #define CH376_SPI_SDO P03 /* 假定CH376的SDO引腳 */ /*#define CH376_SPI_BZ P10*/ /* 假定CH376的BZ引腳 */

//sfr SPDR = 0x86; /* SPI數(shù)據(jù)寄存器 */ //sfr SPSR = 0xAA; /* SPI狀態(tài)寄存器 */ //sfr SPCR = 0xD5; /* SPI控制寄存器 */ #define SPI_IF_TRANS 0x80 /* SPI字節(jié)傳輸完成標志,在SPSR的位7 */

//#define CH376_INT_WIRE INT0 /* 假定CH376的INT#引腳,如果未連接那么也可以通過查詢兼做中斷輸出的SDO引腳狀態(tài)實現(xiàn) */

void CH376_PORT_INIT( void ) /* 由于使用SPI讀寫時序,所以進行初始化 */ { /* 如果是硬件SPI接口,那么可使用mode3(CPOL=1&CPHA=1)或mode0(CPOL=0&CPHA=0),CH376在時鐘上升沿采樣輸入,下降沿輸出,數(shù)據(jù)位是高位在前 */ CH376_SPI_SCS = 1; /* 禁止SPI片選 */ /* 對于雙向I/O引腳模擬SPI接口,那么必須在此設(shè)置SPI_SCS,SPI_SCK,SPI_SDI為輸出方向,SPI_SDO為輸入方向 */ // SPCR = 0x5C; /* 設(shè)置SPI模式3, DORD=0(MSB first), CPOL=1, CPHA=1, CH376也支持SPI模式0 */ }

void mDelay0_5uS( void ) /* 至少延時0.5uS,根據(jù)單片機主頻調(diào)整 */ {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }

UINT8 Spi376Exchange( UINT8 d ) /* 硬件SPI輸出且輸入8個位數(shù)據(jù) */ { /* 為了提高速度,可以將該子程序做成宏以減少子程序調(diào)用層次 */ // SPDR = d; /* 先將數(shù)據(jù)寫入SPI數(shù)據(jù)寄存器,然后查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成 */ // while ( ( SPSR & SPI_IF_TRANS ) == 0 ); /* 查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成 */ // SPSR &= ~ SPI_IF_TRANS; /* 清除SPI字節(jié)傳輸完成標志,有的單片機會自動清除 */ // return( SPDR ); /* 先查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成,然后從SPI數(shù)據(jù)寄存器讀出數(shù)據(jù) */

SPIF = 0; //SPIF 位清零 SPI0DAT = d; //啟動一次數(shù)據(jù)接收 while(SPIF == 0); //等待數(shù)據(jù)接收完畢 return SPI0DAT; //讀取SPI接收到的數(shù)據(jù) }

#define xEndCH376Cmd( ) { CH376_SPI_SCS = 1; } /* SPI片選無效,結(jié)束CH376命令,僅用于SPI接口方式 */

void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376寫命令 */ { #ifdef CH376_SPI_BZ UINT8 i; #endif CH376_SPI_SCS = 1; /* 防止之前未通過xEndCH376Cmd禁止SPI片選 */ /* 對于雙向I/O引腳模擬SPI接口,那么必須確保已經(jīng)設(shè)置SPI_SCS,SPI_SCK,SPI_SDI為輸出方向,SPI_SDO為輸入方向 */ CH376_SPI_SCS = 0; /* SPI片選有效 */ Spi376Exchange( mCmd ); /* 發(fā)出命令碼 */ #ifdef CH376_SPI_BZ for ( i = 30; i != 0 && CH376_SPI_BZ; -- i ); /* SPI忙狀態(tài)查詢,等待CH376不忙,或者下面一行的延時1.5uS代替 */ #else mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( ); /* 延時1.5uS確保讀寫周期大于1.5uS,或者用上面一行的狀態(tài)查詢代替 */ #endif }

#ifdef FOR_LOW_SPEED_MCU /* 不需要延時 */ #define xWriteCH376Data( d ) { Spi376Exchange( d ); } /* 向CH376寫數(shù)據(jù) */ #define xReadCH376Data( ) ( Spi376Exchange( 0xFF ) ) /* 從CH376讀數(shù)據(jù) */ #else void xWriteCH376Data( UINT8 mData ) /* 向CH376寫數(shù)據(jù) */ { Spi376Exchange( mData ); mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ } UINT8 xReadCH376Data( void ) /* 從CH376讀數(shù)據(jù) */ { mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ return( Spi376Exchange( 0xFF ) ); } #endif

/* 查詢CH376中斷(INT#低電平) */ UINT8 Query376Interrupt( void ) { #ifdef CH376_INT_WIRE return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果連接了CH376的中斷引腳則直接查詢中斷引腳 */ #else return( CH376_SPI_SDO ? FALSE : TRUE ); /* 如果未連接CH376的中斷引腳則查詢兼做中斷輸出的SDO引腳狀態(tài) */ #endif }

UINT8 mInitCH376Host( void ) /* 初始化CH376 */ { UINT8 res; CH376_PORT_INIT( ); /* 接口硬件初始化 */

xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測試單片機與CH376之間的通訊接口 */

xWriteCH376Data( 0x65 ); res = xReadCH376Data( ); xEndCH376Cmd( ); if ( res != 0x9A ) return( ERR_USB_UNKNOWN ); /* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復位,晶振不工作 */ xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */ xWriteCH376Data( 0x06 ); mDelayuS( 20 ); res = xReadCH376Data( ); xEndCH376Cmd( ); #ifndef CH376_INT_WIRE #ifdef CH376_SPI_SDO xWriteCH376Cmd( CMD20_SET_SDO_INT ); /* 設(shè)置SPI的SDO引腳的中斷方式 */ xWriteCH376Data( 0x16 ); xWriteCH376Data( 0x90 ); /* SDO引腳在SCS片選無效時兼做中斷請求輸出 */ xEndCH376Cmd( ); #endif #endif if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS ); else return( ERR_USB_UNKNOWN ); /* 設(shè)置模式錯誤 */ }


先用軟件模擬SPI測試一下,參考SPI_SW里面的讀寫時序。


你好: SPI的硬件接法, 我用示波器看了一下,SDI和CLK上的信號是對的,CMD11_CHECK_EXIST 0x06以及xWriteCH376Data( 0x65 )中的0x65都是正確的,隨后跟了個0xAA,但在SDO上沒有信號,請指點謝謝!


硬件連接有沒有問題?CH376S的第3.4腳是否接地,晶振是否起振?


晶振是否起振如何測試?我的連接方法是按評估板上的接法做的,是手工焊接的洞洞板。謝謝!


用示波器看啊,或者使用萬用表測量晶振引腳的電壓,正常應該在電源電壓的一半左右。


晶振起振了是12MHz,在14腳的XO上。13腳的XI只是VCC電壓的一半。在測試第13腳時ACT上的LED點亮了。但還是返回Error:FA。


應該是Wait376Interrupt函數(shù)返回的,說明在單位的時間內(nèi)沒有查詢到中斷。 這樣,你把Wait376Interrupt這個函數(shù)修改為死循環(huán)等中斷,現(xiàn)在是做了超時處理的。循環(huán)了500000次,你修改為無限次


我又重新焊接了一塊CH376s的板子,初始化OK了。 現(xiàn)在程序運行到了while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) 這里,這個函數(shù)在SPI_HW.C中沒有?。恐x謝!


這個函數(shù)很好找啊,在FIFLE_SYS.C里


程序在查詢CH376的中斷時打住了,程序如下,用表測得CH376_SPI_SDO是高電平,而INT#腳是低電平,但INT# 沒有連接到單片機。謝謝! UINT8 Query376Interrupt( void ) { #ifdef CH376_INT_WIRE return( CH376_INT_WIRE ? FALSE : TRUE ); #else return( CH376_SPI_SDO ? FALSE : TRUE ); //return( SPIF ? TRUE: FALSE); #endif }


如果要使用SDO引腳代替INT引腳需要發(fā)送命令(CMD20_SET_SDO_INT)設(shè)置.


你好: 發(fā)送命令(CMD20_SET_SDO_INT),在初始化mInitCH376Host( void )中已經(jīng)執(zhí)行了。 硬件的連接只有GPIO-〉SCS MISO-〉SDO MOSI-〉SDI SCK -〉SCK 中斷使用SDO,現(xiàn)在程序運行到了while ( CH376DiskConnect( ) != USB_INT_SUCCESS )了。但在查詢中斷時SDO為高,INT#卻是低。

謝謝!


現(xiàn)在將CH376S的電壓改成了3.2伏,從示波器上看到:SDI的數(shù)據(jù)是06 65 FF 15 06 FF 0B 16 90 SDO的數(shù)據(jù)是90 86 9A FF 95 86 FF 8B 96 這些數(shù)據(jù)都是初始化函數(shù)中傳送的命令和參數(shù),SDO上的第2個86應該有問題,if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS );/*0x14*/ 這個返回值如果是0x14才會成功。 返回值仍然是: Error:FA 謝謝解答!


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频