關(guān)于CH375讀U盤的物理扇區(qū)數(shù)據(jù)

樓主,您好   我在讀U盤的物理扇區(qū)時(shí),讀到的總是U盤的產(chǎn)品型號(hào),我的程序如下,   因EMAIL老是超時(shí),發(fā)不出,我的EMAIL:MICHAEL.DU@AVERA-TECH.COM

//HOST //*********************************************************

#include "c8051F410.h" #include "main.h"

//************************************************ // main ASM // system clock=50M //************************************************

void main(void) { PCA0MD &= ~0x40; /*watch dog*/ Sys_Clk_Init(); Port_Init();

// Flash_Init(); // Flash_RD_ID();

// Main_Init(); Ch375_Init();

while(Ch375_Counter != 0x14) { Ch375_Command(0x51); Ch375_Counter=Ch375_Status(); Delay_xxuS(50000); Delay_xxuS(50000); }

Ch375_RD_Page(); while(1); } void Ch375_RD_Page(void) { data char i;

Fat_Pointer=0x00; Ch375_Command(0x54); // while(Ch375_INT); // i=Ch375_Status(); Ch375_WR_Data(0x8a); Ch375_WR_Data(0x00); Ch375_WR_Data(0x00); Ch375_WR_Data(0x00); Ch375_WR_Data(0x01);

while(Ch375_INT); i=Ch375_Status();

for(i=0;i<8;i++) { Ch375_Command(0x28);

for(Ch375_Counter=0x00;Ch375_Counter<65;Ch375_Counter++) { Fat_Data[Fat_Pointer]=Ch375_RD_Data(); Fat_Pointer++; } Ch375_Command(0x55); while(Ch375_INT); // Ch375_Status();

} }

//********************************************************* // ch375相關(guān)子程序 //********************************************************* void U_Communication(void) { if(J2a_Pointer>=512) { Ch375_Command(0x56); } }

char Ch375_Init(void) { char temp=0; char temp1;

Ch375_Command(0x05); Delay_xxuS(40000);

Ch375_Command(0x15); //工作模式輸入 Delay_xxuS(100); Ch375_WR_Data(0x06); temp1=Ch375_RD_Data();

Ch375_Command(0x06); //CH375 CHIP檢測(cè) Ch375_WR_Data(0x11); temp1=Ch375_RD_Data(); //總是0xFF

Ch375_Command(0x06); //CH375 CHIP檢測(cè) Ch375_WR_Data(0x11); temp1=Ch375_RD_Data();

Ch375_Command(0x06); Ch375_WR_Data(0x34); temp1=Ch375_RD_Data();

Ch375_Command(0x51); //工作模式輸入 temp1=Ch375_RD_Data();

return(temp1); }

char Ch375_Status(void) { char temp; Ch375_Command(0x22); temp=Ch375_RD_Data(); return(temp); }

void Usb_Err(void) {

}

void Sram_To_Usb(void) {

}

void Usb_To_Sram(void) {

}

void Ch375_Command(command) { idata volatile char nop_nop;

P1MDOUT=0xff; Ch375_A0=1; P1=command; Ch375_CE=0; Ch375_WE=0; nop_nop++; nop_nop++; nop_nop++; nop_nop++; Ch375_WE=1; Ch375_CE=1; Ch375_A0=0;

for(nop_nop=0;nop_nop<5;nop_nop) nop_nop++; }

void Ch375_WR_Data(value) { idata volatile char nop_nop; P1MDOUT=0xff; P1=value; Ch375_CE=0; Ch375_WE=0; nop_nop++; nop_nop++; nop_nop++; nop_nop++; Ch375_WE=1; Ch375_CE=1; for(nop_nop=0;nop_nop<2;nop_nop) nop_nop++; }

char Ch375_RD_Data(void) { idata volatile char nop_nop; unsigned char para;

P1MDOUT=0x00; P1=0xff; Ch375_CE=0; Ch375_RE=0; nop_nop++; nop_nop++; nop_nop++; nop_nop++; para=P1; Ch375_RE=1; Ch375_CE=1; // P1=0xff; for(nop_nop=0;nop_nop<2;nop_nop) nop_nop++; return(para); }

//************************************************** // sys_clk_init() //************************************************** void Sys_Clk_Init(void) { int i = 0;

PFE0CN &= ~0x20; FLSCL = 0x10; PFE0CN |= 0x20; OSCICN = 0x87; CLKMUL = 0x80; for (i = 0; i < 20; i++); // Wait 5us for initialization CLKMUL |= 0xC0; while ((CLKMUL & 0x20) == 0); CLKSEL = 0x02; }

//************************************************** // Port_Init() //************************************************** void Port_Init(void) { P0MDIN=0xff; P1MDIN=0xff; P2MDIN=0xff; P0=0x2b; P2=0xff; // P1=0xff; P0MDOUT=0xdc; // P1MDOUT=0xff; P2MDOUT=0xf7; XBR0=0x01; //enable uart0 XBR1=0x40; //enable port

Ch375_CE=1; Ch375_A0=0;

Flash_CE=1; //init i/o Flash_RE=1; Flash_WE=1; Flash_R_B=1; //OPEN DRAIN Flash_CLE=0; Flash_ALE=0;

J2a_CS=1; J2a_INT=1; J2a_RST=0; }

//************************************************** // 中斷 //************************************************** void INT_Init (void) { SCON0= 0x50; /*SCON0:模式1,8位UART,時(shí)能RX*/ TMOD= 0x20; /*TMOD: 定時(shí)器工作再模式2, 8位重載*/ TH1= 202; /*設(shè)置定時(shí)1用作波特率的重載值 256-49000k/48/2/9.6k=203 */ TR1= 1; /*開定時(shí)器1*/ CKCON |= 0x02; /*定時(shí)器1用系統(tǒng)時(shí)鐘作為它的時(shí)基 /48*/ PCON |= 0x80; /*SMOD00 = 1*/ ReceiveBit=0; ES0=1; //UART中斷標(biāo)志

TMR2CN=0x00; //TC2,時(shí)鐘選擇SYSTEM CLOCK/12 TMR2RLL=0x3D; //10mS TMR2RLH=0x5D; TMR2L=0x3D; TMR2H=0x5D; TR2=0;

IT01CF=0x01; //INT0 低電平中斷 P0.1 IT0=0; EX0=0; //允許INT0中斷 EA=0; /*開中斷標(biāo)志*/ }

void UART0_ISR (void) interrupt 4 { if(!TI0) //是發(fā)送中斷還是接收中斷 { RI0 = 0; /*清接收標(biāo)志位*/ Receiver =SBUF0; /*保存接收到的數(shù)據(jù)*/ ReceiveBit=1; /*置接收標(biāo)志*/ } TI0 = 0; /*清發(fā)送標(biāo)志位*/ }

void Delay_xxuS(temp) //用示波器校正過(guò),總是>temp uS { int idata x; for(x=0;x Delay_1uS(); }

void Delay_1uS(void) { idata char xx; for(xx=0;xx<10;xx) xx++; }

void Delay() { data int x; for(x = 0;x <300;x) x++; }

UINT8 mInitDisk( void ) { /* 初始化磁盤 */ UINT8 Status,i,j=0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB設(shè)備斷開 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲(chǔ)器 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯(cuò)誤 */ mDelaymS( 250 ); if(j==5) return(Status); } CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ){ /* 出現(xiàn)錯(cuò)誤 */ for(i=0;i!=5;i++){ printf("Ready\n"); CH375_WR_CMD_PORT( CMD_DISK_READY ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯(cuò)誤 */ } } return( 0 ); /* U盤已經(jīng)成功初始化 */ } 上面是初始化U盤的函數(shù),還有就是你在讀取物理扇區(qū)的時(shí)候,請(qǐng)按照下面的步驟來(lái)操作: UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer ) { /* 從U盤讀取數(shù)據(jù)塊到緩沖區(qū) */ /* iLbaStart 起始扇區(qū)號(hào), iSectorCount 扇區(qū)數(shù), oDataBuffer 緩沖區(qū)起址 */ UINT16 mBlockCount; UINT8 c; CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 從USB存儲(chǔ)器讀數(shù)據(jù)塊 */ CH375_WR_DAT_PORT( (UINT8)iLbaStart ); /* LBA的最低8位 */ CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 16 ) ); CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 24 ) ); /* LBA的最高8位 */ CH375_WR_DAT_PORT( iSectorCount ); /* 扇區(qū)數(shù) */ for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) { /* 數(shù)據(jù)塊計(jì)數(shù) */ c = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( c == USB_INT_DISK_READ ) { /* 等待中斷并獲取狀態(tài),USB存儲(chǔ)器讀數(shù)據(jù)塊,請(qǐng)求數(shù)據(jù)讀出 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ c = CH375_RD_DAT_PORT( ); /* 后續(xù)數(shù)據(jù)的長(zhǎng)度 */ while ( c -- ) *oDataBuffer++ = CH375_RD_DAT_PORT( ); /* 根據(jù)長(zhǎng)度讀取數(shù)據(jù)并保存 */ CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 繼續(xù)執(zhí)行USB存儲(chǔ)器的讀操作 */ } else break; /* 返回錯(cuò)誤狀態(tài) */ } if ( mBlockCount == 0 ) { c = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( c== USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */ } return( c ); /* 操作失敗 */ }


CH375初始化程序,應(yīng)該是先測(cè)試硬件連線,再發(fā)模式設(shè)置。 unsigned char mCH375Init( ) { unsigned char i; #ifdef TEST_CH375_PORT unsigned char c; CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測(cè)試工作狀態(tài) */ CH375_WR_DAT_PORT( 0x55 ); /* 測(cè)試數(shù)據(jù) */ c = CH375_RD_DAT_PORT( ); /* 返回?cái)?shù)據(jù)應(yīng)該是測(cè)試數(shù)據(jù)取反 */ if ( c != 0xaa ) { /* CH375出錯(cuò) */ for ( i = 100; i != 0; i -- ) { /* 強(qiáng)制數(shù)據(jù)同步 */ CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* CH375執(zhí)行硬件復(fù)位 */ c = CH375_RD_DAT_PORT( ); /* 延時(shí) */ } mDelay100mS( ); /* 延時(shí)至少30mS */ } #endif CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 設(shè)置USB工作模式 */ CH375_WR_DAT_PORT( 6 ); /* 模式代碼,自動(dòng)檢測(cè)USB設(shè)備連接 */ for ( i = 0xff; i != 0; i -- ) /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; /* 操作成功 */ if ( i != 0 ) return( 0 ); /* 操作成功 */ else return( 0xff ); /* CH375出錯(cuò),例如芯片型號(hào)錯(cuò)或者處于串口方式或者不支持 */ }

C8051讀寫U盤如果以文件系統(tǒng)操作的話你可以直接調(diào)用我們51的子程序庫(kù);如果以物理扇區(qū)直接操作的話可以參考CH375EVT\PUB\MCS51C\MISCELL\CH375EV0.C。


謝謝各位幫忙


問(wèn)題還是解決不了,還是老問(wèn)題  


按照我們的流程寫的初始化U盤的命令都通過(guò)了嗎???


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

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