掌叔
2008-06-17 09:50:34
摘自:[url]www.nashsu.com[/url]
之前在DS卡接口定义中提到了SPI(Serial Peripheral Interface)串行设备接口,但并不知在DS中的作用。这两天研究了一下,将基本功能弄懂了,写下来供大家参考。
SPI在DS中有很重要的功能。它是一种基于传行设备协议的总线,在DS中电源控制模块,触摸屏,麦克风和固件都通过SPI控制,可见其重要性了。 SPI是ARM7的一个总线接口,在此总线上可以控制4个设备。DS中用到了3个,电源控制模块,触摸屏/麦克风和固件。触摸屏和麦克风被设计成一个设备(只在总线上)。
SPI有一个控制寄存器(SERIAL_CR)和一个数据寄存器 (SERIAL_DATA),通过对这两个寄存器的设置可完成对SPI总线上设备的控制。它们的地址如下:
0×040001C0:16 SERIAL_CR
0×040001C2:16 SERIAL_DATA
16表示它们是16位寄存器。数据寄存器 (SERIAL_DATA)的16位全部用来保存数据。控制寄存器(SERIAL_CR)中每一位的信息如下:
Cpu Bit Name Expl.
7 0-1 波特率 0..3=4MHz, 2MHz, 1MHz, 512kHz
7 7 忙碌标志 0=Ready, 1=Busy
7 8-9 设备 0..3=电源控制, 固件(NVRAM), 触摸屏/
麦克风, 禁止(只使用3个)
7 10 时钟模式 0=8 clocks, 1=16 clocks
7 11 传输模式 0=单比特, 1=连续
7 14 中断控制 0=不允许, 1=允许
7 15 使能 0=不允许, 1=允许
SPI是一个同步时钟协议:每一时钟周期,一比特(BIT)数据传输到从设备(总线上的设备),或从从设备传输到控制器,通常使用同一个物理寄存器,这里是数据寄存器 (SERIAL_DATA)。也就是说与从设备的数据通讯都通过数据寄存器来完成。只有一个数据寄存器,如何来完成3个设备的通讯?这就由控制寄存器来完成了。SPI一次只能控制一个设备,也就是说不可能3个设备同时控制。在控制寄存器中,8-9位是控制设备的选择位,通过对这两位的设置选择所要控制的设备。所只需要一个数据寄存器就行了。
时钟模式是控制数据传输的,8 clocks是传输8位数据,有些设备的返回数据为8位,16 clocks则传输16位数据。为了使用方便,我们可以在程序中作如下定义:
#define SERIAL_CR (*(vuint16*)0×040001C0)
#define SERIAL_DATA (*(vuint16*)0×040001C2)
#define SPI_ENABLE (1<<15)
#define SPI_IRQ (1<<14)
#define SPI_BUSY (1<<7)
#define SPI_BAUD_4MHZ (0<<0)
#define SPI_BAUD_2MHZ (1<<0)
#define SPI_BAUD_1MHZ (2<<0)
#define SPI_BAUD_512KHZ (3<<0)
#define SPI_BYTE_MODE (0<<10)
#define SPI_HWORD_MODE (1<<10)
#define SPI_NOT_LAST (1 << 11)
#define SPI_DEVICE_POWER (0 << 8)
#define SPI_DEVICE_FIRMWARE (1 << 8)
#define SPI_DEVICE_TOUCH (2 << 8)
这样在编程时就方便多了。
这就是DS的SPI,以上只是讲解了SPI,具体功能的使用方法将在以后
单独写出来,希望大家多多关注。
如有疏漏错误之处,还望大家多多指教更正!