我是在st开发板上调试CH376,用的开发环境是IAR 5.3,不知道为什么在调试模式即debug情况下能够正常检测U盘并进行相关操作,可是一旦把程序下载到开发板上,直接运行就会有问题,检测不到外接的U盘?谢谢
补充一下,我采用的是并口方式
在板上直接运行速度应该比调试模式快。 1:检查读写时序,将时序降慢一些 2:检查中断引脚的配置
我在直接运行时,第一写命令CMD11_CHECK_EXIST 0x06,然后读状态值就成了0xFF,后来再写数据0x65,值都直接变成了0xFF,真不知道是啥原因。
先发0X06命令 再发0X55数据 然后读数据。 读出的数据应该是0xaa,如果不对,请检查时序。
如果时序不对,那么Debug调试运行时应该就有问题吧?我现在这些问题都出现在直接运行时,中间延时时间我也增加了,还是不行
如果测试命令不对的话,要么硬件问题,要么时序有问题。 硬件检查连接看是否有问题。软件,主要就是时序不对。Debug调试运行时可能速度比较慢。 可以把你的程序贴出来看看
void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ { UINT8 i; GPIO_InitTypeDef GPIO_InitStructure; //将8位数据IO定义为输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC, GPIO_Pin_13); //读信号无效 GPIO_ResetBits(GPIOC, GPIO_Pin_9); //写信号生效 GPIO_SetBits(GPIOD, GPIO_Pin_3); //选择写地址,A0拉高
CH376_DataIN(mCmd);//向数据寄存器发送命令 mDelaymS(50); GPIO_SetBits(GPIOC, GPIO_Pin_9);//写无效 GPIO_ResetBits(GPIOD, GPIO_Pin_3);//地址信号拉低
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);//读信号生效 GPIO_SetBits(GPIOC, GPIO_Pin_9);//写信号无效 GPIO_SetBits(GPIOD, GPIO_Pin_3); //地址A0拉高 mDelaymS(50);
for ( i = 10; i != 0; -- i ) { if ( ( CH376_DataOUT() & PARA_STATE_BUSY ) == 0 ) break; /* 检查状态端口的忙标志位 */ } mDelaymS(2); GPIO_SetBits(GPIOC, GPIO_Pin_13);//读信号无效 }
读写数据的函数与上面类似!麻烦了,谢谢
这个函数明显有问题。按照下面的去修改: void xWriteCH376Cmd( UINT8 mCmd ) /* 向CH376写命令 */ { UINT8 i; GPIO_InitTypeDef GPIO_InitStructure; //将8位数据IO定义为输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOC, &GPIO_InitStructure); CH376_DataIN(mCmd);//向数据寄存器发送命令 GPIO_SetBits(GPIOD, GPIO_Pin_3); //选择写地址,A0拉高 GPIO_SetBits(GPIOC, GPIO_Pin_13); //读信号无效
GPIO_ResetBits(GPIOC, GPIO_Pin_9); //写信号生效 GPIO_ResetBits(GPIOC, GPIO_Pin_9); //写信号生效 GPIO_ResetBits(GPIOC, GPIO_Pin_9); //写信号生效 GPIO_ResetBits(GPIOC, GPIO_Pin_9); //写信号生效
mDelaymS(50); GPIO_SetBits(GPIOC, GPIO_Pin_9);//写无效 GPIO_ResetBits(GPIOD, GPIO_Pin_3);//地址信号拉低
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC, GPIO_Pin_13);//读信号生效 GPIO_SetBits(GPIOC, GPIO_Pin_9);//写信号无效 GPIO_SetBits(GPIOD, GPIO_Pin_3); //地址A0拉高 mDelaymS(50);
for ( i = 10; i != 0; -- i ) { if ( ( CH376_DataOUT() & PARA_STATE_BUSY ) == 0 ) break; /* 检查状态端口的忙标志位 */ } mDelaymS(2); GPIO_SetBits(GPIOC, GPIO_Pin_13);//读信号无效 }
按照这个改了还是这个情况,debug调试时还是正常的,全速运行时就处于一直检测U盘,然后过一会检测到U盘断开,然后又发现U盘,又一直查询,就这么循环?
问题解决了,是因为开机后延时时间还是太短,后来我增加延时了个十几秒然后开机就正常运行了。但是这个时间是不是有点过长了,我开始就是延时100ms,可是就是不行。不过还是谢谢楼上帮忙了,我在时序上也做了一些调整。
你原来的程序肯定不对,写数据的时候,一定先把数据送到端口上,然后写信号再有效。
另外: 开机延时50ms即可。让CH375自复位