無中斷?。?!

初始化成功,開機(jī)上電后測得25為低,26為高,2為低,XI=1.91,X0=2.82................................. 但是插上U盤后無任何反應(yīng),也無中斷。 請(qǐng)高手指點(diǎn)哈問題在那里?

(1)主機(jī)模式設(shè)置成功沒?如果是直接操作375的話,必須通過返回值判斷 (2)插入U(xiǎn)盤后,UD+上是否有略高于3V的電壓,若沒有則U盤沒正常工作,檢查USB口供電是否正常,最好在4.7V以上,并測量中斷腳的電平是否為低 (3)USB連線是否正確


1.主機(jī)返回沒成功,返回值為0XFF00 2.插入U(xiǎn)盤后,UD+,UD-均有1.8左右的電壓,中斷腳無低電平 3,USB連線正確


我先用的是375B,現(xiàn)在換成375S后插上U盤有中斷產(chǎn)生了?。?!


主機(jī)沒返回成功那怎么初試化成功的? 返回的是0XFF,還是0X00,不回返回0XFF00的. 做測試命令能否通過?


#include #include "CH375INC.H" /* 定義CH375命令代碼及返回狀態(tài) */ #include /* 以下定義適用于MCS-51單片機(jī),其它單片機(jī)參照修改 */ #define UINT8 unsigned char #define UINT16 unsigned short #define UINT32 unsigned long #define UINT8X unsigned char xdata #define UINT8VX unsigned char volatile xdata /* 以下定義適用于MCS-51單片機(jī),其它單片機(jī)參照修改,為了提供C語言的速度需要對(duì)本程序進(jìn)行優(yōu)化 */ UINT8VX CH375_CMD_PORT _at_ 0xFFF0; /* CH375命令端口的I/O地址 */ UINT8VX CH375_DAT_PORT _at_ 0xBFF0; /* CH375數(shù)據(jù)端口的I/O地址 */

#define CH375_INT_WIRE INT0 /* P3.2, 連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ UINT8X DISK_BUFFER[512*1] _at_ 0x0000; /* 外部RAM數(shù)據(jù)緩沖區(qū)的起始地址,長度不少于一次讀寫的數(shù)據(jù)長度 */

sfr AUXR = 0x8e; //CS直接接地 //A0接P2.6 //無其他硬件

UINT32 DiskStart; /* 邏輯盤的起始絕對(duì)扇區(qū)號(hào)LBA */ UINT8 SecPerClus; /* 邏輯盤的每簇扇區(qū)數(shù) */ UINT8 RsvdSecCnt; /* 邏輯盤的保留扇區(qū)數(shù) */ UINT16 FATSz16; /* FAT16邏輯盤的FAT表占用的扇區(qū)數(shù) */

/* ********** 硬件USB接口層,無論如何這層省不掉,單片機(jī)總要與CH375接口吧 ************************************************************ */

void mDelaymS( UINT8 delay ) { /* 以毫秒為單位延時(shí),不精確,適用于24MHz時(shí)鐘MCS51 */ UINT8 i, j, c; for ( i = delay; i != 0; i -- ) { for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ for ( j = 200; j != 0; j -- ) c += 3; /* 在24MHz時(shí)鐘下延時(shí)500uS */ } }

void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時(shí) */ CH375_CMD_PORT=cmd; for ( cmd = 2; cmd != 0; cmd -- ); /* 發(fā)出命令碼前后應(yīng)該各延時(shí)2uS,對(duì)于MCS51可以不需要延時(shí) */ }

void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */

CH375_DAT_PORT=dat; /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) */ }

UINT8 CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時(shí) */ UINT8 temp;

temp=CH375_DAT_PORT; return( temp ); /* 因?yàn)镸CS51單片機(jī)較慢所以實(shí)際上無需延時(shí) */ }

UINT8 mWaitInterrupt( void ) { /* 等待CH375中斷并獲取狀態(tài),主機(jī)端等待操作完成,返回操作狀態(tài) */ unsigned char i; while( CH375_INT_WIRE ); /* 查詢等待CH375操作完成中斷(INT#低電平) */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷,獲取中斷狀態(tài) */ i=CH375_RD_DAT_PORT( ); printf( "Name: %x\n", i ); return( i ); }

/* ********** BulkOnly傳輸協(xié)議層,被CH375內(nèi)置了,無需編寫單片機(jī)程序 ************************************************************ */

/* ********** RBC/SCSI命令層,雖然被CH375內(nèi)置了,但是要寫程序發(fā)出命令及收發(fā)數(shù)據(jù) ************************************************************ */

UINT8 mInitDisk( void ) { /* 初始化磁盤 */ UINT8 Status; 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ò)誤 */ CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status != USB_INT_SUCCESS ) { /* 出錯(cuò)重試 */ /* 對(duì)于CH375A芯片,建議在此執(zhí)行一次CMD_DISK_R_SENSE命令 */ mDelaymS( 250 ); CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ } if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */ return( 0 ); /* U盤已經(jīng)成功初始化 */ } 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ù)塊 */ //寫數(shù)據(jù)DISK_WRITE 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ù)的長度 */ while ( c -- ){ *oDataBuffer++ = CH375_RD_DAT_PORT( ); /* 根據(jù)長度讀取數(shù)據(jù)并保存 */ putchar(*oDataBuffer); } 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 ); /* 操作失敗 */ }

/* ********** FAT文件系統(tǒng)層,這層程序量實(shí)際較大,不過,該程序僅演示極簡單的功能,所以精簡 ************************************************************ */

UINT16 mGetPointWord( UINT8X *iAddr ) { /* 獲取字?jǐn)?shù)據(jù),因?yàn)镸CS51是大端格式,U盤FAT通常是小端格式,所以轉(zhuǎn)換 */ return( iAddr[0] | (UINT16)iAddr[1] << 8 ); }

UINT8 mIdenDisk( void ) { /* 識(shí)別分析當(dāng)前邏輯盤 */ UINT8 Status; DiskStart = 0; /* 以下是非常簡單的FAT文件系統(tǒng)的分析,正式應(yīng)用絕對(duì)不應(yīng)該如此簡單,否則兼容性和容錯(cuò)性差 */ Status = mReadSector( 0, 1, DISK_BUFFER ); /* 讀取邏輯盤引導(dǎo)信息 */ if ( Status != 0 ) return( Status ); if ( DISK_BUFFER[0] != 0xEB && DISK_BUFFER[0] != 0xE9 ) { /* 不是邏輯引導(dǎo)扇區(qū) */ DiskStart = DISK_BUFFER[0x1C6] | (UINT16)DISK_BUFFER[0x1C7] << 8 | (UINT32)DISK_BUFFER[0x1C8] << 16 | (UINT32)DISK_BUFFER[0x1C9] << 24; Status = mReadSector( DiskStart, 1, DISK_BUFFER ); /* 根據(jù)新的起始扇區(qū)號(hào)讀取邏輯盤引導(dǎo)信息 */ if ( Status != 0 ) return( Status ); } SecPerClus = DISK_BUFFER[0x0D]; /* 每簇扇區(qū)數(shù) */ RsvdSecCnt = DISK_BUFFER[0x0E]; /* 邏輯盤的保留扇區(qū)數(shù) */ FATSz16 = mGetPointWord( &DISK_BUFFER[0x16] ); /* FAT表占用扇區(qū)數(shù) */ return( 0 ); /* 成功 */ }

UINT16 mLinkCluster( UINT16 iCluster ) { /* 獲得指定簇號(hào)的鏈接簇 */ /* 輸入: iCluster 當(dāng)前簇號(hào), 返回: 原鏈接簇號(hào), 如果為0則說明錯(cuò)誤 */ UINT8 Status; Status = mReadSector( DiskStart + RsvdSecCnt + iCluster / 256, 1, DISK_BUFFER ); /* 讀取簇號(hào)所在的FAT扇區(qū) */ if ( Status != 0 ) return( 0 ); /* 錯(cuò)誤 */ return( mGetPointWord( &DISK_BUFFER[ ( iCluster + iCluster ) & 0x01FF ] ) ); /* 取原簇鏈接 */ }

UINT32 mClusterToLba( UINT16 iCluster ) { /* 將簇號(hào)轉(zhuǎn)換為絕對(duì)LBA扇區(qū)地址 */ return( DiskStart + RsvdSecCnt + FATSz16 + FATSz16 + 32 + ( iCluster - 2 ) * SecPerClus ); /* 將簇號(hào)轉(zhuǎn)換為LBA,得當(dāng)前操作的起始LBA */ }

/* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; TMOD = 0x20; TH1 = 0xfa; /* 22.1184 MHz晶振, 9600bps */ TR1 = 1; TI = 1; }

void mStopIfError( UINT8 iErrCode ) { /* 如果錯(cuò)誤則停止運(yùn)行并顯示錯(cuò)誤狀態(tài),正式應(yīng)用還需要分析處理 */ if ( iErrCode == 0 ) return; printf( "Error status, %u\n", (UINT16)iErrCode ); }

void main( ) { UINT8 Status,j; UINT8X *CurrentDir; UINT16 Cluster; mDelaymS( 200 ); /* 延時(shí)200毫秒 */ AUXR=0x02;

mInitSTDIO( ); CH375_WR_CMD_PORT(0X05); mDelaymS( 200 ); /* 延時(shí)200毫秒 */ CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //測試 CH375_WR_DAT_PORT( 0xaa ) ; j=CH375_RD_DAT_PORT( ) ; printf("test:%x\n",j);

CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 初始化CH375,設(shè)置USB工作模式 */ CH375_WR_DAT_PORT( 6 ); /* 模式代碼,自動(dòng)檢測USB設(shè)備連接 */

while ( 1 ) { printf( "Insert USB disk\n" ); while ( mWaitInterrupt() != USB_INT_CONNECT ); /* 等待U盤連接 */ mDelaymS( 250 ); /* 延時(shí)等待U盤進(jìn)入正常工作狀態(tài) */ printf("1"); Status = mInitDisk( ); /* 初始化U盤,實(shí)際是識(shí)別U盤的類型,不影響U盤中的數(shù)據(jù),在所有讀寫操作之


void main( ) { UINT8 Status,j; UINT8X *CurrentDir; UINT16 Cluster;

mDelaymS( 200 ); /* 延時(shí)200毫秒 */ AUXR=0x02;

mInitSTDIO( ); CH375_WR_CMD_PORT(0X05); mDelaymS( 200 ); /* 延時(shí)200毫秒 */ CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //測試 CH375_WR_DAT_PORT( 0xaa ) j=CH375_RD_DAT_PORT( ) //返回值 printf("test:%x\n",j);

CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 初始化CH375,設(shè)置USB工作模式 */ CH375_WR_DAT_PORT( 6 ); /* 模式代碼,自動(dòng)檢測USB設(shè)備連接 */

1.返回值一直是0XFF00 2.開機(jī)在串口助手顯示為test:ff00 Insert USB disk 3.插上U盤后顯示為:Name: ff00 Name: ff00 Name: ff00 Name: ff00 Name: ff00 Name: ff00 Name: ff00 Name: ff00 Name: ff00


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

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