急,ch376t使用SPI操作U盤(pán)創(chuàng)建文件寫(xiě)數(shù)據(jù)問(wèn)題

下面應(yīng)用函數(shù)中調(diào)用的全是原廠庫(kù)函數(shù)

運(yùn)行結(jié)果是U盤(pán)中創(chuàng)建的文件中只有一個(gè)無(wú)關(guān)的亂碼字符

調(diào)試發(fā)現(xiàn)在字節(jié)寫(xiě)的函數(shù)中,第一個(gè)中斷返回就是0x14,而非0x1e,直接跳過(guò)了寫(xiě)數(shù)據(jù)過(guò)程

U盤(pán)的連接檢測(cè),初始化什么的都能成功,創(chuàng)建文件也能成功,寫(xiě)數(shù)據(jù)問(wèn)題究竟是什么原因,望解釋,謝謝。

void CheckUsbConnect(void)
{
??? static u16 u16_file_id = 0;
??? static u32 u32_line_id = 0;
??? static u08?TarFileName[64];

??? if (CH376DiskConnect() != USB_INT_SUCCESS)
??? {
??????? return;
??? }
???
??? if (CH376DiskMount() != USB_INT_SUCCESS)
??? {
??????? return;
??? }
???
??? if (u32_line_id == 0)
??? {
??????? sprintf((char*)TarFileName, "\\AIB%05d.TXT", u16_file_id);?
??????? memcpy(pst_m_manual->mu08_made_core, TarFileName, 20);?

????????
??????? if (CH376FileCreate((u08*)TarFileName) != USB_INT_SUCCESS)
??????? {
??????????? return;
??????? }
??? }
??? else
??? {
??????? CH376WriteVar32(VAR_START_CLUSTER, 0);?
????????
??????? if (CH376FileOpen(TarFileName) != USB_INT_SUCCESS)
??????? {
??????????? return;
??????? }
???????
??????? if (CH376ByteLocate(u32_line_id * 8) != USB_INT_SUCCESS)
??????? {
??????????? return;
??????? }
??????? u32_line_id ++;
??????? if (u32_line_id >= 10000)
??????? {
??????????? u32_line_id = 0;
??????????? u16_file_id ++;
??????? }
??????? pst_m_using->ms16_cycle = u32_line_id;
??? }
???
??? if (CH376ByteWrite(pst_m_manual->mu08_made_date, 8, NULL) != USB_INT_SUCCESS)
??? {
??????? return;
??? }
???
??? if (CH376FileClose(TRUE) != USB_INT_SUCCESS)
??? {
??????? return;
??? }
}

?

有個(gè)別曾今問(wèn)到這個(gè)問(wèn)題的,但都沒(méi)具體的解決方案下文,望知情者幫忙!


底層讀寫(xiě)數(shù)據(jù)、命令函數(shù)需要保證間隔,建議命令與數(shù)據(jù)間隔2us,數(shù)據(jù)與數(shù)據(jù)間隔1us。此外,CH376GetIntStatus函數(shù)內(nèi)部可以再次執(zhí)行一次CMD01_GET_STATUS命令,看第二次的返回值?


我使用的是ARM的LPC1768的標(biāo)準(zhǔn)SPI,有發(fā)送和接收完成的標(biāo)志判斷,當(dāng)然按您提示,額外加上了延時(shí),同時(shí)狀態(tài)讀取也額外增加了一次,但還是一樣的,從未獲得字節(jié)寫(xiě)的中斷狀態(tài)0x1E,也未能正確實(shí)現(xiàn)數(shù)據(jù)的寫(xiě)入。還有其他可能原因么?

UINT8 CH376GetIntStatus( void )
{
UINT8 s;

xWriteCH376Cmd( CMD01_GET_STATUS );
s = xReadCH376Data( );
xEndCH376Cmd( );
xWriteCH376Cmd( CMD01_GET_STATUS );
s = xReadCH376Data( );
xEndCH376Cmd( );
return( s );
}

?


儲(chǔ)能團(tuán)隊(duì) - 副本.jpg


底層讀寫(xiě)數(shù)據(jù)、命令函數(shù)需要保證間隔,建議命令與數(shù)據(jù)間隔2us,數(shù)據(jù)與數(shù)據(jù)間隔1us。此外,CH376GetIntStatus函數(shù)內(nèi)部可以再次執(zhí)行一次CMD01_GET_STATUS命令,看第二次的返回值?

請(qǐng)麻煩繼續(xù)幫我看看,謝謝。


請(qǐng)把CS設(shè)置成軟件方式,在xEndCh376Cmd()中拉高CS,命令開(kāi)始拉低CS,中間數(shù)據(jù)傳輸CS必須始終為低。


請(qǐng)把CS設(shè)置成軟件方式,在xEndCh376Cmd()中拉高CS,命令開(kāi)始拉低CS,中間數(shù)據(jù)傳輸CS必須始終為低。

?

我不是太清楚這樣改有什么不一樣,用標(biāo)準(zhǔn)SPI自動(dòng)的,我測(cè)量中斷信號(hào)也是有的。我不至于標(biāo)準(zhǔn)的能用不用,而用模擬SPI吧?


CS拉低的第一個(gè)字節(jié)默認(rèn)為命令,后續(xù)是數(shù)據(jù),CS拉高表示命令的結(jié)束。一般單片機(jī)的硬件SPI也是可以設(shè)置成CS軟件控制的。


CS拉低的第一個(gè)字節(jié)默認(rèn)為命令,后續(xù)是數(shù)據(jù),CS拉高表示命令的結(jié)束。一般單片機(jī)的硬件SPI也是可以設(shè)置成CS軟件控制的。

下面測(cè)試代碼運(yùn)行結(jié)果,5秒執(zhí)行一次該函數(shù),上下對(duì)應(yīng):

status:?? 0x15 0x14 0x03 0x1e 0x16 0x45

對(duì)應(yīng)list:0x01 0x10 0x04 0x02 0x02 0x04/0x08

看能不能看出問(wèn)題?

?

void CheckUsbConnect(s16* status)
{
static u16 u16_file_id = 0;
static u32 u32_line_id = 0;
static u08 TarFileName[64];
static u08 delay = 0;
if (delay ++ < 5) return;
delay = 0;

?

pst_m_rd->mu32_bat_list = 0 | (1 << 0);
*status = CH376DiskConnect();
if (*status != USB_INT_SUCCESS)//20
{
return;
}

pst_m_rd->mu32_bat_list = 0 | (1 << 1);
*status = CH376DiskMount();
if (*status != USB_INT_SUCCESS)//20
{
return;
}

if (u32_line_id == 0)
{
sprintf((char*)TarFileName, "\\AIB%05d.TXT", u16_file_id);
memcpy(pst_m_manual->mu08_made_core, TarFileName, 20);

pst_m_rd->mu32_bat_list = 0 | (1 << 2);
*status = CH376FileCreate((u08*)TarFileName);
if (*status != USB_INT_SUCCESS)
{
return;
}
}
else
{while(1);

CH376WriteVar32(VAR_START_CLUSTER, 0);

*status = CH376FileOpen(TarFileName);
if (*status != USB_INT_SUCCESS)
{
return;
}

*status = CH376ByteLocate(u32_line_id * 8);
if (*status != USB_INT_SUCCESS)
{
return;
}
u32_line_id ++;
if (u32_line_id >= 10000)
{
u32_line_id = 0;
u16_file_id ++;
}
}

pst_m_rd->mu32_bat_list = 0 | (1 << 3);
*status = CH376ByteWrite(pst_m_manual->mu08_made_core, strlen((const char*)pst_m_manual->mu08_made_core), NULL);
if (*status != USB_INT_SUCCESS)
{
return;
}

pst_m_rd->mu32_bat_list = 0 | (1 << 4);
*status = CH376FileClose(TRUE);
if (*status != USB_INT_SUCCESS)
{
return;
}
}


CS拉低的第一個(gè)字節(jié)默認(rèn)為命令,后續(xù)是數(shù)據(jù),CS拉高表示命令的結(jié)束。一般單片機(jī)的硬件SPI也是可以設(shè)置成CS軟件控制的。

從流程上分析,感覺(jué)每次發(fā)指定命令后,隨后若干次獲取的中斷狀態(tài)都是SUCCESS會(huì)導(dǎo)致帶過(guò)好幾條指令的執(zhí)行,然后遲滯的才會(huì)獲取到之前指令對(duì)應(yīng)的實(shí)際狀態(tài),但已經(jīng)是在下一個(gè)指令發(fā)送后,就錯(cuò)亂了?什么原因?

另外,最后一個(gè)0x45是什么狀態(tài)?


什么意思?返回狀態(tài)錯(cuò)位了嗎?0x45不是一個(gè)有效的狀態(tài)。

tel:025-52638376


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

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