单片机片外RAM,串行的
简介
在博文"为什么单片机通常只有那么小的数据内存?"讨论在单片机内部集成大规模RAM的问题。但在有的时候还是需要有大容量的RAM作为数据缓存。比如在博文“扩展32KRAM的STC8H8K信号采集版”介绍了通过并行接口扩展单片机片外内存的方法。在STC8H8K单片机运行在40MHz总线的情况下,完成片外RAM的读写仅仅需要0.5微妙。这在很多情况下可以满足单片机数据访问的要求了。
但是通过单片机的并口扩展外部RAM,一个最大的缺点就是造成了单片机引脚的大量浪费,增加了电子线路布板空间的浪费。因此使用高速同步串行接口(Serial Peripheral Interface)开展外部RAM可以有效解决这个问题
▲ 邮购五片23LC1024芯片
本文下面通过具体实验来测试基于Microcchip公司的23LC1024(128MByte)的串口RAM的扩展方式,为今后构建数据采集单片机系统做好准备。
设计方案
实验AD工程:
D:\zhuoqing\AltiumDesigner\Test\2020\Test23ALC1024\Test23LC1024.SchDoc *
1. 实验电路的原理图
▲ 实验电路的原理图
2. PCB
▲ PCB 设计版图
3. 底层软件设计
(1)单片机ISP硬件配置:
单片机的工作主要频率: f o s c = 35 M H z f_{osc} = 35MHz fosc=35MHz。
▲ 单片机的硬件配置
(2)SPI设置:
SPI基本信号,下图显示CS,CLK的信号。
▲ SPI中的基本信号,CS,CLK
SPI 的CLK的频率设置为: T S P I = 4 f o s c = 4 35 × 1 0 6 = 114.3 n s T_{SPI} = {4 \over {f_{osc} }} = {4 \over {35 \times 10^6 }} = 114.3ns TSPI=fosc4=35×1064=114.3ns
SPISendChar():消耗时间:1.6us
SPISendReceChar(): 1.6us
特性测试
1. MODE REGISTER
(1)上电后读取Mode Register 缺省值:
上电后读取LC1024:
LC1024ReadMode: 0x40;
▲ MODE寄存器的定义
(2)对Mode Register 读写:
void SerialDebugProcessBuffer(void) {
unsigned char ucChar;
SerialDebugBuffer2Argument();
if(g_ucSDANumber == 0) return;
if(strcmp("hello", (char *)STD_ARG[0]) == 0)
printf("%s is ready !\r\n", VERSION_STRING);
else IFARG0("mr") {
ucChar = LC1024ReadMode();
printf("LC1024 Mode:%bx\r\n", ucChar);
} else IFARG0("mw") {
sscanf(SDA(1), "%bx", &ucChar);
LC1024WriteMode(ucChar);
printf("Mode:%bx\r\n", LC1024ReadMode());
}
else printf("Error command : %s !\r\n", STD_ARG[0]);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2. 测试对内部RAM读写
(1) 基本读写:
通过写入和读出验证,可以验证整个0x1ffff可以被测试正确存储。
(2)读写时间测试:
循环写入0x8000字节,需要时间为:0.671s
循环读出0x8000字节,需要时间为 : 0.671s
nBegin = GetClickMS();
for(i = 0; i < nSize; i ++) {
LC1024ByteRead(lnAddress + i);
}
nEnd = GetClickMS();
printf("Time:%d\r\n", nEnd - nBegin);
- 1
- 2
- 3
- 4
- 5
- 6
(3)测试读写单个字节的时间:
通过测试CS波形,可以测到对于LC1024单个字节的读写时间为:19.6us。
读写函数为: LC1024ByreRead(), LC1024ByteWrite().
▲ LC1024读写单个字节时间(CS)
测量:LC1024ByteReadDim, LC1024ByteWriteDim,读写两个字节所需要的时间为:23.2us。
测量LC1024 CLK的波形,可以观察其中的主要延长来自于对于地址的操作。在LC1024ByteWrite()函数中存在对于长整地址的移位操作。所以前面的时序特别长了。
▲ 写操作中的CLK脉冲
将LC1024相关函数的地址进行改造,直接将24bit的三个字节的地址通过参数输入。
unsigned char LC1024ByteRead(unsigned long lnAddress);
void LC1024ByteWrite(unsigned long lnAddress, unsigned char ucByte);
void LC1024ByteReadDim(unsigned long lnAddress, unsigned char * pucDim, unsigned int nSize);
void LC1024ByteWriteDim(unsigned long lnAddress, unsigned char *pucByte, unsigned int nSize);
- 1
- 2
- 3
- 4
- 5
改造后的读写速度波形为:
▲ 读写LC1024的CS和CLK波形
此时,读写一个字节所需要的时间为7.86us。
直接对长整地址移位所消耗的时间测量:
下面是测量的数据:
▲ 地址移位所消耗的时间
测试的代码:
OFF(LC1024_CS);
lnAddress = lnAddress >> 8;
ON(LC1024_CS);
- 1
- 2
- 3
结论
测试了23LC1024的基本的SPI模式的读写性能,这对于一般的数据缓存是满足的。
但是在高速数据采集过程中,高达20多微妙的访问时间受限。这需要通过芯片的SQI多数据线模式来提高访问速度。
还是受限于8051这个单片机的内核,使得该芯片的高速性能无法进一步提高了。将MCU更换成ARM的32位单片机则可以实质提高提高速度。
参考文献
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/105891541
- 点赞
- 收藏
- 关注作者
评论(0)