急求: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();
}