急求:CH376U盤連接檢測(cè)無法通過

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

}


首先,絕對(duì)不可以通過復(fù)位(RSTI拉高)解決問題,因?yàn)樵O(shè)置完模式后復(fù)位等于模式也沒有設(shè)置。軟件上可以查一下當(dāng)前使用的是SPI的模式幾?ch376可以使用模式0和3。另外一個(gè)命令的開始拉低CS,結(jié)束必須拉高。程序里執(zhí)行0x30和0x22都沒有CH376_end。程序上可以先把忙檢測(cè)改成NOP延時(shí),寫讀之后都保證有2US延時(shí)。


謝謝你的回復(fù),我確實(shí)不是使用CH376模式0或者模式3,從我程序配置來看,SPI的模式1或者模式2可以成功對(duì)芯片檢測(cè)(可以正常返回反碼值),但配置改為模式0或者模式3時(shí)(其他程序部分不做改變),檢測(cè)命令返回值為0XFE,請(qǐng)問這是怎么回事,跟原理相比整整180大反轉(zhuǎn)啊,是不是還有哪些需要修改的地方

下圖為PIC18F系列的單片機(jī)SPI主模式波形圖,實(shí)際程序配置CKP=1;CKE=0;或者CKP=0;CKE=1;可以正常檢測(cè)芯片

blob.png



void?Spi376OutByte( UINT8 d )? /* SPI輸出8個(gè)位數(shù)據(jù) */
{? /* 如果是硬件SPI接口,應(yīng)該是先將數(shù)據(jù)寫入SPI數(shù)據(jù)寄存器,然后查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成 */
?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;? /* 數(shù)據(jù)位是高位在前 */
??CH376_SPI_SCK = 1;? /* CH376在時(shí)鐘上升沿采樣輸入 */
?}
}

UINT8?Spi376InByte( void )? /* SPI輸入8個(gè)位數(shù)據(jù) */
{? /* 如果是硬件SPI接口,應(yīng)該是先查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成,然后從SPI數(shù)據(jù)寄存器讀出數(shù)據(jù) */
?UINT8?i, d;
?d = 0;
?for ( i = 0; i < 8; i ++ ) {
??CH376_SPI_SCK = 0;? /* CH376在時(shí)鐘下降沿輸出 */
??d <<= 1;? /* 數(shù)據(jù)位是高位在前 */
??if ( CH376_SPI_SDO ) d ++;
??CH376_SPI_SCK = 1;
?}
?return( d );
}

以上是51模擬SPI模式3時(shí)序,可以參考一下。


U盤初始化成功,之前問題是因?yàn)橛布CS片選連接出了問題,已經(jīng)解決,但還是非常感謝你的回答


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频