CH376 讀到的版本號(hào)是0x43即v0x3吧, SPI讀寫正常,CHECK_EXIST命令返回正確取反數(shù)據(jù),但是sd卡插進(jìn)去后晶振停振,拔出來以后又正常了。插進(jìn)去的時(shí)候測過各電壓,沒短路,沒拉低,是正常的3.3v供電,v3已連接到vcc。附電路圖,不知怎么插入,在附件里了。此時(shí)初始化是0x03 sd卡主機(jī)模式。同事附上初始化的代碼: // CH376 init void CH376_Init (void) { u8 check_data = 0x57 ;
CH376_GPIO_Config () ; CH376_RST_LOW ; CH376_EXTI_Config () ; CH376_SPI2_Config () ; // Reset CH376_RST_HIGH ; delay_ms (1) ; CH376_RST_LOW ; delay_ms (100) ; // delay 100ms
// 檢查ch376工作是否正常 CH376_SCS_LOW ; // SCS拉低 SPI2_SendReadByte(CHECK_EXIST) ; SPI2_SendReadByte(check_data) ; check_data = SPI2_SendReadByte (0) ; CH376_SCS_HIGH ;
if (check_data== 0xA8) { // success #ifdef CH376_DEBUG printf ("CH376初始化成功.\r\n") ; #endif
// 設(shè)置USB工作模式 CH376_SCS_LOW ; SPI2_SendReadByte (SET_USB_MODE) ; SPI2_SendReadByte (0x03) ; // SD卡主機(jī)模式 delay_ms (1) ; // 等待10us(待修改)延遲等待模式設(shè)置完成 check_data = SPI2_SendReadByte (0) ; CH376_SCS_HIGH ; #ifdef CH376_DEBUG if (check_data == CMD_RET_SUCCESS) printf ("命令操作成功.\r\n") ; else if (check_data == CMD_RET_ABORT) printf ("命令操作失敗.\r\n") ; else printf ("命令返回?cái)?shù)據(jù)0x%x.\r\n", check_data) ; #endif
// 設(shè)置SDO中斷方式 CH376_SCS_LOW ; SPI2_SendReadByte (SET_SDO_INT) ; SPI2_SendReadByte (0x16) ; SPI2_SendReadByte (0x10) ; // 禁止SDO作為中斷輸出腳 CH376_SCS_HIGH ;
// printf ("等待SD卡插入.\r\n") ; while (GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_8)) ; // 等待sd卡插入 printf ("檢測到SD卡插入.\r\n") ; delay_ms (1000) ; // 此信號(hào)線不穩(wěn)定。所以延時(shí)等待sd卡插入穩(wěn)定 // 掛載SD卡 CH376_SCS_LOW ; SPI2_SendReadByte (DISK_MOUNT) ; CH376_SCS_HIGH ; delay_ms (100) ; // 等待SD穩(wěn)定 printf ("等待CH376中斷.\r\n") ; while (GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_0)) ; // 等待ch376中斷(sd卡插入后停在這里,拔出后才產(chǎn)生中斷(偶爾產(chǎn)生。。。)) printf ("CH376產(chǎn)生中斷,開始獲取CH376中斷數(shù)據(jù).\r\n") ; CH376_SCS_LOW ; SPI2_SendReadByte (GET_STATUS) ; check_data = SPI2_SendReadByte (0) ; CH376_SCS_HIGH ; printf ("獲取中斷數(shù)據(jù)成功,請檢查中斷內(nèi)容.\r\n") ;
if (check_data == USB_INT_SUCCESS) printf ("掛載磁盤成功。\r\n") ; else { printf ("掛載磁盤失敗。check_data = 0x%x.\r\n", check_data) ; CH376_SCS_LOW ; SPI2_SendReadByte (DISK_MOUNT) ; CH376_SCS_HIGH ; while (GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_0)) ; CH376_SCS_LOW ; SPI2_SendReadByte (GET_STATUS) ; check_data = SPI2_SendReadByte (0) ; CH376_SCS_HIGH ; if (check_data == USB_INT_SUCCESS) printf ("掛載磁盤成功。\r\n") ; else printf ("掛載磁盤失敗。check_data = 0x%x.\r\n", check_data) ; } } else { // failed #ifdef CH376_DEBUG printf ("CH376初始化失敗.\r\n") ; #endif }
} sd卡插入后,程序停在:while (GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_0)) ; // 等待ch376中斷(sd卡插入后停在這里,拔出后才產(chǎn)生中斷(偶爾產(chǎn)生。。。)) 注:這個(gè)是INT#的中斷線,ch376的int#直接接到ARM的外部中斷。
sd卡插進(jìn)去后測了下晶振的兩腿XO為低,XI為3v這樣。 麻煩提供下意見,謝謝。