急求:CH376U盘连接检测无法通过

急求:CH376采样硬件SPI通信,工作状态测试可以正确返回反码,但在其结束时,除了禁止芯片片选外还须对芯片进行一次复位(RSTI引脚给一次高电平),否则在给芯片发出命令0X15(SET_USB_MODE)及数据0X06设置工作模式时,不能正确读回0x51(CMD_RET_SUCCES),首先,怀疑这块对芯片进行复位操作是不是有问题?在正确设置好工作模式(读出0x51的返回值),发出磁盘连接检测命令,等待中断被触发后,发出命令0x22(GET_STAUS)获取中断状态并取消中断请求,即使拔掉U盘中断状态也无法被撤除(INT引脚一直为低电平保持中断状态,知道芯片被复位),读操作后返回值为0xff,像是该命令没有发送成功,请问这是什么原因造成的,另附如下操作程序,忘大家指出不合理的部分,非常谢谢!

uchar CH376_init()//CH376初始化

{

uchar i,temp1;

SPI_init();//SPI初始化

Write_CH376_Comd(0x06);//发出测试命令

Write_CH376_Data(0X55);//发出0x55测试数据

temp1=Write_CH376_Data(0Xff);//读返回值信息

CH376_end();//操作结束

if(temp1!=0xAA)

return 0;//ch376状态检测失败

Write_CH376_Comd(0x15);//设置USB工作模式命令

Write_CH376_Data(0X06);//U盘模式6

temp1=Write_CH376_Data(0Xff);//读返回值信息

CH376_end();//操作结束

if(temp!=0x51)

return 0;//ch376状态检测失败


/////以上部分可以正常运行,下面出错////

Write_CH376_Comd(0x30);//检查磁盘连接命令

while(temp!=0x14)

{

while(PORTBbits.RB0);//等待中断响应

if(!PORTBbits.RB0)//检测到中断(实际运行时出现死循环)

{

Write_CH376_Comd(0x22);//获取中断状态并取消请求

temp1=Write_CH376_Data(0Xff);//读返回值信息

                        //此时temp1值为0xff,此值始终与上一条读取数据函数参数一致,比如                                    //temp1=Write_CH376_Data(0x39);  则temp1=0x39;

}

}

}

uchar Write_CH376_Comd(uchar comd)//写命令

{

uchar temp1;

CH376_RST=0;//禁止复位

delay(100);//上电延时50ms以上

SSP2IF=0;while(CH376_BUSY);//等待忙

CH376_CCS=1;delay(3);//先禁止片选

CH376_CCS=0;delay(10);//打开片选

SSP2BUF=comd;

while(!SSP2IF);

temp1=SSP2BUF;

NOP();NOP();NOP();

return temp1;

}

uchar Write_CH376_Data(uchar data)//写数据兼读数据

{

uchar temp1;

SSP2IF=0;while(CH376_BUSY);//等待忙

SSP2BUF=data;

while(!SSP2IF);

SSP2IF=0;

temp1=SSP2BUF;

NOP();NOP();NOP();

return (temp1);//返回读到的值

}

void CH376_end()//结束操作

{

CH376_CCS=1;//禁止片选

CH376_RST=1;//复位  高有效(如果次数没有该语句,则设置工作模式也将失败)

NOP();NOP();NOP();

}


首先,绝对不可以通过复位(RSTI拉高)解决问题,因为设置完模式后复位等于模式也没有设置。软件上可以查一下当前使用的是SPI的模式几?ch376可以使用模式0和3。另外一个命令的开始拉低CS,结束必须拉高。程序里执行0x30和0x22都没有CH376_end。程序上可以先把忙检测改成NOP延时,写读之后都保证有2US延时。


谢谢你的回复,我确实不是使用CH376模式0或者模式3,从我程序配置来看,SPI的模式1或者模式2可以成功对芯片检测(可以正常返回反码值),但配置改为模式0或者模式3时(其他程序部分不做改变),检测命令返回值为0XFE,请问这是怎么回事,跟原理相比整整180大反转啊,是不是还有哪些需要修改的地方

下图为PIC18F系列的单片机SPI主模式波形图,实际程序配置CKP=1;CKE=0;或者CKP=0;CKE=1;可以正常检测芯片

blob.png



void Spi376OutByte( UINT8 d )  /* SPI输出8个位数据 */
{  /* 如果是硬件SPI接口,应该是先将数据写入SPI数据寄存器,然后查询SPI状态寄存器以等待SPI字节传输完成 */
 UINT8 i;
 for ( i = 0; i < 8; i ++ ) {
  CH376_SPI_SCK = 0;
  if ( d & 0x80 ) CH376_SPI_SDI = 1;
  else CH376_SPI_SDI = 0;
  d <<= 1;  /* 数据位是高位在前 */
  CH376_SPI_SCK = 1;  /* CH376在时钟上升沿采样输入 */
 }
}

UINT8 Spi376InByte( void )  /* SPI输入8个位数据 */
{  /* 如果是硬件SPI接口,应该是先查询SPI状态寄存器以等待SPI字节传输完成,然后从SPI数据寄存器读出数据 */
 UINT8 i, d;
 d = 0;
 for ( i = 0; i < 8; i ++ ) {
  CH376_SPI_SCK = 0;  /* CH376在时钟下降沿输出 */
  d <<= 1;  /* 数据位是高位在前 */
  if ( CH376_SPI_SDO ) d ++;
  CH376_SPI_SCK = 1;
 }
 return( d );
}

以上是51模拟SPI模式3时序,可以参考一下。


U盘初始化成功,之前问题是因为硬件SCS片选连接出了问题,已经解决,但还是非常感谢你的回答


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