CH376 SPI读写正常,但是sd卡插进去后晶振停振。

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这样。 麻烦提供下意见,谢谢。

那你直接先把SD卡插入之后看是否可以操作?还有看下电源系统上面使用示波器看下有没有异常。正常情况下设备的插入不会影响芯片的工作。


直接插入先的话,CH376是初始化失败的。示波器检测vcc脚(用触发模式。下降沿触发,低于3v扑捉,并没有信号触发,这应该说明vcc在sd卡插入时是稳定的)。把模式设置成0x2时(测试模式设置是否正常),可以看到UD+是3v这样子,所以模式应该没错(SD卡我设成0x3sd卡主机模式)。


直接插入CH376初始化失败是什么意思?是测试命令都没有通过吗?按照道理来讲插入SD卡同单片机操作CH376没有什么直接的关系。还有SD卡的信号线接法是否有什么问题?


是的,直接插入的话,376测试命令是没有通过的。因为这时候晶振也停的,拔出来就起振。SD卡的接法是这样的: CH376 SD卡槽 SD_CS-> 1(DAT3/CS) SD_DO-> 2(DI/CMD) SD_CK-> 5(CLK) SD_DI-> 7(DAT0/DO) 可以的话,我可以把电路图发你邮箱。


那你把原理图发给我看下。按照你的说法只要SD卡插入的话晶振始终是停振的是不是?


好了。汗,原来是sd卡插入时晶振的xi脚和sd卡的某个脚短起来了。做板时犯了个错误(晶振用两脚的,穿过电路板好像和sd卡槽接触的地方,垫了个纸片。就挂载磁盘成功了。板子比较小。看来晶振得换SMD的封装。

谢谢帮助提供意见。


只有登录才能回复,可以选择微信账号登录