No.54401 作者:guest 邮件:guest@guest.com ID:6 登陆:16560次 文章数:7648篇 最后登陆IP:219.68.9.43 最后登陆:2005/5/20 1:37:44 注册:2003/3/10 16:21:00 财富:35062 发帖时间:2004/5/12 22:22:05 发贴者IP:61.143.40.21 标题:guest:ATAPI-CDROM 驱动程序 C51源码 摘要:No.54401ATAPI-CDROM 驱动程序 C51源码 ATAPI-CDROM 驱动程序 C51源码 更多相关资料请访问   //-------------------------------------------// // ATAPI-CDROM 驱动程序 // // // // 这源码为ATAPI基本驱动程序,main()中只有 // // Play功能。 // // 本程序为共享版本,但不得用于商业性质。 // // // // 不提供任何无偿的技术支持。 // // 使用或转载时请保留些版权信息。 // // 更多升级版本请留意: // // 主页: // // 论坛: // // // // 联系方式:pnzwzw@cdle.net // // pnzwzw@163.com // // // //版权所有 2001-2004 明浩// //-------------------------------------------// #include <at89x51.h> #define A0 P0_0 #define A1 P0_1 #define A2 P0_2 #define CS0 P0_3 #define CS1 P0_4 #define WR P0_5 #define RD P0_6 #define RST P0_7 #define CDCOM P0 //CDROM控制线 #define INTRQ P3_7 //INTRQ #define DBM P2 //CDROM数据线高8位 #define DBL P1 //CDROM数据线低8位 //------------------------------------------// // // // P0.0--------------------------------P0.7 // // A0 A1 A2 CS0 CS1 WR RD ACT // // // //------------------------------------------// //用变量设置P0的值,以方便对应于各寄存器的地址值 #define REG_Data 0xE0 #define REG_Err 0xE1 //Features #define REG_Features 0xE1 #define REG_Sector 0xE2 #define REG_CyLow 0xE4 #define REG_CyHig 0xE5 #define REG_DriveHead 0xE6 #define REG_Status 0xE7 //Command #define REG_Command 0xE7 unsigned char code ReadSubP[]={0x42,0x02,0x40,0x01,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00}; //ReadSub命令信息包 unsigned char code ReadTOCP[]={0x43,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00}; //ReadTOC命令信息包 unsigned char code PlayMSFP[]={0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //MSF播放命令信息包 unsigned char data PacketTemp[24]; //信息包暂存RAM,用写数据和读数据的暂存 unsigned char REGBL=0, REGBM=0; //用于暂存读取寄存器的值 unsigned char PacketSize; //用于保存CDROM定义的信息包长度,有12,16 unsigned char bdata CDStatusREG; //可位寻址变量保存CDROM的状态寄存器值 sbit ERR = CDStatusREG^0; //错误 sbit DRQ = CDStatusREG^3; //数据请求 sbit DRDY = CDStatusREG^6; //设备就绪 sbit BSY = CDStatusREG^7; //忙 unsigned char bdata CDErr=0; //保存各种错误标识 sbit INITERR = CDErr^0; //初始化错误 sbit TESTERR = CDErr^1; //CDROM自身诊断错误 sbit UKERR = CDErr^2; //未知错误 unsigned char DEV; //选择驱动器时所用的参数 unsigned char AudioStatus; //当前的播放状态 unsigned char StartTrackNum; //开始曲目 unsigned char EndTrackNum; //结束曲目 unsigned char CurrentTrackNum; //当前曲目 unsigned char CurrentM, CurrentS, CurrentF; //当前MSF值 unsigned char StartM, StartS, StartF; //开始的MSF值 unsigned char EndM, EndS, EndF; //结束的MSF值 void dmsec(unsigned int msec); void RedREG(unsigned char REG); void WriREG(unsigned char LSB, unsigned char MSB, unsigned char REG); void SendPacket(unsigned char SkipDRQ); void TestCD(void); void ReadSub(void); void ReadTOC(unsigned char Track); void ResData(unsigned char Count); void ReadStatus(void); void InitCDROM(void); void BSYWait(void); //void INTRQWait(void); void DRQWait(void); void NDRQWait(void); void LoadPacket(unsigned char code *RT); void TestUnitReady(void); void PlayMSF(void); void main(void) { InitCDROM(); TestUnitReady(); ReadTOC(0xAA); ReadTOC(0x01); PlayMSF(); ReadSub();//测试用 dmsec(1000); while(1); } void dmsec(unsigned int msec) //1ms延时 11.0592MHz /不是太精确 { unsigned int TempCyc; while(msec--) { for(TempCyc=0; TempCyc <125; TempCyc++); } } //写寄存器 void WriREG(unsigned char LSB, unsigned char MSB, unsigned char REG) { CDCOM = REG; //设要写的REG //EA=0;//程序中有中断程序时应先关中断 CS1 = 1; DBL = LSB; DBM = MSB; //写数据 WR = 0; WR = 1; CS1 = 0; //WD,CS1置回 DBL = 0xFF; DBM = 0xFF; dmsec(3); //延时 //EA=1; 在这开中断 } //读寄存器 void RedREG(unsigned char REG) { CDCOM = REG; //设要读的寄存器 //EA=0;//程序中有中断程序时应先关中断 CS1 = 1; RD = 0; //开始读数据线 REGBL = DBL; //从数据线上读状态寄存器值 REGBM = DBM; RD = 1; CS1 = 0; //RD,CS1置回 dmsec(3); //延时 //EA=1; 在这开中断 } void SendPacket(unsigned char SkipDRQ) //Count向CDROM发送信息包的大小 { unsigned char TempCyc; if (!SkipDRQ) NDRQWait(); WriREG(PacketSize, 0xFF, REG_CyLow); //设CyLow,CyHig的值不应小于传输的数量否则PacketCommand时ERR出错 WriREG(0x00, 0xFF, REG_CyHig); // WriREG(DEV, 0xFF, REG_DriveHead); //选择Device 0 WriREG(0xA0,0xFF,REG_Command); //发送A0H,Packet命令,准备发送Packet DRQWait(); //注:有些命令可能返回没有就绪的错误,这里没做考虑 for (TempCyc=0 ......
>>返回讨论的主题
|