向高手請教: 在向U盤寫入一個(gè)扇區(qū)(512字節(jié))數(shù)據(jù)時(shí),前幾次的中斷狀態(tài)是真確的,可是后面的幾次的就不正確的,請問這是為什么?設(shè)備初始化這些都沒問題。 unsigned char WriteSector(unsigned int address,unsigned char*pBuffer) { unsigned char Block=8,IntStatus,Block_Size=0x40; SendCH375CMD(DISK_WRITE); //send write data command SendSingleData(address&0xff); //send address SendSingleData((address>>8)&0xff); SendSingleData((address>>16)&0xff); SendSingleData((address>>24)&0xff); for(Block;Block!=0;Block--) { IntStatus=GetInterStatus(); //get the interrupt status if (IntStatus==USB_INT_DISK_WRITE) // USB存儲器寫數(shù)據(jù)塊,請求數(shù)據(jù)寫入 {SendCH375CMD(WR_USB_DATA7); //向CH375緩沖區(qū)寫入數(shù)據(jù)塊 SendSingleData(Block_Size); // 后續(xù)數(shù)據(jù)的長度 while (Block_Size--) // 根據(jù)長度寫入數(shù)據(jù) SendSingleData(*pBuffer++); //將數(shù)據(jù)寫入 SendCH375CMD(DISK_WR_GO); //繼續(xù)執(zhí)行USB存儲器的寫操作 } else break; } if (Block==0) if((IntStatus=GetInterStatus())==USB_INT_SUCCESS) //等待中斷并獲取狀態(tài) return(0); //操作成功 ClearError(); // 清除U盤錯誤 return(IntStatus); //操作失敗 }
void ClearError( void ) { delayus(10000); /* 延時(shí)10mS */ SendCH375CMD(DISK_R_SENSE); /* 檢查USB存儲器錯誤 */ delayus(10000); /* 延時(shí)10mS */ GetInterStatus(); /* 等待中斷并獲取狀態(tài) */ }
在讀取一個(gè)扇區(qū)的時(shí)候也有上面的情況,而且,只有第一次的“后續(xù)數(shù)據(jù)的長度”才是64字節(jié),后面幾次都不是64字節(jié),這樣的情況正常嗎?
unsigned char ReadSector(unsigned int address,unsigned char*pBuffer) { unsigned int Sector; unsigned char Block=8,IntStatus,Block_Size; SendCH375CMD(DISK_READ); //send read data command SendSingleData(address&0xff); //send address SendSingleData((address>>8)&0xff); SendSingleData((address>>16)&0xff); SendSingleData((address>>24)&0xff); for(Block;Block!=0;Block--) { IntStatus=GetInterStatus(); //get the interrupt status if (IntStatus==USB_INT_DISK_READ) // USB存儲器讀數(shù)據(jù)塊,請求數(shù)據(jù)讀出 { SendCH375CMD(RD_USB_DATA); // 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 Block_Size=GetSingleByte(); // 后續(xù)數(shù)據(jù)的長度 while (Block_Size--) // 根據(jù)長度讀取數(shù)據(jù) *(pBuffer++)=GetSingleByte(); // 將數(shù)據(jù)讀出 SendCH375CMD(DISK_RD_GO); // 繼續(xù)執(zhí)行USB存儲器的讀操作 } else break; // 返回錯誤狀態(tài) } if (Block==0) if((IntStatus=GetInterStatus())==USB_INT_SUCCESS) //獲取狀態(tài) return(0); // 操作成功
ClearError(); //清除U盤錯誤 return(IntStatus); // 操作失敗 }