CH376 读到的版本号是0x43即v0x3吧, SPI读写正常,CHECK_EXIST命令返回正确取反数据,但是sd卡插进去后晶振停振,拔出来以后又正常了。插进去的时候测过各电压,没短路,没拉低,是正常的3.3v供电,v3已连接到vcc。附电路图,不知怎么插入,在附件里了。此时初始化是0x03 sd卡主机模式。同事附上初始化的代码: // 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
// 设置USB工作模式 CH376_SCS_LOW ; SPI2_SendReadByte (SET_USB_MODE) ; SPI2_SendReadByte (0x03) ; // SD卡主机模式 delay_ms (1) ; // 等待10us(待修改)延迟等待模式设置完成 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 ("命令返回数据0x%x.\r\n", check_data) ; #endif
// 设置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) ; // 此信号线不稳定。所以延时等待sd卡插入稳定 // 挂载SD卡 CH376_SCS_LOW ; SPI2_SendReadByte (DISK_MOUNT) ; CH376_SCS_HIGH ; delay_ms (100) ; // 等待SD稳定 printf ("等待CH376中断.\r\n") ; while (GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_0)) ; // 等待ch376中断(sd卡插入后停在这里,拔出后才产生中断(偶尔产生。。。)) printf ("CH376产生中断,开始获取CH376中断数据.\r\n") ; CH376_SCS_LOW ; SPI2_SendReadByte (GET_STATUS) ; check_data = SPI2_SendReadByte (0) ; CH376_SCS_HIGH ; printf ("获取中断数据成功,请检查中断内容.\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卡插入后停在这里,拔出后才产生中断(偶尔产生。。。)) 注:这个是INT#的中断线,ch376的int#直接接到ARM的外部中断。
sd卡插进去后测了下晶振的两腿XO为低,XI为3v这样。 麻烦提供下意见,谢谢。