摘要:本文介绍了一种应用串行外设接口(SPI)为SOC单片机C8051F020扩展大容量数据存储器的设计方案,并给出来软件流程图和示例。该方案充分应用了SPI的功能,在极少地占用单片机引脚的情形下,实现了数据存储器的扩展。 关键词:串行外设接口;SOC单片机;数据存储器
引言
在以网络通信、软件和微电子为主要标志的信息产业飞速发展的今天,感觉微处置器为核心的嵌入式体系随处可见,这些体系应用的典型例子包含移动电话体系、汽车的应用、家用电器、航天应用、医疗设备和国防体系等[1]。作为嵌入式体系核心部分的微处置器分为8位,16位,32位和64位四大类。对于很大一部分应用领域,性能要求相对较低,而产品成本是最主要的斟酌因素,这种情形下8位微处置器将是最佳选择。在8位微处置器中8051芯片家族具有低成本、大规模、易获得和应用广泛的特色,是开发嵌入式优秀平台。另外须要指出的是为了适应目前IC产业中流行的SOC(system on a chip)设计潮流,许多有名半导体公司纷繁推出了基于8051架构的8051 SOC芯片,其中美国SILICON LAB公司的C8051Fxxx系列单片机就是一例。
在8051芯片家族的实际应用中经常遇到的问题是没有足够的数据存储器用于支持较大的嵌入式体系。但是采取常规的扩展外部数据存储器的法子存在一个较大的引脚资源问题(其通常占用了18条引脚)。这对于以外部引脚数本就不多的微处置器为核心的嵌入式体系来说是致命的。
为了解决这一抵牾,本文C8051F 单片机和AT45DB081芯片为例,以介绍了一种应用串行外设接口(SPI)扩展大容量数据存储器的法子。
硬件简介
C8051F 系列单片机[2]是完整集成的混淆信号SOC芯片,具有与8051指令集完整兼容的CIP-51内核。它在一个芯片集成了构成一个数据采集或掌握体系所需的几乎所有模仿和数字外设以及其他功能部件。这些部件包含:ADC,可编程增益放大器、DAC、电压比拟器、电压基准、温度传感器、SMBus/I 嵌入式资讯网--供应嵌入式/开发板/嵌入式培训/Linux/Unix资讯:: 在图2所示接口电路中,采取8MB的Flash 存储器AT45DB081扩展了外部存储区.AT45DB081采取了基于SPI总线的串行输入和串行输出的操作法子,数据的读写只需通过C8051F020的P0.3和P0.4进行,外围电路非常简略. 图2 数据采集与存储器扩展电 http://www.embeded.cn/article/5647.htmHOME | 2C、UART、SPI、定时器、PCA、内部振荡器、WDT和电源监督器等。各个有输入/输出的内部部件可以通过交叉开关配置到I/O端口(P0、P1和P2)的外部引脚上。它内置了FLASH程序存储器、内部RAM,部分器件内部还有一定数量的位于外部数据存储器空间的XRAM。C8051F单片机具有片内调试电路,通过JTAG接口可以进行非侵入式、全速的在体系调试。这种真正能独立工作的SOC单片机使得设计体积小、功耗低、可靠性高的单片机体系变得便利。
AT45DB081[3]是ATMEL公司推出的工作电压为2.7~3.6V、可在体系重写的SPI兼容的FLASH数据存储器。它具有4096页、每页264字节(共计8M字节)的主存储器容量以及2个264字节的SRAM数据缓存器。这种串联接口FLASH存储器十分实用于要求存储密度高、引脚资源占用少、电源电压低和功耗小的商业和工业应用领域。
硬件原理图
C8051F单片机(以C8051F020为例)与AT45DB081的硬件原理图见图1所示。

图1 C8051F020和AT45DB081的硬件连接原理图
图中将C8051F020的P0.2、P0.3和P0.4引脚通过交叉开关配置为SPI的CLK(串行时钟)、MISO(主出从入)和MOSI(主出从入)信号线,分离与AT45DB081的时钟、串行输出和串行输入引脚相连。将P3.0、P3.1和P3.2与AT45DB081的芯片复位、片选和忙闲状况引脚相连。
单片机通过SPI与存储器间启动一次数据传输的过程为先将SPI标志为SPIF清零,然后向数据寄放器SPI0DAT写入一个字节,当SPIF由硬件置1表示一次传输结束。
软件编程
AT45DB081的操作法子及操作码
对于AT45DB081,共有十种操作法子,见表1所示。
表1 AT45DB081的操作法子及操作码
|
序号 |
操作法子 |
操作码 |
|
1 |
读主存储器页面内某个字节 |
52H |
|
2 |
读缓存器内某个字节 |
54H(Buffer1)、56H(Buffer2) |
|
3 |
将主存储器页面数据传送给缓存器 |
53H(Buffer1)、55H(Buffer2) |
|
4 |
主存储器页面与缓存器进行数据比拟 |
60H(Buffer1)、61H(Buffer2) |
|
5 |
向缓存器中写入数据 |
84H(Buffer1)、87H(Buffer2) |
|
6 |
擦写主存储器页面后并从缓存器写入 |
83H(Buffer1)、86H(Buffer2) |
|
7 |
不擦写主存储器页面直接从缓存器写入 |
88H(Buffer1)、89H(Buffer2) |
|
8 |
直接对主存储器页面写入(5、6或5、7的组合) |
82H(Buffer1)、85H(Buffer2) 单片机应用技巧选编(11)-图书分类-北航出版社单片机世界:: (635) 5.57 Super Flash型存储器SST39SF020的特色及应用(635) 5.58 闪速存储器AT29C040与单片机的接口设计(635) 58.9 应用DSP和CPLD增添数据采集的可扩展性(666) 8.10 通过JTAG口对DSP外部Flash存储器的在线编程(666) 8.11 TMS http://www.collegeenglish.com.cn/buaa/html/book/view.asp?id=1531&cat_f=&cat_s=11HOME | 2006年第一季度十大热点微处置器和存储器新品评析 - 单片机发:: 该MCU供应一个串行通信接口(SCI)、一个串行外围接口(SPI)模块和内置集成电路(IIC)总线模块,从而尽可能减少了外部元件的正式面向图形卡制造商推出一种图形双倍数据率第四代(GDDR4)256Mb显存器件用于测试.GDDR4存储器件能以2.5Gbps http://www.mcufans.com/viewnews-6276.shtmlHOME | |
|
9 |
主动重写主存储器页面(3、6的组合) |
58H(Buffer1)、59H(Buffer2) |
|
10 |
读状况寄放器 |
57H |
软件流程图及示例
C8051F单片机对AT45DB081进行数据读写操作的软件流程图如图2所示。
图2中体系初始化包含体系时钟初始化、设置交叉开关表将P0.2、P0.3和P0.4引脚配置为SPI接口,设置SPI特别状况寄放器和复位数据存储器。
单片机通过P3.1读取AT45DB081的忙闲状况引脚来确定存储器是否空闲,若P3.2为“1”表示存储器空闲,否则表示存储器忙。当存储器空闲时通过P3.1引脚输出“0”选中存储器。
选中存储器后可以通过SPI发送命令字,表1所示的10种操作对应的命令字见文献[3]。下面以表1中的第二种操作为例给出命令字示例:操作码(54H)、15位无效位、9位缓存器内某字节的地址、8位无效数。当发送完命令字后可以读取数据。

图2 对AT45DB081进行数据读写操作的软件流程图
表1中的第二种操作为例的软件示例(部分)如下。
void SendSPIByte(unsigned char ch) // 通过SPI发送一个字节数据
{
SPIF = 0; // SPIF位清零
SPI0DAT = ch; // 启动一次数据发送
while (SPIF == 0); // 期待数据发送完毕
}
unsigned char GetSPIByte(void) //通过SPI接管一个字节数据
{
SPIF = 0; // SPIF位清零
SPI0DAT = 0; //启动一次数据接管
while (SPIF == 0); // 期待数据接管完毕
return SPI0DAT; // 读取SPI接管到的数据
}
SendSPIByte(54H); //发送操作码52H
SendSPIByte(0x00); //发送8位无效位
SendSPIByte((unsigned char)(star_addr>>8)); //发送7位无效位和第一位地址位
SendSPIByte((unsigned char)star_addr); //发送后8位地址位
SendSPIByte(0x00); //发送8位无效位
Data=GetSPIByte(); //读取缓存器中数据
示例中star_addr为unsigned int型数据,其低9位用于寄放地址位。
结论
本文介绍的法子在占用C8051F单片机引脚数极少的情形下实现了大容量外部存储器的扩展,并给出了软件流程图及示例。这种法子同样可应用于其它带有SPI接口电路的微处置器。现在我们正将这种法子应用到以C8051F020为核心的嵌入式数据采集体系中。
参考文献:
1. Michael J.Pont 编著,陈继辉等译,’C语言嵌入式体系开发’. 中国电力出版社. 2003 12
2. 潘琢金 施国君. ‘C8051Fxxx高速SOC单片机原理及应用’. 北京航空航天大学出版社. 2002 05
3. ‘AT45DB081数据手册’. ATMEL公司. 1998 10
前一篇文章:三国群英传5-6着2个下载 后一篇文章:玩魔兽出现这个问题是什么意思啊?要命啊哪位好心朋友帮忙解决下谢谢
|