請問CH378Q這個芯片扇區(qū)讀寫和字節(jié)讀寫各有什么優(yōu)劣啊?
還有你們有字節(jié)讀寫的例程嗎?
08H模式下能達到480Mbps高速USB通訊嗎?
還有個程序問題請麻煩一一回答下.
你好,網(wǎng)上下載的例程里面有一個?EXAM8這么個例程.里面的
mFlushBufferToDisk屬實讓人看不懂?
void mFlushBufferToDisk(UINT8 force)
{
? UINT8? status;
? if (force)? ? ? ? ? ? ? ? ? ? ? ? ? /* 強制刷新 */
? {
? ? status = (total + DEF_SECTOR_SIZE - 1) / DEF_SECTOR_SIZE;? ?/* 將緩沖區(qū)中的字節(jié)數(shù)轉換為扇區(qū)數(shù)(除以DEF_SECTOR_SIZE),長度加上DEF_SECTOR_SIZE-1用于確保寫入最后的零頭數(shù)據(jù) */
? ? if (status)
? ? {
? ? ? /* 有數(shù)據(jù) */
? ? ? status = CH378SecWrite(FileDataBuf, status, NULL);? ? /* 以扇區(qū)為單位向文件寫入數(shù)據(jù),寫入緩沖區(qū)中的所有數(shù)據(jù),含最后的零頭 */
? ? ? mStopIfError(status);
? ? ? /* 有些U盤可能會要求在寫數(shù)據(jù)后等待一會才能繼續(xù)操作,所以,如果在某些U盤中發(fā)生數(shù)據(jù)丟失現(xiàn)象,建議在每次寫入數(shù)據(jù)后稍作延時再繼續(xù) */
? ? ? mDelaymS(1);? ? ? ? ? ? ? ? ? ? ? /* 寫后延時,可選的,大多數(shù)U盤不需要 */
? ? ? memcpy(FileDataBuf, & FileDataBuf[ total & ~(DEF_SECTOR_SIZE - 1) ], total & (DEF_SECTOR_SIZE - 1));? ? ? ? ?/* 將剛才已寫入U盤的零頭數(shù)據(jù)復制到緩沖區(qū)的頭部 */
? ? ? total &= DEF_SECTOR_SIZE - 1;? ? ? ? ? ? ? /* 緩沖區(qū)中只剩下剛才已寫入U盤的零頭數(shù)據(jù),繼續(xù)保留在緩沖區(qū)中是為了方便以后在其后面追加數(shù)據(jù) */
? ? }
? ? NewSize = CH378GetFileSize();? ? ? ? ? ? ? ?/* 讀取當前文件長度,如果沒有零頭數(shù)據(jù),那么文件長度是DEF_SECTOR_SIZE的倍數(shù) */
? ? if (total)
? ? {
? ? ? NewSize -= DEF_SECTOR_SIZE - total;? ? ? ? ? /* 以扇區(qū)為單位,有零頭數(shù)據(jù),計算出真正的文件長度(有效數(shù)據(jù)的長度) */
? ? }
? ? CH378WriteVar32(VAR32_FILE_SIZE, NewSize);? ? ? ? ? /* 將正確的當前文件長度寫入CH378內存 */
? ? printf("Current File Size is %ld\n", NewSize);
? ? status = CH378SecWrite(FileDataBuf, 0, NULL);? ? ? ? ? ?/* 寫0長度,實際是刷新文件長度,將CH378內存中當前文件長度信息真正寫入U盤或者SD卡中 */
? ? mStopIfError(status);
? ? status = CH378SecLocate(0xFFFFFFFF);? ? ? ? ? ? /* 重新回到原文件的尾部,以扇區(qū)為單位,所以會忽略文件尾部的零頭數(shù)據(jù),下面如果再寫入數(shù)據(jù)將覆蓋尾部零頭數(shù)據(jù),不過該零頭數(shù)據(jù)有一份副本保留在緩沖區(qū)中,所以請放心 */
? ? mStopIfError(status);
? }
標紅的地方為什么要這樣操作,CH378GetFileSize();?不就是獲取的實際文件長度嗎? 為什么還要判斷total一下,而且如果獲取的文件長度是 515那么這么處理(NewSize -= DEF_SECTOR_SIZE - total;)了一下 不就剩下了5了嗎?