//单片机:STC90C516AD,40MHz //CH432 接收FIFO中断先读入idata,再存入dataBuf,扇区写U盘。最快速度15KByte/s。 #include #include #include #include //absacc.h是绝对地址映射。也就是你把外围电路视作片外数据存储器时,用这个定义它的地址。
/*【【【【============================CH375声明================================】】】】*/ // 以下定义的详细说明请看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 0x3DF1 //CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0x3CF0 //CH375数据端口的I/O地址 */ /*单片机引脚接线 P2.0 A0 P2.7 CS P3.2 INT P3.6 WR P3.7 RD P0.0~P0.7 D0~D7 */ /* 只使用单片机内置的1KB外部RAM: 0000H-01FFH 为磁盘读写缓冲区, 以字节为单位读写文件不需要文件数据读写缓冲区FILE_DATA_BUF */ #define DISK_BASE_BUF_ADDR 0x0100 //外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */ //下面这个一定义会出现"Too large sector size.",所以不要手动定义 #define DISK_BASE_BUF_LEN 512 //默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ /* 如果需要复用磁盘数据缓冲区以节约RAM,那么可将DISK_BASE_BUF_LEN定义为0以禁止在.H文件中定义缓冲区,而由应用程序在调用CH375Init之前将与其它程序合用的缓冲区起始地址置入pDISK_BASE_BUF变量 */ #define FILE_DATA_BUF_ADDR 0x0300 //外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ /* 由于单片机内置的外部RAM只有1KB, 有些单片机还要去掉256字节内部RAM, 只剩下768字节的外部RAM, 其中前512字节由CH375子程序用于磁盘数据缓冲 */ #define FILE_DATA_BUF_LEN 0x0200 //外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */ /*磁盘缓冲区用于分析U盘文件系统,处理FAT和文件名等。文件缓冲区是可选的,但是为了提高速度,文件缓冲区FILE_DATA_BUF应该有几K到几十K的大小。★ 在字节模式下完全不需要文件缓冲区,使用下述的方法禁止文件缓冲区:在主程序中不要定义常量 FILE_DATA_BUF_LEN,那么就不需要文件缓冲区。*/ #define CH375_INT_WIRE INT0 //P3.2, INT0, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */ //#define CH375_INT_NO 0 /* CH375中断号, CH375的中断线INT#引脚连接单片机的INT0引脚 */ //#define CH375_INT_FLAG IE0 /* IE0,CH375中断标志 */ //#define CH375_INT_EN EX0 /* EX0,CH375中断允许 */
#define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 *///★ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */ //★
#include "CH375HF4.H" //如果不需要支持FAT32,那么请选用CH375HF4.H */
unsigned char xdata dataBuf[512] _at_ 0x0500;
sbit P10=P1^0; //发送空中断 sbit P11=P1^1; //接收中断 sbit P12=P1^2; //超时中断 //-------------------------子函数声明----------------------// //void mDelay100mS(); UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ); void mStopIfError( UINT8 iError );
UINT8 i,flag_WR;//由于main()和中断函数中都要用到flag,所以需定义成全局变量 //flag==1时,把word写入U盘 unsigned int tt,RcvNum;//min,sec; //不要写成int //=================================CH375声明 END==========================================// /*【【【【================================CH432声明===============================】】】】*/ #pragma NOAREGS #include "BASE.C" #include "PARA.C" // CH432与单片机的硬件接口层// 硬件标准8位并口方式子程序, CH432Q sbit P35=P3^5; //控制485发送/接收 (因为有一个板子上的432自动控制功能没有实现)
//#define CH432_BPS 19200 // 定义CH432串口0通讯波特率 // #define CH432_BPS1 1382400 // 定义CH432串口1通讯波特率 ////11.0592M下最高波特率1382400bps #define Fpclk 22118400 // 定义内部时钟频率 // #define CH432_INT_WIRE INT1// P3.3 // #define CH432_INT0_WIRE INT1 // #define CH432_INT1_WIRE INT1
//UINT8 SEND_STRING[ ] = { "44444455" }; //UINT8 SEND_STRING1[ ] = { "33333" }; UINT8 buf[8]={"ILoveYou"}; //=================================CH432声明 END==========================================// void InitCH432( void ) // 初始化CH432 // { UINT16 div; UINT8 DLL, DLM; //**********************设置CH432串口1的寄存器*************************// div = ( Fpclk >> 4 ) / CH432_BPS1; DLM = div >> 8; DLL = div & 0xff; WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_DLAB ); // 设置DLAB为1 // WriteCH432Data( CH432_DLL1_PORT, DLL ); // 设置波特率 // //Status = ReadCH432Data( CH432_DLL1_PORT ); WriteCH432Data( CH432_DLM1_PORT, DLM ); WriteCH432Data( CH432_FCR1_PORT, BIT_FCR_RECVTG1 | BIT_FCR_FIFOEN ); // 设置FIFO模式,触发点为14 // WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_PAREN | BIT_LCR_WORDSZ1| BIT_LCR_WORDSZ0 ); // 字长8位,1位停止位、奇校验 // WriteCH432Data( CH432_IER1_PORT, BIT_IER_IERECV | BIT_IER1_CK2X); // 使能中断 // WriteCH432Data( CH432_IER_PORT,BIT_IER_LOWPOWER);//关串口0 WriteCH432Data( CH432_MCR1_PORT, BIT_MCR_OUT2 | BIT_MCR_RTS | BIT_MCR_DTR ); // 中断方式下这个必须开,允许中断输出,DTR,RTS为1 // } /* void UART1_SendByte( UINT8 dat ) // CH432串口1发送一字节子程序 // { P35=1;//控制485收发。0时接收,1时发送 while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 ); // 等待数据发送完毕 // WriteCH432Data( CH432_THR1_PORT, dat ); }*/
UINT8 UART1_RcvByte() // CH432串口1接收一字节子程序 // { UINT8 Rcvdat; P35=0;//控制485收发。0时接收,1时发送 if( !( ReadCH432Data( CH432_LSR1_PORT ) & (BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) // b1-b4无错误 // { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); // 等待数据准备好 // Rcvdat = ReadCH432Data( CH432_RBR1_PORT ); // 从接收缓冲寄存器读出数据 // return( Rcvdat ); } else ReadCH432Data( CH432_RBR1_PORT ); // b1-b4有错误清除 // } /* void UART1_SendStr( UINT8 *str ) // CH432串口1发送一字符串子程序 // { while(1) { if( *str == '\0' ) break; UART1_SendByte( *str++ ); } }*/ /* void CH432Seril1Send( UINT8 *Data, UINT8 Num ) // 禁用FIFO,CH432串口1发送多字节子程序 // { do { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 ); // 等待数据发送完毕 // WriteCH432Data( CH432_THR1_PORT, *Data++ ); } while( --Num ); } */ /*UINT8 CH432Seril1Rcv( UINT8 *buf ) // 禁用FIFO,CH432串口1接收多字节子程序// { UINT8 RcvNum = 0; if( !( ReadCH432Data( CH432_LSR1_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) ) // b1-b4无错误 // { while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 ); // 等待数据准备好// do { *buf++ = ReadCH432Data( CH432_RBR1_PORT ); // 从接收缓冲寄存器读出数据 // RcvNum++; } while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0x01 ); //CH432_LSR1_PORT:CH432线路状态寄存器1。BIT_LSR_DATARDY该位为1表示接收FIFO中有接收到的数据 //CH432_LSR1_PORT最后一位为DATARDY: