扩展你的电脑接口
光驱改装CD播放机
——IDE接口应用实例

🏠 首页 《无线电》杂志 2004年 🔗 第7期 🔗 第30页 分类:电脑与单片机 🔗 温正伟 🔗

在多数的电脑爱好者手中很多都会有两台或更多的光驱,旧的光驱读盘能力下降,很少再使用了,但丢弃了也可惜。本期文章,笔者将介绍把光驱改装成CD播放机的方法,当然这里介绍的改装不是指利用光驱本身所带的播放键(大部分光驱没有播放键)去改装,而是通过单片机对光驱的IDE/ATAPI接口进行控制,使光驱现实现CD播放机的功能。通过本实例读者也可以了解到一些IDE/ATAPI接口的相关知识。本文介绍的改装后的CD播放机具有播放、前进、后退、停止、开关托盘控制及出错指示等功能。

IDE(ATAPI接口)简介

IDE是 Integrated Drive Electronics(集成设备电子部件)的缩写,是一种硬盘接口,新版的 IDE 命名为 ATA ,但在更多的时候人们会习惯叫回名“IDE”,这种接口一直被应用在硬盘的连接上。而ATAPI则是在ATA上扩展出来的接口,ATAPI是AT Attachment Packet Interface的缩写,意思是AT计算机上附加设备的信息包接口。支持ATAPI的IDE接口可以像连接硬盘一样连接ATAPI设备。目前绝大多数IDE接口都支持ATAPI,它被广泛应用于光驱、ZIP驱动器等设备上。IDE/ATAPI接口的界面都是如图1所示,图1的连接件用于主机板和IDE设备上,是40脚的针式接头,主板上有两个这样的接口,可以连接4个IDE设备。图2则是用于连接主机和IDE设备的40芯IDE线缆,现在也有80芯线缆用于连接更新版的高速ATA。图3则是IDE接口连接件的引脚图。

图1
图1 🔍原图 (852×317)
图2
图2 🔍原图 (600×450)
图3
图3 🔍原图 (591×338)

IDE(ATAPI)引脚定义

表2为IDE(ATAPI)引脚定义,下面是几个在本文实例中要使用的引脚的具体说明:

图4
图4 🔍原图 (607×547)

1. DD(15∶0)Device Data

DD占用3~18引脚,是一个8位或16位的双向数据线,在用于读写光驱的寄存器时只使用低8位,而在传送信息包或数据时使用全部16位。


2. CS(1∶0)Chip Select

CS0、CS1用于选择指令寄存器芯片,为低电平有效,它和DA组合就可以选择所要操作的寄存器。


3. DA(2∶0)Device Address

DA为三位的地址线,和CS组合选取要操作的寄存器。


4. DIOR(Device I/O read)

DIOR为控制寄存器或数据口读的引脚,低电平有效。


5.DIOW(Device I/O write)

DIOW为控制寄存器或数据口写的引脚,低电平有效。


6. RESET

当此引脚为低电平时,光驱会被复位。

上述6种引脚都在实例电路中一一连接在51单片机的I/O引脚上,我们可以根据光驱引脚所要求的电平去实现相应引脚的功能,如RESET引脚为低电平有效,连接于单片机的P0.7引脚上,用如下的51C语言就可以对光驱实行复位操作:

P0_7 = 0; //拉低P0_7,RESET为低,

复位开始

dmsec(100); //调用延时函数延时一

段时间

P0_7 = 1; //拉高RESET,复位完成

硬件电路原理

图4是电路原理图,表1是本实例所用元件列表,本实例中使用51单片机作为控制芯片,用它的P1、P2口组成16位的数据输入输出口,连接IDE的D0~D15数据线。P0口用于连接IDE的读写控制、复位和寄存器控制,由于P0口的驱动力比较低,所以用10k的排阻对其上拉。该电路对晶振没有什么特别的要求,可以选用11.0592MHz或12MHz晶振,与上电复位电路组成典型的单片机最小系统。P3口则用于播放、前进、后退、停止和开关托盘控制按键的输入,P3.7接一个发光二极管用于显示光驱是否装载了CD光盘或是否出错了,出错或没有光盘时该LED会点亮。电路连接无误后,将编译好的HEX文件烧录到51芯片上,就可以正常工作了。

光驱需要的电流比较大,一般要一点几安培的电流,且要用到+5V和+12V两个电压,在制作时可以使用开关电源模块或使用旧电脑上的AT电源(也是开关电源),如果用普通的电压器加7805、7812则不能满足要求。还有一点值得注意的是IDE连接电缆的红色线为1号线,其他则顺序排列到40号,同时要把光驱后面板上的跳线设置为主盘(MASTER)。本文介绍的单片机源码只实现播放、前进、后退、停止和开关托盘控制这几个功能,在这个基础上可以加上LED数码管或LCD以显示曲目时间等信息,也可以加入遥控接收等功能,这个播放装置更高版本的硬件电路原理图和单片机固件源码过一段时间都可以到笔者的网站http://www.cdle.net下载取得,高版本将会支持LCD显示和遥控。

编程思路

像其他电脑接口或单片机应用制作一样,本实例的难点在于单片机控制程序的编写。ATAPI协议是从ATA协议发展出来的,它的控制命令和返回的数据格式十分繁复,用于光驱时对于不同形式的光盘,控制命令的使用方式也不太一样,本文是把光驱改为CD播放器,所以编程的重点在于CD音频光盘的控制命令如何发送到光驱上的ATAPI接口。ATAPI有许多寄存器,操作这些不同的寄存器便可以实现相应的功能,如读状态寄存器应先设置好CS和DA,选定要操作的是状态寄存器,把DIOW引脚电平拉低,这时就可以读ATAPI的数据线DD了,得到当前的设备状态,再把DIOW拉高完成读取,在本文的源码中可以参看void ReadStatus(void)函数。在发送控制命令时,可以分为两类,分别为ATA Command(ATA命令)和ATAPI Packet Command(ATAPI信息包命令),前者只要先选择要操作的是命令寄存器,再向数据口发一个命令字节就可以实现所要的功能,如先选择命令寄存器再发送A1H到数据口,就可以执行识别光驱的自检命令,命令完成后读数据口可以得到光驱的相关信息,如型号、序列号等,源码中可以参看void InitCDROM(void)中的相关语句。后者的使用则相对复杂一些,发送信息包时,先要向传输字节计数寄存器中写入要发送的字节数,再送A0H信息命令字到命令寄存器,通知设备要发送信息包,最后向数据寄存器发送信息包。一般信息包为12个字节,第一个字节为命令字,代表此信息包的功能,其后的是参数,程序实现可以参看void SendPacket(unsigned char SkipDRQ)函数。

光驱播放CD时有一系列的动作,先是上电复位、光盘托盘打开、放入光盘托盘关闭、读取曲目播放。使用单片机对光驱进行CD播放控制时也应该有这样的顺序,在本文源码中的主程序中先是调用初始化函数,对光驱进行复位和识别,初始化成功后就会调用读取TOC函数,读取曲目和相关值,然后再对按钮进行判断,做出相应的控制。本实例的单片机源程序的文本文件可以在本期配刊光盘的“本期程序”文件夹中找到,编译好的单片机固件文件可在http://www.cdle.net/alldata/mymz/0405701.htm上下载。

调试经验

图5是笔者用于实验和调试的电路实物照片。调试时使用自制的兼容F-MON51的仿真器和Keil集成开发环境连接可以方便地进行单步和断点调试,同时也可以查看名RAM和变量的值。这样的查看对于类似的制作是很关键的,因为在发送或读取设备的寄存器后,通常设备会有一些状态值返回,程序则要求根据这些值做相应的处理,如果是直接烧片调试则会使得程序的调试过程变得非常困难。

(文/温正伟)