2008年4月30日 星期三

AES/EBU From Wikipedia, the free encyclopedia

The digital audio standard frequently called AES/EBU, officially known as AES3, is used for carrying digital audio signals between various devices. It was developed by the Audio Engineering SocietyEuropean Broadcasting Union (EBU) and first published in 1985, later revised in 1992 and 2003. Both AES and EBU versions of the standard exist. Several different physical connectors are also defined as part of the overall group of standards. A related system, S/PDIF, was developed essentially as a consumer version of AES/EBU, using connectors more commonly found in the consumer market. (AES) and the

Contents

[hide]

[edit] Hardware connections

The AES3 standard parallels part 4 of the international standard IEC 60958. Of the physical interconnection types defined by IEC 60958, three are in common use:

The AES-3id standard defines a 75-ohm BNC electrical variant of AES3. More recently, professional equipment (notably by Sony) has used this physical interconnection type. This uses the same cabling, patching and infrastructure as analogue or digital video, and is thus common in the broadcast industry.

F05 connectors, 5mm connectors for plastic optical fiber, are more commonly known by their Toshiba brand name, TOSLINK. The precursor of the IEC 60958 Type II specification was the Sony/Philips Digital Interface, or S/PDIF. For details on the format of AES/EBU data, see the article on S/PDIF. Note that the electrical levels differ between AES/EBU and S/PDIF.

For information on the synchronization of digital audio structures, see the AES11 standard. The ability to insert unique identifiers into an AES3 bit stream is covered by the AES52 standard.

Other AES3 transport structures.

AES3 digital audio format can also be carried over an Asynchronous Transfer Mode network. The standard for packing AES3 frames into ATM cells is AES47, and is also published as IEC 62365.

[edit] The Protocol

Simple representation of the protocol for both AES/EBU and S/PDIF
Simple representation of the protocol for both AES/EBU and S/PDIF

The low-level protocol for data transmission in AES/EBU and S/PDIF is largely identical, and the following discussion applies for S/PDIF as well unless otherwise noted.

AES/EBU was designed primarily to support PCM encoded audio in either DAT format at 48 kHz or CD format at 44.1 kHz. No attempt was made to use a carrier able to support both rates, instead AES/EBU allows the data to be run at any rate, and recovers the clock rate by encoding the data use Biphase mark code (BMC).

The bit stream consists of the PCM audio data broken down into small samples and inserted into a larger structure that also carries various status and information data. The highest level organization is the audio block, which roughly corresponds to a number of samples of the PCM data. Each block is broken into 192 frames numbered 0 to 191. Each frame is further divided in 2 subframes (or channels): A (left) and B (right). Each subframe contains the information for one single sample of the PCM audio, or more simply, one channel of audio. Each subframe is organized into 32 time slots numbered 0 to 31, each of which corresponds roughly to a single bit. Not all of the time blocks send actual audio data, a number of them are set aside for signaling use, and others for transmitting data about the channels. In normal use only 20 time blocks are used for audio, providing a 20-bit sound quality (compare with a CD at 16 bits per sample). So a complete audio block basically contains 192 samples from two channels of audio and other data, containing 12288 bits in total.

The 32 bits of the time slots are used as following:

[edit] Time slots 0 to 3

They do not actually carry any data but they facilitate clock recovery and subframe identification. They are not BMC encoded so they are unique in the data stream and they are easier to recognize, but they don't represent real bits. Their structure minimizes the DC component on the transmission line. Three preambles are possible :

  • X (or M) : 11100010 if previous time slot was "0", 00011101 if it was "1". Marks a word for channel A (left) that isn't at the start of the data block.
  • Y (or W) : 11100100 if previous time slot was "0", 00011011 if it was "1". Marks a word that isn't for channel A (eg a word for channel B (right) in a stereo signal).
  • Z (or B) : 11101000 if previous time slot was "0", 00010111 if it was "1". Marks a word for channel A (left) at the start of the data block.

They are called X, Y, Z from AES standard; M, W,B from the IEC 958 (an AES extension).

The 8-bit preambles are transmitted in the same time allocated to four time slots at the start of each sub-frame (time slots 0 to 3).

[edit] Time slots 4 to 7

These time slots can carry auxiliary information such as a low-quality auxiliary audio channel for producer talkback or studio-to-studio communication. Alternately, they can be used to enlarge the audio word-length to 24 bits, although the devices at either end of the link must be able to use this non-standard format.

[edit] Time slots 8 to 27

These time slots carry 20 bits of audio information starting with LSB and ending with MSB. If the source provides fewer than 20 bits, the unused LSBs will be set to the logical "0" (for example, for the 16-bit audio read from CDs bits 8-11 are set to 0).

[edit] Time slots 28 to 31

These time slots carry associated bits as follows:

  • V (28) Validity bit: it is set to zero if the audio sample word data are correct and suitable for D/A conversion. Otherwise, the receiving equipment may be instructed to mute its output during the presence of defective samples. It is used by most CD players to indicate that concealment rather than error correction is taking place.
  • U (29) User bit: any kind of data such as running time, song, track number, etc. One bit per audio channel per frame form a serial data stream. Each audio block has a single 192 bit control word.
  • C (30) Channel status bit: its structure depends on whether AES/EBU or S/PDIF is used.
  • P (31) Parity bit: for error detection. A parity bit is provided to permit the detection of an odd number of errors resulting from malfunctions in the interface. If set, it indicates an even parity.

[edit] The Channel Status Bit in AES/EBU

As stated before there is one channel status bit in each subframe, making one 192 bit word for each channel in each block. This 192 bit word is usually presented as 192/8 = 24 bytes. The contents of the channel status bit are completely different between the AES3 and SPDIF standards. In the case of AES3, the standard describes in detail how the bits have to be used. Here is an overview showing the broad aims of the 24 bytes:

  • byte 0: basic control data: sample rate, compression, emphasis
  • byte 1: indicates if the audio stream is stereo, mono or some other combination
  • byte 2: audio word length
  • byte 3: used only for multichannel applications
  • byte 4: suitability of the signal as a sampling rate reference
  • byte 5: reserved
  • bytes 6 – 9 and 10 – 13: two slots of four bytes each for transmitting ASCII characters.
  • bytes 14 – 17: 4-byte/32-bit sample address, incrementing every frame
  • bytes 18 – 21: as above, but in time-of-day format (numbered from midnight)
  • byte 22: contains information about the reliability of the audio block.
  • byte 23: CRC. The absence of this byte implies interruption of the data stream before the end of the audio block, which is therefore ignored

[edit] See also

[edit] References

[edit] External links

2008年4月23日 星期三

PS/2 PC键盘编程参考资料

PS/2 PC键盘编程的参考资料

一.电气特性

1

DATA

Key Data

2

n/c

Not connected

3

GND

Gnd

4

VCC

Power , +5 VDC

5

CLK

Clock

6

n/c

Not connected

二.数据格式

1个起始位 总是逻辑0
8个数据位 (LSB)低位在前
1个奇偶校验位 奇校验
1个停止位 总是逻辑1
1个应答位 仅用在主机对设备的通讯中

表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。

三.PS/2 发送数据到PC的时序

键盘接口时序(a) 键盘发送时序;(b) 键盘接收时序

注:在时钟的下降沿读取数据.以下可做具体写程序参考

从PS/2向PC机发送一个字节可按照下面的步骤进行:
(1)检测时钟线电平,如果时钟线为低,则延时50μs;
(2)检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);
(3)检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时PC机在向 PS/2设备发送数据,所 以PS/2设备要转移到接收程序处接收数据);
(4)延时20μs(如果此时正在发送起始位,则应延时40μs);
()输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确保PC机没有抑制PS/2设备,如果有则中止发送;
()输出8个数据位到数据线上;
()输出校验位;
()输出停止位(1);
()延时30μs(如果在发送停止位时释放时钟信号则应延时50μs);


通过以下步骤可发送单个位:
(1)准备数据位(将需要发送的数据位放到数据线上);
(2)延时20μs;
(3)把时钟线拉低;
(4)延时40μs;
(5)释放时钟线;
(6)延时20μs。

PS/2设备从PC机接收一个字节

由于PS/2设备能提供串行同步时钟,因此,如果PC机发送数据,则PC机要先把时钟线和数据线置为请求发送的状态。PC机通过下拉时钟线大于100μs 来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。当PS/2设备检测到需要接收的数据时,它会产生时钟信号并记录下面8个数据位和 一个停止位。主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。而PS/2设备则要配合PC机才能读到准确的数据。具体连接步骤如下:
(1)等待时钟线为高电平。
(2)判断数据线是否为低,为高则错误退出,否则继续执行。
(3)读地址线上的数据内容,共8个bit,每读完一个位,都应检测时钟线是否被PC机拉低,如果被拉低则要中止接收。
(4)读地址线上的校验位内容,1个bit。
(5)读停止位。
(6)如果数据线上为0(即还是低电平),PS/2设备继续产生时钟,直到接收到1且产生出错信号为止(因为停止位是1,如果PS/2设备没有读到停止位,则表明此次传输出错)。
(7 输出应答位。
(8) 检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误。
(9)延时45 μs,以便PC机进行下一次传输。

读数据线的步骤如下:
(1)延时20μs;
(2)把时钟线拉低??
(3)延时40μs??
(4)释放时钟线??
(5)延时20μs??
(6)读数据线。

下面的步骤可用于发出应答位;

(1)延时15μs;
(2)把数据线拉低;
(3)延时5μs;
(4)把时钟线拉低;
(5)延时40μs;
(6)释放时钟线;
(7)延时5μs;
(8)释放数据线。

四.键盘返回值介绍:

注意:键盘的返回值并不是和一般ASCII码相对应!

键盘的处理器如果发现有键被按下释放或按住键盘将发送扫描码的信息包到计算机扫描码有两种 不同的类型通码和断码当一个键被按下或按住就发送通码当一个键被释放就发送断码每个按键被分配了唯一的通码和断码这样主机通过查找唯一的扫描码就可以测定 是哪个按键每个键一整套的通断码组成了扫描码集有三套标准的扫描码集分别是第一套第二套和第三套所有现代的键盘默认使用第二套扫描码
虽然多数第二套通码都只有一个字节宽但也有少数扩展按键的通码是两字节或四字节宽这类的通码第一个字节总是为E0h
正如键按下通码就被发往计算机一样只要键一释放断码就会被发送每个键都有它自己唯一的通码它们也都有唯一的断码幸运的是你不用总是通过查表来找出按键的断 码在通码和断码之间存在着必然的联系多数第二套断码有两字节长它们的第一个字节是F0h 第二个字节是这个键的通码扩展按键的断码通常有三个字节它们前两个字节是E0h,F0h 最后一个字节是这个按键通码的最后一个字节作为一个例子我在下面列出了几个按键的第二套通码和断码

No.

key

通碼(第二套)

斷碼(第二套)

1

"A"

1C

F0 1C

2

"5"

2E

F0 2E

3

"F10"

09

F0 09

4

Right Arrow

E0 74

E0 F0 74

5

Right "Ctrl"

E0 14

E0 F0 14


一个键盘发送值的例子:

通码和断码是以什么样的序列发送到你的计算机从而使得字符G 出现在你的字处理软件里的呢因为这是一个大写字母需要发生这样的事件次序按下Shift 键按下G键释放G 键释放Shift 键与这些时间相关的扫描码如下Shift 键的通码12hG 键的通码34h G 键的断码F0h 34h Shift 键的断码F0h 12h 因此发送到你的计算机的数据应该是

12h 34h F0h 34h F0h 12h



五:第二套扫描码:

101 102 和104 键的键盘:

key
通碼
斷碼

key
通碼
斷碼

key
通碼
斷碼

A

1C

F0 1C


9 46 F0 46
[ 54 F0 54

B

32

F0 32


` 0E F0 0E
INSERT E0 70 E0 F0 70

C

21

F0 21


- 4E F0 4E
HOME E0 6C E0 F0 6C

D

23

F0 23


= 55 F0 55
PG UP E0 7D E0 F0 7D

E

24

F0 24


\ 5D F0 5D
DELETE E0 71 E0 F0 71
F 2B F0 2B
BKSP 66 F0 66
END E0 69 E0 F0 69
G 34 F0 34
SPACE 29 F0 29
PG DN E0 7A E0 F0 7A
H 33 F0 33
TAB 0D F0 0D
U ARROW E0 75 E0 F0 75
I 43 F0 43
CAPS 58 F0 58
L ARROW E0 6B E0 F0 6B
J 3B F0 3B
L SHFT 12 F0 12
D ARROW E0 72 E0 F0 72
K 42 F0 42
L CTRL 14 F0 14
R ARROW E0 74 E0 F0 74
L 4B F0 4B
L GUI E0 1F E0 F0 1F
NUM 77 F0 77
M 3A F0 3A
L ALT 11 F0 11
KP / E0 4A E0 F0 4A
N 31 F0 31
R SHFT 59 F0 59
KP * 7C F0 7C
O 44 F0 44
R CTRL E0 14 E0 F0 14
KP - 7B F0 7B
P 4D F0 4D
R GUI E0 27 E0 F0 27
KP + 79 F0 79
Q 15 F0 15
R ALT E0 11 E0 F0 11
KP EN E0 5A E0 F0 5A
R 2D F0 2D
APPS E0 2F E0 F0 2F
KP 71 F0 71
S 1B F0 1B
ENTER 5A F0 5A
KP 0 70 F0 70
T 2C F0 2C
ESC 76 F0 76
KP 1 69 F0 69
U 3C F0 3C
F1 05 F0 05
KP 2 72 F0 72
V 2A F0 2A
F2 06 F0 06
KP 3 7A F0 7A
W 1D F0 1D
F3 04 F0 04
KP 4 6B F0 6B
X 22 F0 22
F4 0C F0 0C
KP 5 73 F0 73
Y 35 F0 35
F5 03 F0 03
KP 6 74 F0 74
Z 1A F0 1A
F6 0B F0 0B
KP 7 6C F0 6C
0 45 F0 45
F7 83 F0 83
KP 8 75 F0 75
1 16 F0 16
F8 0A F0 0A
KP 9 7D F0 7D
2 1E F0 1E
F9 01 F0 01
] 58 F0 58
3 26 F0 26
F10 09 F0 09
; 4C F0 4C
4 25 F0 25
F11 78 F0 78
' 52 F0 52
5 2E F0 2E
F12 07 F0 07
, 41 F0 41
6 36 F0 36
PRNT
SCRN
E0 12
E0 7C
E0 F0
7C E0
F0 12

. 49 F0 49
7 3D F0 3D
SCROLL 7E F0,7E
/ 4A F0 4A
8 3E F0 3E
PAUSE E1 14 77
E1 F0 14
F0 77
-NONE-



ACPI 扫描码:

key
通碼
斷碼

Power

E0, 37

E0, F0, 37

Sleep

E0, 3F

E0, F0, 3F

Wake

E0, 5E

E0, F0, 5E

Windows 多媒体扫描码:

key
通碼
斷碼

Next Track

E0, 4D

E0, F0, 4D

Previous Track

E0, 15

E0, F0, 15

Stop

E0, 3B

E0, F0, 3B

Play/Pause E0, 34 E0, F0, 34
Mute E0, 23 E0, F0, 23
Volume Up E0, 32 E0, F0, 32
Volume Down E0, 21 E0, F0, 21
Media Select E0, 50 E0, F0, 50
E-Mail E0, 48 E0, F0, 48
Calculator E0, 2B E0, F0, 2b
My Computer E0, 40 E0, F0, 40
WWW Search E0, 10 E0, F0, 10
WWW Home E0, 3A E0, F0, 3a
WWW Back E0, 38 E0, F0, 38
WWW Forward E0, 30 E0, F0, 20
WWW Stop E0, 28 E0, F0, 28
WWW Refresh E0, 20 E0, F0, 20
WWW Favorites E0, 18 E0, F0, 18

PS/2接口协议解析及应用

ps/2接口标准的发展过程

随着计算机工业的发展,作为计算机最常用输入设备的键盘也日新月异。1981年IBM推出了IBM pc/XT键盘及其接口标准。该标准定义了83键,采用5脚DIN连接器和简单的串行协议。实际上,第一套键盘扫描码集并没有主机到键盘的命令。为此, 1984年IBM推出了IBM AT键盘接口标准。该标准定义了84~101键,采用5脚DIN连接器和双向串行通讯协议,此协议依照第二套键盘扫描码集设有8个主机到键盘的命令。到了 1987年,IBM又推出了ps/2键盘接口标准。该标准仍旧定义了84~101键,但是采用6脚mini-DIN连接器,该连接器在封装上更小巧,仍然 用双向串行通讯协议并且提供有可选择的第三套键盘扫描码集,同时支持17个主机到键盘的命令。现在,市面上的键盘都和ps/2及AT键盘兼容,只是功能不 同而已。

ps/2接口硬件


2.1 物理连接器

一般,具有五脚连接器的键盘称之为AT键盘,而具有六脚mini-DIN连接器的键盘则称之为ps/2键盘。其实这两种连接器都只有四个脚有意义。 它们分别是Clock(时钟脚)、DATA(数据脚)、+5V(电源脚)和Ground(电源地)。在ps/2键盘与pc机的物理连接上只要保证这四根线 一一对应就可以了。ps/2键盘靠pc的ps/2端口提供+5V电源,另外两个脚Clock(时钟脚)和DATA(数据脚)都是集电极开路的,所以必须接 大阻值的上拉电阻。它们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高电平。现在比较常用的连接器如图1所示。

2.2 电气特性

ps/2 通讯协议是一种双向同步串行通讯协议。通讯的两端通过Clock(时钟脚)同步,并通过DATA(数据脚)交换数据。任何一方如果想抑制另外一方通讯时, 只需要把Clock(时钟脚)拉到低电平。如果是pc机和ps/2键盘间的通讯,则pc机必须做主机,也就是说,pc机可以抑制ps/2键盘发送数据,而 ps/2键盘则不会抑制pc机发送数据。一般两设备间传输数据的最大时钟频率是33kHz,大多数ps/2设备工作在10~20kHz。推荐值在 15kHz左右,也就是说,Clock(时钟脚)高、低电平的持续时间都为40μs。每一数据帧包含11~12个位,具体含义如表1所列。

表1 数据帧格式说明

1个起始位 总是逻辑0
8个数据位 (LSB)低位在前
1个奇偶校验位 奇校验
1个停止位 总是逻辑1
1个应答位 仅用在主机对设备的通讯中


表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。

2.3 ps/2设备和pc机的通讯

ps/2 设备的Clock(时钟脚)和DATA(数据脚) 都是集电极开路的,平时都是高电平。当ps/2设备等待发送数据时,它首先检查Clock(时钟脚)以 确认其是否为高电平。如果是低电平,则认为是pc机抑制了通讯,此时它必须缓冲需要发送的数据直到重新获得总线的控制权(一般ps/2键盘有16个字节的 缓冲区,而ps/2鼠标只有一个缓冲区仅存储最后一个要发送的数据)。如果Clock(时钟脚)为高电平,ps/2设备便开始将数据发送到pc机。一般都 是由ps/2设备产生时钟信号。发送时一般都是按照数据帧格式顺序发送。其中数据位在Clock(时钟脚)为高电平时准备好,在Clock(时钟脚)的下 降沿被pc机读入。ps/2设备到pc机的通讯时序如图2所示。

当时钟频率为15kHz时,从Clock(时钟脚)的上升沿到数据位转变时间至少要5μs。数据变化到Clock(时钟脚)下降沿的时间至少也有5 μs,但不能大于25 μs,这是由ps/2通讯协议的时序规定的。如果时钟频率是其它值,参数的内容应稍作调整。

上述讨论中传输的数据是指对特定键盘的编码或者对特定命令的编码。一般采用第二套扫描码集所规定的码值来编码。其中键盘码分为通码(make)和断 码 (Break)。通码是按键接通时所发送的编码,用两位十六进制数来表示,断码通常是按键断开时所发送的编码,用四位十六进制数来表示。

3 ps/2接口的嵌入式软件编程方法

ps/2设备主要用于产生同步时钟信号和读写数据。

3.1 ps/2向pc机发送一个字节


从ps/2向pc机发送一个字节可按照下面的步骤进行:

(1)检测时钟线电平,如果时钟线为低,则延时50μs;

(2)检测判断时钟信号是否为高,为高,则向下执行,为低,则转到(1);

(3)检测数据线是否为高,如果为高则继续执行,如果为低,则放弃发送(此时pc机在向ps/2设备发送数据,所以ps/2设备要转移到接收程序处接收数据);

(4)延时20μs(如果此时正在发送起始位,则应延时40μs);

(5)输出起始位(0)到数据线上。这里要注意的是:在送出每一位后都要检测时钟线,以确保pc机没有抑制ps/2设备,如果有则中止发送;

(6)输出8个数据位到数据线上;

(7)输出校验位;

(8)输出停止位(1);

(9)延时30μs(如果在发送停止位时释放时钟信号则应延时50μs);

通过以下步骤可发送单个位:

(1)准备数据位(将需要发送的数据位放到数据线上);

(2)延时20μs;

(3)把时钟线拉低;

(4)延时40μs;

(5)释放时钟线;

(6)延时20μs。

3.2 ps/2设备从pc机接收一个字节

由于ps/2设备能提供串行同步时钟,因此,如果pc机发送数据,则pc机要先把时钟线和数据线置为请求发送的状态。pc机通过下拉时钟线大于 100μs来抑制通讯,并且通过下拉数据线发出请求发送数据的信号,然后释放时钟。当ps/2设备检测到需要接收的数据时,它会产生时钟信号并记录下面8 个数据位和一个停止位。主机此时在时钟线变为低时准备数据到数据线,并在时钟上升沿锁存数据。而ps/2设备则要配合pc机才能读到准确的数据。具体连接 步骤如下:

(1)等待时钟线为高电平。

(2)判断数据线是否为低,为高则错误退出,否则继续执行。

(3)读地址线上的数据内容,共8个bit,每读完一个位,都应检测时钟线是否被pc机拉低,如果被拉低则要中止接收。

(4)读地址线上的校验位内容,1个bit。

(5)读停止位。

(6)如果数据线上为0(即还是低电平),ps/2设备继续产生时钟,直到接收到1且产生出错信号为止(因为停止位是1,如果ps/2设备没有读到停止位,则表明此次传输出错)。

(7 输出应答位。

(8) 检测奇偶校验位,如果校验失败,则产生错误信号以表明此次传输出现错误。

(9)延时45 μs,以便pc机进行下一次传输。

读数据线的步骤如下:

(1)延时20μs;

(2)把时钟线拉低

(3)延时40μs

(4)释放时钟线

(5)延时20μs

(6)读数据线。

下面的步骤可用于发出应答位;

(1)延时15μs;

(2)把数据线拉低;

(3)延时5μs;

(4)把时钟线拉低;

(5)延时40μs;

(6)释放时钟线;

(7)延时5μs;

(8)释放数据线。


4 用于工控机的双键盘设计

工控机通常要接标准键盘,但是为了方便操作,常常需要外接一个专用键盘。此实例介绍了在工控pc机到ps/2总线上再接入一个自制专用键盘的应用方法。

该设计应能保证两个键盘单独工作,而且相互不能影响。因此,不能直接把专用键盘和标准键盘一起接到工控pc的ps/2口。鉴于这种情况,本设计使用 模拟开关CD4052并通过时分复用工控pc的ps/2口,来使在同一个时刻只有一个键盘有效,从而解决上述问题。其硬件原理图如图3所示。其中P2口和 P1口用于键盘扫描电路(图中未画出),p0.0为数据端,p0.1为时钟端,p0.2为模拟开关选通端。由于专用键盘不需要接收工控pc机的命令,所以 软件中并不需要写这部分相应的代码。

通过软件可在专用键盘复位后把p0.2清0,以使模拟开关CD4052打开相应的通道。这时工控pc的标准键盘将开始工作。标准键盘可以完成工控 pc刚启动时对外设检测的应答。复位后的专用键盘不停地扫描有没有按键,如果有键按下则识别按键,并且按照预先的设计进行编码,同时调用发送程序并通过 ps/2口发送到工控pc。此时模拟开关关闭相应通道(将p0.2置1),专用键盘接入工控pc ps/2口的时钟线和数据线而工作,但标准键盘被模拟开关从ps/2的时钟线和数据线中断而不工作,这样,双键盘便可时分复用同一个工控pc机的ps/2 口。相应的发送子程序如下:

#define DATA p00 用p0.0做数据线

#define CLK p01 用p0.1做时钟线

#define INHIbit p02 用p0.2做CD4052的INH端

#define PORTR p1 用P1口做读入口

#define PORTW p2 用P2口做写出口 可以实现64个自定义键


void send(uchar x) /* function for send a char data*/
{

uchar i,temp,char_temp;
bit flag_check =1;
INHIBIT =1; //disable standard keyboard
delay_ms(3);
temp = x;
for( i=0; i<8; i++) //find the number of 1 in this uchar x is odd or not
{
char_temp = temp & 0x01;
if(char_temp == 0x01)
{
flag_check =!flag_check;
}
temp = temp >>1;
}
CLK =1; //send 1 to P1 then read P1
while(!CLK) //if CLK is low wait
{
;
}
CLK =1;
DATA =1; //send 1 to P1 then read P1
if(CLK ==1)
{
delay_us(30);
}

if(CLK==1 && DATA==1) //send data
{
DATA =0; //start bit 0
delay_us(10);
CLK =0;
delay_us(5);
temp =x;
for(i=0;i<8;i++) //send 8 bits LSB first
{
CLK =1;
delay_us(5);
char_temp = temp & 0x01;
if ( char_temp == 0x01)
{
DATA =1;
}
else
{
DATA =0;
}
//DATA=(bit)(temp&0x01);
//LSB
delay_us(10);
CLK = 0;
delay_us(5);
temp = temp>>1;
}
CLK = 1; //send check bit

delay_us(5);
DATA = flag_check;
delay_us(10);
CLK = 0;
delay_us(5);
CLK =1; //send stop bit
delay_us(5);
DATA =1;
dalay_us(10);
CLK = 0;
delay_us(5);
CLK =1;
delay_us(30);
CLK =1;
DATA =1 ; //send 1 to P1 then read P1
if(CLK ==1 && DATA == 0)
{
return ; //pc is sending data to mcu,goto
//receiving function
}
INHIBIT = 0; //enable standard keyboard
}

5 结论

ps/2 接口协议是现在大多数键盘、鼠标与pc机通讯的标准协议。其中鼠标对pc机的通讯更为简单,只是传输数据的内容不一样而已。充分理解ps/2接口协议,可 以帮助设计者自主开发一些工控机上的专用键盘等外设,并能够按照用户的要求开发出专用的多功能键盘。该工控机的双键盘设计目前已被某工控公司所采纳,并已 作为组件加入到产品当中。

PS/2鼠标接口的设计与实现

当前嵌入式系统技术已得到了广泛应用,但传统嵌入式系统的人机接口多采用小键盘操作的文本菜单方式,用户操作较为不便。本文介绍了一种利用PS/2接口鼠 标,在点阵LCD的单片机系统上实现图形化用户界面的方案。用窗口菜单和图形按钮取代了传统的键盘操作,具有成本低、效果好等特点,具有很强的实用性。

1 PS/2接口和协议
1.1 接口的物理特性
PS/2接口用于许多现代的鼠标和键盘,由IBM最初开发和使用。物理上的PS/2接口有两种类型的连接器:5脚的DIN和6脚的mini-DIN。图1就是两种连接器的引脚定义。使用中,主机提供+5V电源给鼠标,鼠标的地连接到主机电源地上。
PS/2接口引脚定义
1.2 接口协议原理
PS/2鼠标接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时 候抑制鼠标的发送。方法是把时钟线一直拉低,鼠标就不能产生时钟信号和发送数据。在两个方向的传输中,时钟信号都是由鼠标产生,即主机不产生通信时钟信 号。
如果主机要发送数据,它必须控制鼠标产生时钟信号。方法如下:主机首先下拉时钟线至少100μs抑制通信,然后再下拉数据线,最后释放时钟线。通过这一时 序控制鼠标产生时钟信号。当鼠标检测到这个时序状态,会在10ms内产生时钟信号。如图3中 A 时序段。主机和鼠标之间,传输数据帧的时序如图2、图3所示。2.2 数据包结构在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位的判断和接收。在实验过程中,通过合适的编程,能够正确控制并接收鼠 标数据。但该方案有一点不足,由于每个CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源。
2 PS/2鼠标的工作模式和协议数据包格式
2.1 PS/2鼠标的四种工作模式
PS/2鼠标的四种工作模式是:Reset模式,当鼠标上电或主机发复位命令 0xFF给它时进入这种模式;Stream模式鼠标的默认模式,当鼠标上电或复位完成后,自动进入此模式,鼠标基本上以此模式工作;Remote模式,只 有在主机发送了模式设置命令 0xF0后,鼠标才进入这种模式;Wrap模式,这种模式只用于测试鼠标与主机连接是否正确。
PS/2鼠标在工作过程中,会及时把它的状态数据发送给主机。发送的数据包格式如表1所示。
Byte1中的Bit0、Bit1、Bit2分别表示左、右、中键的状态,状态值0表示释放,1表示按下。Byte2和Byte3分别表示X轴和Y轴方向 的移动计量值,是二进制补码值。Byte4的低四位表示滚轮的移动计量值,也是二进制补码值,高四位作为扩展符号位。这种数据包由带滚轮的三键三维鼠标产 生。若是不带滚轮的三键鼠标,产生的数据包没有Byte4 其余的相同。
3 设计与实现
3.1 接口设计
因为PS/2鼠标接口采用双向同步串行协议,时钟脉冲信号 以下皆称CLOCK 总是由鼠标产生。因此,可以考虑这种方案:鼠标的CLOCK接主机的一外中断线,数据线 以下皆称DATA 接主机的某一I/O口线,如图4所示。
由于鼠标与主机之间以双向同步串行协议传送数据,若不考虑CLOCK,仅考虑DATA,则其数据帧的时序与单片机的UART异步串行时序类似。所以,采用 了另一种方案:鼠标的CLOCK仍旧接主机的外中断,但鼠标的DATA接UART的接收脚RxD 。参照图4DATA改接RxD。在初始化过程中,主机利用CLOCK的外中断和RxD脚的I/O口线功能实现数据的传输。初始化完成后,切换到RxD功能 即UART的接收引脚功能。因为鼠标已处于Stream模式的工作状态,这时鼠标能主动发送数据。这样,主机可以在每收到一帧数据时才中断一次。中断次数 大大降低,减少了主机资源的耗用。
不过,在此方案中,必须实现另一个功能:主机波特率的自适应。因为PS/2接口的鼠标一般工作在10kHz~20kHz时钟频率。不同厂家制造的鼠标工作 的时钟频率不同。嵌入设备主机要做到与不同鼠标的波特率同步和自适应,才能够正确接收鼠标传送来的数据。波特率的自适应是这样实现:鼠标上电自检时会产生 一串时钟脉冲,利用鼠标时钟脉冲产生的中断,结合主机的定时器测量时钟脉冲周期,可以得出所用鼠标的时钟频率,进而求出波特率。通过设置相应的波特率寄存 器,实现了波特率的自适应。
3.2 软件实现
软件实现原理框图如图5所示。

(1)鼠标初始化
最简单的初始化就是当鼠标上电自检完成后,主机给鼠标发送一个使能鼠标数据传送命令字节 (0xf4),鼠标就会在默认设置状态下工作。主机也可实现自定义初始化,如:复位三次(Snd_CMD(0xff),Snd_CMD(0xff), Snd_CMD(0xff);设置采样率:Snd_CMD(0xf3),Snd_CMD(0x0a);设置解析度(2点/毫米):Snd_CMD (0xe8),Snd_CMD(0x01);设置缩放比例(1:1):Snd_CMD(0xe6);使能鼠标数据传送:Snd_CMD(0xf4)。鼠标 每收到一个命令字节都会给出一个应答字节(0xfa)。
(2)两种方案的实现过程
两种方案的软件实现过程基本相同。只是后一种方案中,初始化时还要实现主机波特率的自适应,关闭时钟脉冲中断和打开串口中断。此后主机利用UART的接收功能接收鼠标数据。
(3)图形化人机接口(GUI)的实现
在点阵式LCD显示屏上实现图形化的人机接口界面,主要有两个方面:一个是菜单图标的实现;另一个是鼠标光标的实现。实现菜单图标,显示屏一般工作在图形 显示模式。菜单图标有正常显示状态和反显状态,它们都用函数实现:voidDraw_ICON(signed int xICON, signed int yICON,unsigned char *pDatICON)。xICONyICON是图标所在位置的左上角坐标值,pDatICON是各个图标及其不同显示状态的点阵码值。反显状态是当图标被 光标滑到或点取时才显现的。实现鼠标光标,又分两种情况。一种是单层显示的LCD,只能由程序画出鼠标光标。但是,当光标移动较快时,画出光标的点阵图形 需要耗用较多的主机资源。另一种是有双层显示和光标功能的LCD,只需程序控制它的光标移动位置,无需程序画出光标的点阵图形,因而耗用主机资源较少,实 现起来效果较好。
两种方案简单、明了,容易实现,都已在实验中得到验证。并且,后一种方案已在某一仪表系统中得到成功应用。总体来说,随着嵌入式处理器性能的不断提高,在 嵌入设备中接入鼠标,既可灵活使用,也可减少因接入许多按键而占用的口线数,还能使LCD的图形化显示界面更美观、更人性化。

单片机系统中PS/2键盘驱动程序的设计

在单片机系统中,经常使用的键盘都是专用键盘.此类键盘为单独设计制作的,成本高、使用硬件连接线多,且可靠性不高,这一状况在那些要求键盘按键较多的应用系统中更为突出.与此相比,在PC系统中广泛使用PS/2键盘具有价格低、通用可靠,且使用连接线少(仅使用2根信号线)的特点,并可满足多种系统的要求.因此在单片机系统中应用PS/2键盘是一种很好的选择.
文中在介绍PS/2协议和PS/2键盘工作原理与特点的基础上,给出了一个在单片机上实现对PS/2键盘支持的硬件连接与驱动程序设计实现.该
设计实现了在单片机系统中对PS/2标准104键盘按键输入的支持.使用Keil C51开发的驱动程序接口和库函数可以方便地移植到其他单片机或嵌入式系统中.所有程序在Keil uVision2上编译通过,在单片机AT89C51上测试通过.

1 PS/2协议
目前,PC机广泛采用的PS/2接口为mini-DIN 6pin的连接器,如图1所示.


PS/2接口图
PS/2设备有主从之分,主设备采用Female插座,从设备采用Male插头.现在广泛使用的PS/2键盘鼠标均在从设备方式下工作.PS/2接口的时钟
与数据线都是集电极开路结构,必须外接上拉电阻(一般上拉电阻设置在主设备中).主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生.

1.1 从设备到主设备的通信
当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平.如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输数据.传输的每一帧由11位组成,发送时序及每一位的含义如图2所示.


从设备到主设备的通信
每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1.从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟下降沿读人数据线状态.

1.2 主设备到从设备的通信
主设备与从设备进行通信时,主设备首先将时钟线和数据线设置为“请求发送”状态,具体方式为:首先下拉时钟线至少100us抑制通信,然后下拉数据线“请求发送”,最后释放时钟线.在此过程中,从设备在不超过10us的间隔内必须检查这个状态,当设备检测到这个状态时,它将开始产生时钟信号.此时数据传输的每一帧由12位构成,其时序和每一位含义如图3所示.


主设备到从设备的通信
与从设备到主设备通信相比,其每帧数据多了一个ACK位.这是从设备应答接收到字节的应答位,由从设备通过拉低数据线产生,应答位ACK总
是为0.主设备到从设备通信过程中,主设备总是在时钟线为低电平时改变数据线的状态,从设备在时钟上升沿读人数据线状态.

2 PS/2键盘的编码与命令集
2.1 PS/2键盘的编码
目前,PC机使用的PS/2键盘都默认采用第2套扫描码集.扫描码有两种不同的类型:“通码(make code)”和“断码(break code)”.当一个键被按下或持续按住时,键盘会将该键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机.根据键盘按键扫描码的不同,可将按键分为3类:
第1类按键 通码为一个字节,断码为0xF0+通码形式.如A键,其通码为0x1C;断码为0xF0 0x1C.
第2类按键 通码为两字节0xE0+0xXX形式,断码为0xE0+0xF0+0xXX形式.如Right Ctrl键,其通码为0xE0 0x14;断码为0xE0 0xF0 0x14.
第3 类特殊按键 有两个,Print Screen键,其通码为0xE0 0x12 0xE0 0x7C;断码为0xE0 0xF0 0x7C 0xE0 0xF0 0x12.Pause键,其通码为0xE1 0x14 0x77 0xE1 0xF0 0xl4 0xF0 0x77;断码为空.
组合按键扫描码的发送是按照按键发生的次序,如按下面顺序按左Shift十A键:① 按下左Shift键;② 按下A键;③ 释放A键;④ 释放左Shift键,那么计算机上接收到的一串数据为0x12 0x1C 0xF0 0x1C 0xF0 0x12.
在文中的驱动程序设计中,就是根据按键的分类对其分别进行处理.

2.2 PS/2键盘的命令集
主机可通过向PS/2键盘发送命令对键盘进行设置或者获得键盘的状态等操作.每发送一个字节,主机都会从键盘获得一个应答0xFA(“重发
resend” 和“回应echo”命令例外).驱动程序在键盘初始化过程中所用的指令:0xED,主机在该命令后跟随发送一个参数字节,用于指示键盘上Num Lock,Caps Lock,Scroll Lock Led的状态;0xF3,主机在这条命令后跟随发送一个字节参数定义键盘机打的速率和延时;0xF4,用于当主机发送0xF5禁止键盘后,重新使能键盘.

3 PS/2键盘与单片机的连接电路
PS/2键盘与AT89C51单片机的连接方式如图4所示.P1.0接PS/2数据线;P3.2(INT0)接PS/2时钟线.因为单片机的P1,P3口内部是带上拉电阻的,所以PS/2的时钟线和数据线可以直接与单片机的P1,P3相连接.


4 驱动程序设计
驱动程序的开发使用Keil C51语言以及KeiluVision2编程环境.PS/2 104键盘驱动程序主要任务是实现单片机与键盘间PS/2通信,同时将接收到的按键扫描码转换为该按键的键值KeyVal,提供给系统上层软件使用.

4.1 单片机与键盘间PS/2通信的程序设计
在PS/2通信过程中,主设备(文中是单片机)是在时钟信号为低时发送和接收数据信号.因为单片机向键盘发送的是指令,需要键盘回应,所以这
部分程序采用查询方式;而单片机接收键盘数据时,数据线上的信号在时钟为低时已经稳定,所以这部分程序采用中断方式,且不需要在程序中加入延时程序.
单片机向PS/2键盘发送数据程序代码为:
void ps2_sentchar(unsigned char sentchar){//ps2主设备向从设备发送数据
unsigned char sentbit_cnt= 0x00;
unsigned char sentchar_chk = 0x00;
EX0=0; //关外部中断0
//发起一个传送,发起始位
PS2_SGN_CLOCK = 0; //将时钟线拉低并保持100 us
delay100us();
PS2_SGN_DATA= 0; //起始位
PS2_SGN_CLOCK = 1;
//发送DATA0-7
for(sentbit_cnt=0;sentbit_cnt< ps2_sgn_data =" sentchar&">>=1; //待发送数据右移一位
}
//发送校验位
while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低
switch(sentchar_chk){
case 0:
case 2:
case 4:
case 6:PS2_SGN_DATA =1;break;//奇校验
case 1:
case 3:
case 5:
case 7:PS2_SGN_DATA = 0;break;//奇校验
default;break;
)
while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高
while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低
PS2_SGN_DATA =1;//发送停止位,停止位总为1
while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高
while(PS2_SGN_CLOCK) _nop_(); //等待时钟线变低
//接收ACK
//if(PS2_SGN_DATA) error();
//ACK信号由键盘发出,总为低电平
while(!PS2_SGN_CLOCK) _nop_(); //等待时钟线变高
EX0= 1; //开外部中断0
}

单片机由PS/2键盘接收数据程序:外部中断0设置为下降沿触发
void int0() interrupt 0 using 0 {//
EX0=0; //关外部中断0
switch(ps2_revchar_cnt){
case 1:
……
case 8:mcu_revchar<<=1; if(PS2_SGN_DATA) mcu_revchar |= 0x01; ps2_revchar_cnt++;break;
case 0:ps2_revchar_cnt++;break; //开始位,
case 9:ps2_revchar_cnt++;break; //校验位,可添加校验程序
case 10: _nop_();//停止位
ps2_revchar_cnt= 0;
revchar_flag=1;//置接收到数据标识位 break;
default:break;
}
EX0=1;//开外部中断0 }

4.2 键盘扫描码转换程序设计
由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为其ASCII值,
控制键如F1,Ctrl等为自定义值),只能通过查表的方式获得.
由于按键的3种类型及部分按键对应着两个键值(如A键的键值根据Caps和Shift键状态有0x41(A)和0x61(a)两种),因此综合考虑查表转换速度和资源消耗,设计中使用4个键盘表:键盘扫描码转换基本集和切换集(kb_plain_map[NR_KEYS]与kb_shift_map [NR_KEYS]);包含E0前缀的键盘扫描码转换基本集和切换集(kbeO_plain_map[NR_KEYS]与kbe0_shiftmap [NR_KEYS]).PS/2 104键盘按键扫描码最大值为0x83,所以设置NR_KEYS为132.所有4个键盘表的定义均为如下形式:KB_MAP[MAKE CODE]=KEYVAL,如果扫描码对应的按键为空(如KB_MAP[0x00]),则定义相应键值为NULL_KEY(0x00).以下是键盘扫描码基本集的部分代码实例: kb_plain_map[NR_KEYS]={…… NULL_KEY;0x2C;0x6B;0x69;0x6F;0x30;0x39; NULL_KEY; //扫描码0x40~0x47 //对应按键空,逗号,K,I,O,0,9,空 //对应键值0x00,',','k','i','o','O','9',0x00…… }; 如此设计键盘转换表的另一个好处在于,以后如需扩展支持有ACPI、Windows多媒体按键键盘时,只需要将键表中相应处修改即可,如ACPI Power按键通码为0xE0 0x37,修改kbe0_plain_map[0x37]=KB_ACPI_PWR即可. 特殊按键Pause使用单独程序处理,如果接收到0xE1就转入这段程序.而Print Screen键则将其看作是两个通码分别为0xE0 0x12和0xE0 0x7C 的“虚键”的组合键处理.在驱动程序中设定如下全局变量:led_status记录Scroll Lock Led,Num Lock Led和Caps Lock Led的状态(关为0,开为1);agcs_status记录左右Shift Ctrl Gui Alt状态,相应键按下则对应位为1,释放为0.E0_FLAG接到0xE0置1;E1_FLAG接收到0xE1置1;F0_FLAG接收到0xF0置 1.按键键值通过KeyVal提供上层程序使用.PS/2键盘扫描码键值转换程序ps2_codetrans()流程框架如图5所示.


扫描码键值转换程序流程框架
第1类按键的扫描码键值转换程序代码。
if(F0_FLAG){//接收扫描码为断码 switch(mcu_revchar){//处理控制键
case 0x11:ages_status&=0xF7;break;//左alt释放
case 0x12:ages_status&=0xFE;break;//左shift释放
case 0x14:agcs_status&=0xFD;break;//左ctrl释放
case 0x58;if(led_status&0x04) led_status &= 0x03; //caps lock else led_status |=0x04; ps2_ledchange(); break;
case 0x59: agcs_status &= 0xEF;break;//右shift释放
case 0x77: if(led_status&0x02)led_status&=0x05;//num lock else led_status |=0x02; ps2_ledchange(); break;
case 0x7E:if(led_status&0x01) led_status&=0x06;//scroll lock else led_status |=0x01; ps2_ledchange(); break;
default;break; } F0_FLAG=0;
}
else{//接收扫描码为通码
if(led_status&0x04) caps_flag=1;
else caps_flag = 0;
if(led_status&0x02) num_flag =1;
else num_flag =0;
if(agcs_status&0x11) shift_flag = 1;
else shift_flag=0; //扫描码键值转换
if((caps_flag == shift_flag) || (!num_flag)) KeyVal=kb_plain_map[mcu_revchar];
else KeyVal = kb_shift_map[mcu_revchar];
switch(mcu_revchar)(//处理控制键或状态键
case 0x11:agcs_status|= 0x08;//左alt按下
Case 0x12:agcs_status|= 0x01;//左shift按下
case 0x14:agcs_status|= 0x02;//左ctrl按下
case 0x59:agcs_status|= 0x10;//右shift按下
default:break;
} }
第2类按键的扫描码键值转换程序与上面相似.注意:在退出该程序段时,对E0_FLAG和F0_FLAG标识清0.Pause键的处理程序,如果接收到 0xE1,置E1_FLAG=1,然后顺次将后续接收到的7个字节数据和Pause的通码后7个字节比较,一致则返回KeyVal=KB_PAUSE;在比较完所有7个字节后清除E1_FLAG标识.

键盘初始化程序kb_init()流程为:
① 上电后,接收键盘上电自检通过信号0xAA,或者自检出错信号0xFC.单片机接收为0xAA则进入下一步,否则进行出错处理.
② 关LED指示,单片机发送0xED,然后接收键盘回应0xFA,接着发送0x00接收0xFA.
③ 设置机打延时和速率:单片机发送0xF3,接收0xFA,发送0x00(250 ms,2.0 cps),接收0xFA.
④ 检查LED,发送0xED,接收0xFA,发送0x07(开所有LED),接收0xFA.发送0xED,接收0xFA,发送0x00(关LED),接收0xFA.
⑤ 允许键盘,发送0xF4,接收0xFA.键盘LED改变ps2_ledchange()函数流程:发送0xED;接收0xFA;发送led_status;接收0xFA. 5 结语 该驱动程序经Keil uVision2 编译,在AT89C51单片机上运行通过,实现了对PS/2 104键盘的支持,实现了对字符按键大小写切换,Num Lock切换、控制键及组合按键的支持.同时该程序对其他嵌入式或单片机系统中PS/2键盘的应用也有借鉴意义.