各位好,我在用库四时候这条指令行得通,但是我还库5这条指令就行不通了,不知道是哪里不正常,请各位指点迷津啊,汗···!CH375FileReadX( void );就这个读U盘数据程序
补充:打开,初始化程序都正常的,就执行到这条程序哪里,只见U盘灯闪,但是不能往下执行,好像在这个程序中死循环了。
各位好,我在用库四时候这条指令行得通,但是我还库5这条指令就行不通了,不知道是哪里不正常,请各位指点迷津啊,汗···!CH375FileReadX( void );就这个读U盘数据程序
补充:打开,初始化程序都正常的,就执行到这条程序哪里,只见U盘灯闪,但是不能往下执行,好像在这个程序中死循环了。
需要看下你的这个函数的使用。需要有一个指针变量指向一个最少一个扇区的缓冲区才能进行数据读。
程序在这里:请上楼大侠指教一下,现在的问题是初始化等其他都正常,可程序执行到mp3_play("/离开我.MP3");函数里面去就在 mStopIfError(CH375FileRead());处处于循环了,又不出错又不往下执行。现在我用的是库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 主机文件系统接口 */ /* 支持: FAT12/FAT16/FAT32 */
/* MCS-51单片机C语言的U盘文件读写示例程序, 适用于ATMEL/PHILIPS/SST等具有1KB内部RAM以及双DPTR的单片机 */ /* 该程序将U盘中的/C51/CH375HFT.C文件中的每512字节的前100个字符显示出来, 如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名, 如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名, 最后将程序ROM的前2KB数据(4个扇区)写入新建的文件"程序空间.BIN"中(MCS51单片机的程序代码的二进制目标数据) */ /* CH375的INT#引脚采用查询方式处理, 数据复制方式为"双DPTR复制", 本例只使用512字节的外部RAM, 同时作为磁盘数据缓冲区和文件数据缓冲区, 演示没有外部RAM但是单片机的内置RAM大于768字节的应用 */
/* 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 /* 磁盘读写的数据的复制方式,1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */ #define LIB_CFG_FILE_IO 2 /* 文件读写的数据的复制方式,0为"外部子程序",1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */ #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数据端口的I/O地址 */ /* 只使用单片机内置的1KB外部RAM: 0000H-01FFH 为磁盘读写缓冲区, 同时用于文件数据缓冲区 */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度 */ /* 由于单片机内置的外部RAM只有1KB, 有些单片机还要去掉256字节内部RAM, 只剩下768字节的外部RAM, 其中前512字节由CH375子程序用于磁盘数据缓冲, 在调用CH375DirtyBuffer子程序后同时也用于文件读写缓冲 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */ #define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */
#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */ #include "CH375HF5.H" /* 如果不需要支持FAT32,那么请选用CH375HF4.H */
/* 在P1.4连接一个LED用于监控演示程序的进度,低电平LED亮,当U盘插入后亮 */ sbit P1_0 = P1^0;
#define LED_OUT_INIT( ) { P1_0 = 1; } /* P1.4 高电平 */ #define LED_OUT_ACT( ) { P1_0 = 0; } /* P1.4 低电平驱动LED显示 */ #define LED_OUT_INACT( ) { P1_0 = 1; } /* P1.4 低电平驱动LED显示 */
sbit CS = P2^5; //片选信号 sbit SID = P2^6; //数据信号 sbit SCLK= P2^7; //时钟信号 sbit RS = P2^2; //复位信号 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,根据单片机主频调整 */ { return; }
/**************************************************** 向从器件发送数据,同时接收从器件送来的数据 *********************************************/
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模块初始化,软硬复位 ************************************************************/ void InitVS1003B() { char i; xRES=0; //vs1003复位 delayms(10); spi_write(0); xCS=1; xDCS=1; xRES=1; while(!DREQ); delayms(10); wr_commd( SPI_MODE, 0x08, 0x04); //vs1003软件复位 while(!DREQ); //等待DREQ为高,软件复位结束 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); //重音设置 while(!DREQ); wr_commd(SPI_VOL,0x01,0x01);//音量设置 delayms(1); xDCS=0; while(!DREQ);
for (i=0;i<4;i++) //向vs1003发送四个数据,以启动SPI发送
{spi_write(0);} xDCS=1;
} /*************************************************** 初始化SPI串口 ***************************************************/ void InitSPI() { SPDAT=0; SPSTAT=0xc0; //清除标志位 SPCTL=0xde; //11011101b忽略SS位,先MSB、s主机模式、时钟空闲时为高电平、起始沿设置,结束沿采样,SPICLK=fosc/16
//IE2=IE2|0x02; //允许SPIF产生中断 //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() * 功能 : 按照液晶的串口通信协议,发送数据 * 输入 : zdata * 输出 : 无 ***********************************************************************/ void sendbyte(unsigned char zdata) { unsigned int i; for(i=0; i<8; i++) { if((z
#define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0000 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据 这个2个定义需要分开。否则读写的时候会有问题的。 如果你单片机有大于2K的RAM的话,那么这样定义: #define FILE_DATA_BUF_ADDR 0x0200 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据
现在我把#define DISK_BASE_BUF_ADDR 0x0200 也是一样的情况啊!还是读不出来
你单片机现在有多少RAM资源?编译之后是否有RAM溢出的情况?