我正在用STM32控制CH376T芯片讀寫U盤文件,使用的是SPI接口。使用的是STM32火牛開發(fā)板里面給的CH376_test例程,可是發(fā)現(xiàn)在mInitCH376Host()一直通不過,我用串口調(diào)試了一下發(fā)現(xiàn)是在 xWriteCH376Cmd( CMD11_CHECK_EXIST );/* 測試單片機與CH376之間的通訊接口 */ xWriteCH376Data( 0x65 ); Delay(1); res = xReadCH376Data( ); xEndCH376Cmd( );// 結(jié)束通信測試 if ( res != 0x9A ) { USART1_SendByte(0xe1); return( ERR_USB_UNKNOWN );/* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */ }
讀出來的res不是0x9A造成的,可是我檢查晶振,SPI接口均沒有錯誤。 是否在初始化CH376T還有其他注意事項?
CH376.C函數(shù)如下:
/*******************************************************************************
* * * 文件名稱:ch376.c
* * * 文件說明:CH376芯片 SPI串行連接的硬件抽象層 V1.0
* * * 創(chuàng)建日期:PowerAVR / 2009-12-19
* * * 修改日期:
*******************************************************************************/ #include "stm32f10x.h" #include "CH376INC.h" #include "spi.h" #include "ch376.h" #include "USART.h" extern void Delay(u32 nCount);
/*****************************************************
* Name: mInitCH376Host
* Function: 初始化CH376
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/ u8 mInitCH376Host( void ) { u8 res; xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* 測試單片機與CH376之間的通訊接口 */ xWriteCH376Data( 0x65 ); Delay(1); res = xReadCH376Data( ); xEndCH376Cmd( ); // 結(jié)束通信測試 if ( res != 0x9A ) { USART1_SendByte(0xe1); return( ERR_USB_UNKNOWN ); /* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */ } xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */ xWriteCH376Data( 0x06 ); // 模式代碼為0x06,表示切換到已啟用的USB主機方式,自動產(chǎn)生SOF包 Delay(1); //mDelayuS( 20 ); res = xReadCH376Data( ); // 返回操作狀態(tài) xEndCH376Cmd( ); // 工作模式設(shè)置結(jié)束
xWriteCH376Cmd( CMD20_SET_SDO_INT ); /* 設(shè)置SPI的SDO引腳的中斷方式 */ xWriteCH376Data( 0x16 ); xWriteCH376Data( 0x90 ); /* SDO引腳在SCS片選無效時兼做中斷請求輸出 */ xEndCH376Cmd( ); // 結(jié)束設(shè)置SDO引腳方式
if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS ); else { USART1_SendByte(0xe2); return( ERR_USB_UNKNOWN ); /* 設(shè)置模式錯誤 */ } } /*****************************************************
* Name: CH376_PORT_INIT
* Function: 初始化CH376的SPI IO!
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/ u8 mWaitInterrupt( void ) { /* 等待CH376中斷并獲取狀態(tài),主機端等待操作完成,返回操作狀態(tài) */ while ( Query376Interrupt( ) == FALSE ); /* 一直等中斷 */ xWriteCH376Cmd( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷,獲取中斷狀態(tài) */ return( xReadCH376Data( ) ); }
/*****************************************************
* Name: xWriteCH376Cmd
* Function: 寫命令到CH376去
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/ void xWriteCH376Cmd( u8 mCmd ) /* 向CH376寫命令 */ { GPIO_SetBits(GPIOA,GPIO_Pin_1); /* 防止之前未通過xEndCH376Cmd禁止SPI片選 */ // mDelay0_5uS( ); Delay(1); /* 對于雙向I/O引腳模擬SPI接口,那么必須確保已經(jīng)設(shè)置SPI_SCS,SPI_SCK,SPI_SDI為輸出方向,SPI_SDO為輸入方向 */ GPIO_ResetBits(GPIOA,GPIO_Pin_1); /* SPI片選有效 */ CH376_ReadWrite( mCmd ); /* 發(fā)出命令碼 */ Delay(1); // DelayXms(1);; /* 延時1.5uS確保讀寫周期大于1.5uS,或者用上面一行的狀態(tài)查詢代替 */
} /*****************************************************
* Name: xWriteCH376Data
* Function: 寫1字節(jié)數(shù)據(jù)到CH376
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/ void xWriteCH376Data( u8 mData ) /* 向CH376寫數(shù)據(jù) */ { CH376_ReadWrite( mData ); Delay(1); // mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ }
/*****************************************************
* Name: xReadCH376Data
* Function: 從CH376讀取1字節(jié)數(shù)據(jù)
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/ u8 xReadCH376Data( void ) /* 從CH376讀數(shù)據(jù) */ { // mDelay0_5uS( ); /* 確保讀寫周期大于0.6uS */ Delay(1); return( CH376_ReadWrite(0xff)); } /*****************************************************
* Name: Query376Interrupt
* Function: 查詢CH376中斷(INT#低電平)
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/ u8 Query376Interrupt( void ) { return( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)? FALSE : TRUE ); /* 如果未連接CH376的中斷引腳則查詢兼做中斷輸出的SDO引腳狀態(tài) */ }
/*****************************************************
* Name: mDelayuS
* Function: delay
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/ void mDelayuS(u8 us) { while(us--); }
/*****************************************************
* Name: mDelayuS
* Function: delay
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/
void mDelaymS(u8 ms) { unsigned int i; for(;ms>0;ms--) for(i=0;i<940;i++); }
/*****************************************************
* Name: mDelayuS
* Function: delay
* Input: no
* Output: no
* Author: PowerAVR / 2009-12-19
* Update:
*****************************************************/ void mDelay0_5uS( void ) /* 至少延時0.5uS,根據(jù)單片機主頻調(diào)整 */ { u8 i; i=20; while(i--); }