各位好,我在用庫四時候這條指令行得通,但是我還庫5這條指令就行不通了,不知道是哪里不正常,請各位指點迷津啊,汗···!CH375FileReadX( void );就這個讀U盤數(shù)據(jù)程序
補充:打開,初始化程序都正常的,就執(zhí)行到這條程序哪里,只見U盤燈閃,但是不能往下執(zhí)行,好像在這個程序中死循環(huán)了。
各位好,我在用庫四時候這條指令行得通,但是我還庫5這條指令就行不通了,不知道是哪里不正常,請各位指點迷津啊,汗···!CH375FileReadX( void );就這個讀U盤數(shù)據(jù)程序
補充:打開,初始化程序都正常的,就執(zhí)行到這條程序哪里,只見U盤燈閃,但是不能往下執(zhí)行,好像在這個程序中死循環(huán)了。
需要看下你的這個函數(shù)的使用。需要有一個指針變量指向一個最少一個扇區(qū)的緩沖區(qū)才能進行數(shù)據(jù)讀。
程序在這里:請上樓大俠指教一下,現(xiàn)在的問題是初始化等其他都正常,可程序執(zhí)行到mp3_play("/離開我.MP3");函數(shù)里面去就在 mStopIfError(CH375FileRead());處處于循環(huán)了,又不出錯又不往下執(zhí)行。現(xiàn)在我用的是庫5和庫5頭文件! 在線等!
/* 2004.06.05 **************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, KC7.0@MCS51 ** **************************************** */ /* CH375 主機文件系統(tǒng)接口 */ /* 支持: FAT12/FAT16/FAT32 */
/* MCS-51單片機C語言的U盤文件讀寫示例程序, 適用于ATMEL/PHILIPS/SST等具有1KB內(nèi)部RAM以及雙DPTR的單片機 */ /* 該程序?qū)盤中的/C51/CH375HFT.C文件中的每512字節(jié)的前100個字符顯示出來, 如果找不到原文件CH375HFT.C, 那么該程序?qū)@示C51子目錄下所有以CH375開頭的文件名, 如果找不到C51子目錄, 那么該程序?qū)@示根目錄下的所有文件名, 最后將程序ROM的前2KB數(shù)據(jù)(4個扇區(qū))寫入新建的文件"程序空間.BIN"中(MCS51單片機的程序代碼的二進制目標數(shù)據(jù)) */ /* CH375的INT#引腳采用查詢方式處理, 數(shù)據(jù)復(fù)制方式為"雙DPTR復(fù)制", 本例只使用512字節(jié)的外部RAM, 同時作為磁盤數(shù)據(jù)緩沖區(qū)和文件數(shù)據(jù)緩沖區(qū), 演示沒有外部RAM但是單片機的內(nèi)置RAM大于768字節(jié)的應(yīng)用 */
/* C51 CH375HFT.C */ /* LX51 CH375HFT.OBJ , CH375HF4.LIB 如果將CH375HF4換成CH375HF6就可以支持FAT32 */ /* OHX51 CH375HFT */
#include #include #include #include #include #include #define uchar unsigned char #define uint unsigned int
/* 以下定義的詳細說明請看CH375HF6.H文件 */ #define LIB_CFG_DISK_IO 2 /* 磁盤讀寫的數(shù)據(jù)的復(fù)制方式,1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_FILE_IO 2 /* 文件讀寫的數(shù)據(jù)的復(fù)制方式,0為"外部子程序",1為"單DPTR復(fù)制",2為"雙DPTR復(fù)制",3為"單DPTR和P2+R0復(fù)制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */ /*#define LIB_CFG_FILE_IO_DEFAULT 1*/ /* 使用CH375HF6.H提供的默認"外部子程序" */
#define CH375_CMD_PORT_ADDR 0x96F1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0x94F0 /* CH375數(shù)據(jù)端口的I/O地址 */ /* 只使用單片機內(nèi)置的1KB外部RAM: 0000H-01FFH 為磁盤讀寫緩沖區(qū), 同時用于文件數(shù)據(jù)緩沖區(qū) */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */ /* 由于單片機內(nèi)置的外部RAM只有1KB, 有些單片機還要去掉256字節(jié)內(nèi)部RAM, 只剩下768字節(jié)的外部RAM, 其中前512字節(jié)由CH375子程序用于磁盤數(shù)據(jù)緩沖, 在調(diào)用CH375DirtyBuffer子程序后同時也用于文件讀寫緩沖 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */ #define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */
#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ #include "CH375HF5.H" /* 如果不需要支持FAT32,那么請選用CH375HF4.H */
/* 在P1.4連接一個LED用于監(jiān)控演示程序的進度,低電平LED亮,當(dāng)U盤插入后亮 */ sbit P1_0 = P1^0;
#define LED_OUT_INIT( ) { P1_0 = 1; } /* P1.4 高電平 */ #define LED_OUT_ACT( ) { P1_0 = 0; } /* P1.4 低電平驅(qū)動LED顯示 */ #define LED_OUT_INACT( ) { P1_0 = 1; } /* P1.4 低電平驅(qū)動LED顯示 */
sbit CS = P2^5; //片選信號 sbit SID = P2^6; //數(shù)據(jù)信號 sbit SCLK= P2^7; //時鐘信號 sbit RS = P2^2; //復(fù)位信號 sbit PSB = P2^4; //并行、串行選擇信號 sbit xCS = P1^4; sbit xRES= P1^3 ; sbit DREQ= P1^2 ; sbit xDCS= P1^1 ;
sbit CH375_A0 = P2^1; sbit CH375_CS = P2^0; sbit CH375_WR = P3^6; sbit CH375_RD = P3^7; /************************************* 延時10×n毫秒程序 **************************************/ void delayms(unsigned int n) //延時10×n毫秒程序 { unsigned int i,j; for(i=0;i for(j=0;j<2000;j++);
}
/******************************************************************** * 名稱 : delay() * 功能 : 延時,延時時間為 100us * t。這是通過軟件延時,有一定誤差。 * 輸入 : t * 輸出 : 無 ***********************************************************************/ void delay(unsigned int t) { unsigned int i,j; for(i=0; i for(j=0; j<10; j++); }
void mDelay1_2uS( ) /* 至少延時1.2uS,根據(jù)單片機主頻調(diào)整 */ { return; }
/**************************************************** 向從器件發(fā)送數(shù)據(jù),同時接收從器件送來的數(shù)據(jù) *********************************************/
uchar spi_write(uchar dat) { SPDAT = dat; //trigger SPI send while (!(SPSTAT & 0x80)); //wait send complete SPSTAT=0xc0; //return SPDAT; //return received SPI data } /************************************************************************* 向VS1003B模塊寫命令 *************************************************************************/ void wr_commd(uchar addr,uchar hdat,uchar ldat) {
DREQ=1; xDCS=1; while(!DREQ); //等待DREQ為高 xCS=0; //命令片選 spi_write(0x02); spi_write(addr); spi_write(hdat); spi_write(ldat); xCS=1;
} /************************************************************* VS1003模塊初始化,軟硬復(fù)位 ************************************************************/ void InitVS1003B() { char i; xRES=0; //vs1003復(fù)位 delayms(10); spi_write(0); xCS=1; xDCS=1; xRES=1; while(!DREQ); delayms(10); wr_commd( SPI_MODE, 0x08, 0x04); //vs1003軟件復(fù)位 while(!DREQ); //等待DREQ為高,軟件復(fù)位結(jié)束 wr_commd( SPI_CLOCKF,0x98, 0x00); //vs1003 3倍頻 while(!DREQ); //等待DREQ為高 wr_commd(SPI_AUDATA,0xbb,0x81); //采樣率48k,立體聲 while(!DREQ); wr_commd(SPI_BASS,0x00,0x55); //重音設(shè)置 while(!DREQ); wr_commd(SPI_VOL,0x01,0x01);//音量設(shè)置 delayms(1); xDCS=0; while(!DREQ);
for (i=0;i<4;i++) //向vs1003發(fā)送四個數(shù)據(jù),以啟動SPI發(fā)送
{spi_write(0);} xDCS=1;
} /*************************************************** 初始化SPI串口 ***************************************************/ void InitSPI() { SPDAT=0; SPSTAT=0xc0; //清除標志位 SPCTL=0xde; //11011101b忽略SS位,先MSB、s主機模式、時鐘空閑時為高電平、起始沿設(shè)置,結(jié)束沿采樣,SPICLK=fosc/16
//IE2=IE2|0x02; //允許SPIF產(chǎn)生中斷 //EA=1; } /*************************************************** 正弦測試程序 ***************************************************/ void sintest( ) { DREQ=1; xRES=0; delayms(10); spi_write(0xff); xCS=1;xDCS=1;xRES=1; delayms(10); wr_commd(SPI_MODE,0x08,0x20); while(!DREQ); xDCS=0; spi_write(0x53); spi_write(0xef); spi_write(0x6e); spi_write(0x24); spi_write(0); spi_write(0); spi_write(0); spi_write(0); delayms(50) ; delayms(50) ; delayms(50) ; delayms(50) ; xDCS=1; xDCS=0; spi_write(0x53); spi_write(0xef); spi_write(0x6e); spi_write(0x44); spi_write(0); spi_write(0); spi_write(0); spi_write(0); delayms(50) ; delayms(50) ; delayms(50) ; delayms(50) ; xDCS=1;
//退出正弦測試 xDCS=0; spi_write(0x45); spi_write(0x78); spi_write(0x69); spi_write(0x74); spi_write(0x00); spi_write(0x00); spi_write(0x00); spi_write(0x00); delayms(50) ; delayms(50) ; delayms(50) ; delayms(50) ; xDCS=1; }
/*************************************** 正弦測試 ****************************************/
void t_est() { while(1) {sintest();} }
/******************************************************************** * 名稱 : sendbyte() * 功能 : 按照液晶的串口通信協(xié)議,發(fā)送數(shù)據(jù) * 輸入 : zdata * 輸出 : 無 ***********************************************************************/ void sendbyte(unsigned char zdata) { unsigned int i; for(i=0; i<8; i++) { if((z
#define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù) 這個2個定義需要分開。否則讀寫的時候會有問題的。 如果你單片機有大于2K的RAM的話,那么這樣定義: #define FILE_DATA_BUF_ADDR 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)
現(xiàn)在我把#define DISK_BASE_BUF_ADDR 0x0200 也是一樣的情況?。∵€是讀不出來
你單片機現(xiàn)在有多少RAM資源?編譯之后是否有RAM溢出的情況?