导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[guest]ATAPI-CDROM 驱动程序 C51



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 ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:54049毫秒 查询6次