急求:CH376采樣硬件SPI通信,工作狀態(tài)測(cè)試可以正確返回反碼,但在其結(jié)束時(shí),除了禁止芯片片選外還須對(duì)芯片進(jìn)行一次復(fù)位(RSTI引腳給一次高電平),否則在給芯片發(fā)出命令0X15(SET_USB_MODE)及數(shù)據(jù)0X06設(shè)置工作模式時(shí),不能正確讀回0x51(CMD_RET_SUCCES),首先,懷疑這塊對(duì)芯片進(jìn)行復(fù)位操作是不是有問題?在正確設(shè)置好工作模式(讀出0x51的返回值),發(fā)出磁盤連接檢測(cè)命令,等待中斷被觸發(fā)后,發(fā)出命令0x22(GET_STAUS)獲取中斷狀態(tài)并取消中斷請(qǐng)求,即使拔掉U盤中斷狀態(tài)也無法被撤除(INT引腳一直為低電平保持中斷狀態(tài),知道芯片被復(fù)位),讀操作后返回值為0xff,像是該命令沒有發(fā)送成功,請(qǐng)問這是什么原因造成的,另附如下操作程序,忘大家指出不合理的部分,非常謝謝!
uchar CH376_init()//CH376初始化
{
uchar i,temp1;
SPI_init();//SPI初始化
Write_CH376_Comd(0x06);//發(fā)出測(cè)試命令
Write_CH376_Data(0X55);//發(fā)出0x55測(cè)試數(shù)據(jù)
temp1=Write_CH376_Data(0Xff);//讀返回值信息
CH376_end();//操作結(jié)束
if(temp1!=0xAA)
return 0;//ch376狀態(tài)檢測(cè)失敗
Write_CH376_Comd(0x15);//設(shè)置USB工作模式命令
Write_CH376_Data(0X06);//U盤模式6
temp1=Write_CH376_Data(0Xff);//讀返回值信息
CH376_end();//操作結(jié)束
if(temp!=0x51)
return 0;//ch376狀態(tài)檢測(cè)失敗
/////以上部分可以正常運(yùn)行,下面出錯(cuò)////
Write_CH376_Comd(0x30);//檢查磁盤連接命令
while(temp!=0x14)
{
while(PORTBbits.RB0);//等待中斷響應(yīng)
if(!PORTBbits.RB0)//檢測(cè)到中斷(實(shí)際運(yùn)行時(shí)出現(xiàn)死循環(huán))
{
Write_CH376_Comd(0x22);//獲取中斷狀態(tài)并取消請(qǐng)求
temp1=Write_CH376_Data(0Xff);//讀返回值信息
????????????????????????//此時(shí)temp1值為0xff,此值始終與上一條讀取數(shù)據(jù)函數(shù)參數(shù)一致,比如?????????????????????????????????? ?//temp1=Write_CH376_Data(0x39); ?則temp1=0x39;
}
}
}
uchar Write_CH376_Comd(uchar comd)//寫命令
{
uchar temp1;
CH376_RST=0;//禁止復(fù)位
delay(100);//上電延時(shí)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)//寫數(shù)據(jù)兼讀數(shù)據(jù)
{
uchar temp1;
SSP2IF=0;while(CH376_BUSY);//等待忙
SSP2BUF=data;
while(!SSP2IF);
SSP2IF=0;
temp1=SSP2BUF;
NOP();NOP();NOP();
return (temp1);//返回讀到的值
}
void CH376_end()//結(jié)束操作
{
CH376_CCS=1;//禁止片選
CH376_RST=1;//復(fù)位 ?高有效(如果次數(shù)沒有該語句,則設(shè)置工作模式也將失?。?/p>
NOP();NOP();NOP();
}