《PC机利用8253播放音乐.doc》由会员分享,可在线阅读,更多相关《PC机利用8253播放音乐.doc(12页珍藏版)》请在金锄头文库上搜索。
1、实验报告可编程接口芯片 利用PC机驱动可编程芯片 _摘要 外部设备种类很多,但CPU的设计不能保证兼容所有的外设,因此也就不能和外设直接交互,需要接口作为桥梁。I/O接口作为中介完成了CPU与外设之间信息的交互。 常见的I/O接口有软盘控制器、CRT显示控制器、键盘及打印控制器、可编程并行接口、可编程串行接口、模/数和数/模转换接口、可编程终端控制器、DMA控制器等。 实验目的:l 学习理解接口的特点和分类。l 了解常见可编程接口芯片(8259A、8237A、8255A、8250、8251A、8253A、ADC0809)的内部结构,学习可编程接口芯片的编程控制方法。l 学习了解个人计算机系统的
2、硬件结构。一、 实验内容:l 利用PC上的定时/计数芯片8253A控制PC扬声器发声。编写内核模块,直接操作扬声器相关端口,或字符设备驱动,供应用程序调用,用扬声器演奏一段乐曲。l 完成UART的驱动,与自编的应用程序结合,实现特定的功能(如UART的双击通信)。二、 实验原理概述: 接口的特点与分类 接口的种类很多,大致有以下几种分类方法: 1. 按照接口电路数据传送方式可以分为串行和并行。串行传送适合于远距离通信;并行传送适于高速传输。 2. 从数据收发同步方式划分,可分为同步方式和异步方式。同步方式采用统一的时钟;异步通过时钟信号线或从接收信号中提取同步信息。 3. 按控制方式有简单方式
3、和握手控制方式。简单方式中,发送方仅仅输出数据,而不必了解对方状态;握手控制方式中的信息交互过程中通过握手信号线了解对方的状态,保证传输的可靠性。 8255芯片简述 8255引脚图 8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具有A、B、C三个并行接口,+5V单电源供电。 1. 8255能在三种方式下工作:方式0基本输入/输出方式方式1选通输入/输出方式方式2双向选通输入/输出方式 2. 8255引脚图如右图所示,各引脚功能如:D7D0与CPU侧连接的八条双向数据线;WR(低电平有效) 写输入信号;RD(低电平有效) 读输入信号;CS(低电平有效) 片选输入信号;
4、A0、A1 片内寄存器选择输入信号;PA7PA0 A口外设双向数据线;PB7PB0 B口外设双向数据线;PC7PC0 C口外设双向数据线; RESET 复位输入信号 3. 8255端口地址寄存器A口B口C口控制寄存器端口地址60H61H62H63H 8253芯片简述 8253可编程定时/计数器是Intel公司生产的通用外围芯片之一,有3个独立的十六位计数器,技术频率范围为02MHz,它所有的技术方式和操作方式都通过编程控制。8253引脚图 1. 8253有六种工作方式:方式0:计数结束中断方式1:可编程频率发生器方式2:频率发生器方式3:方波频率发生器方式4:软件触发的选通信号方式5:硬件触发
5、的选通信号 2. 8253引脚图如右图所示,各引脚功能如下:D7D0 八条双向数据线;WR(低电平有效) 写输入信号;RD(低电平有效) 读输入信号;CS(低电平有效) 片选输入信号;A0、A1 片内寄存器地址输入信号;CLK 计数输入,用于输入定时基准脉冲或计数脉冲;OUT 输出信号,以相应的电平指示计数的完成,或输出脉冲波形;GATE 选通输入,用于启动或禁止计数器的操作,以使计数器和计测对象同步。 3. 8253端口地址寄存器0#计数器1#计数器2#计数器控制寄存器端口地址40H41H42H43H 8251芯片简述 8251A是Intel公司生产的通用串行通信接口,可以工作在同步、异步方
6、式下。 1. 8251A的内部结构如下图所示。 由发送器、接收器、数据总线缓冲器、读/写控制电路、调制解调控制电路组成。8251A内部结构 2. 8251A的引脚功能,如右图所示: 片选信号; D0-D7 双向数据线; 读信号; 写信号;VCC 电源输入; GND 地;C/:控制/数据信号;TXRDY:发送器准备好信号;TXE:发送器空信号;RXRDY:接收器准备好信号;SYNDET:同步检测信号,只用于同步方式;:数据终端准备好信号;:数据设备准备好信号;:请求发送信号; :允许发送信号;TXD:发送器数据输出信号; RXD:接收器数据输入信号;CLK:时钟输入,用来产生8251A器件的内部
7、时序;TXD:发送器时钟输入; RXD:接收器时钟输入。 PC机上的可编程定时器/计数器 早期的个人计算机中,有一片可编程的定时器/计数器8253,作为系统的硬件时钟设备。8253在系统中占用40H43H端口。三个定时器/计数器的时钟输入均为1.19MHz,各自承担以下功能: 1. T/C0,系统的日时钟,初始化为工作方式三,计数初值为0,输出接往可编程中断控制器8259A的IR0,作为系统的计时中断信号。 2. T/C1,动态存储器刷新时钟,初始化为工作方式二,计数初值为12H。 3. T/C2,控制系统的扬声器,产生声音信号。它的控制端GATE2和扬声器前均接有控制信号。这些控制信号来自可
8、编程I/O接口芯片8255的PB0和PB1。8255初始化已将B口设为方式0输出。 主中断控制器8259A占用20H和21H端口,其IR2供级联次中断控制器输入。如果存在,次中断控制器端口为0A0H和0A1H。个人计算机为可编程并行接口8255A分配端口60H63H,初始化后A口作为键盘输入端口,B口用于一些控制信号输出。 目前的计算机中,尽管以上各个独立的功能芯片都已经不存在,但系统集成化后的功能依旧保留,结构原理和编程控制方法也几乎完全一样。 UART在个人计算机中的发展 IBM为其第一款个人计算机(PC)配备了8250的串行卡。8250没有发送/接收缓冲器,因此其速度相对较慢。在推出IB
9、M-PC/AT时选用了更高性能的芯片16450。它带有一个发送/接收缓冲器,并修正了就芯片的缺陷。随着National Semiconductor公司推出的引脚兼容的UART芯片16550A和16650,使得个人计算机配置的串行通信性能不断提高。目前的个人计算机系统不再使用单独的UART芯片,同其他可编程器一样,已被更高性能的芯片集成。从软件的角度来看操作系统和应用程序的操作好像单独的UART仍然装在串行适配卡上一样。 在标准配置中,个人计算机串行端口的基地址为3F8H、2F8H、3E8H。对串行的变成兼容16550UART规范。一般的初始化顺序是: 1. 将DLAB置1,写除数寄存器设置波特
10、率。个人计算机提供给UART的时钟为1.8432MHz,波特率为1843200/(16*除数值); 2. 置DLAB为0,设置其工作方式(数据位、校验位等等)。 下面就可以对数据端口进行输入/输出操作了。更具工作方式的要求,还需要对数据状态进行查询、错误监测以及调制解调器的控制等等。 Linux操作系统对串口的操作通过设备文件/dev/ttySx完成。三、 实验记录与分析:l 8253驱动模块设计 (完整代码见附录一 pc_8253.c) 1. speaker_open函数 为防止同时打开两个相同的设备,设置全局变量static int Device_Open=0。open后,Device_O
11、pen加1。若再次打开,则检测到Device_Open不为0,返回忙碌值。代码如下: if (Device_Open) return -EBUSY; Device_Open+; 初始化8253。即向8253写命令字。outb_p(0xb6,0x43); /0x43为8253控制端口。10110110B,计数器2,16位初值,工作 / 方式3 (方波发生器),二进制。 2. speaker_release函数 Device_Open -; /Device_Open减一,以便下次open。 3. speaker_write函数 向计数器2初值寄存器写入初值。outb_p(buffer0,0x42)
12、; outb_p(buffer1,0x42); /0x42为T/C2数据口,先写低位再写高位。 4. speaker_ioctl函数 设备控制函数。笔者设计了两个控制命令,分别为: SPEAKER_OPEN 打开扬声器。 扬声器接受两个发声信号:一个来自定时器芯片(8253)的通道2的输出信号OUT2;另一个来自8255端口B的第一位发出的信号。8255芯片通过PB1和PB0两位来选择扬声器的驱动。当PB0为1时,控制8253定时器发出脉冲,当PB1为1时,扬声器的与门电路接通并一直保持到PB1变到0时关闭。 故PC机扬声器的发声原理应如下图所示:SPEAKER_OPEN实现方法如下:bit=
13、inb_p(0x61); /读8255的PB口。bit保存PB口输出的初值。outb_p(3|bit,0x61); /置位PB0、PB1,打开扬声器。 8255的PB口被设置为输出,不能输入。inb_p(0x61)实现的不是读数据线上的电平,而是读取8255数据缓冲器中的值。用以下代码可以证明输出口PB是可以inb的。 iopl(3); /改变当前进程I/O端口的权限级别 bit=0; bit=inb(0x61); printf(%dn,bit); 若输出为不为0,说明bit被改变,可以通过inb(0x61)读到缓冲器中的值。执行上述测试代码,输出为49,故以上SPEAKER_OPEN的设计是
14、合理的。 SPEAKER_CLOSE 关闭扬声器outb_p(0xfc|bit,0x61); /PB0,PB1清零,关闭扬声器 8055的B口用于一些控制信号输出,为防止破坏系统,除了PB0,PB1,其他各位均应保持与初值一致。0xfc|bit实现了这一点,这就是SPEAKER_OPEN时要读8255的PB口的原因。 5. 模块入口出口函数init_module(),cleanup_module()。 这在“设备驱动程序”实验中已经做过多次并在报告中详细说明,略。这里的设备名设为speaker,静态申请设备号,主设备号为123。 6. 编译make(完整的Makefile见附录一 Makefile),生成目标文件pc_8253.ko;添加环境变量export PATH=/sbin/:$PATH;加载模块,insmod pc_8253.ko,创建设备节点mknod speaker c 123 0 -m 666l 调用上述8253驱动的应用程序设计(完整代码见附录一 musi