单片机片外RAM,串行的

举报
tsinghuazhuoqing 发表于 2021/12/26 23:05:01 2021/12/26
【摘要】 简介 在博文"为什么单片机通常只有那么小的数据内存?"讨论在单片机内部集成大规模RAM的问题。但在有的时候还是需要有大容量的RAM作为数据缓存。比如在博文“扩展32KRAM的STC8H8K信号采集版”介...

简介

在博文"为什么单片机通常只有那么小的数据内存?"讨论在单片机内部集成大规模RAM的问题。但在有的时候还是需要有大容量的RAM作为数据缓存。比如在博文“扩展32KRAM的STC8H8K信号采集版”介绍了通过并行接口扩展单片机片外内存的方法。在STC8H8K单片机运行在40MHz总线的情况下,完成片外RAM的读写仅仅需要0.5微妙。这在很多情况下可以满足单片机数据访问的要求了。

但是通过单片机的并口扩展外部RAM,一个最大的缺点就是造成了单片机引脚的大量浪费,增加了电子线路布板空间的浪费。因此使用高速同步串行接口(Serial Peripheral Interface)开展外部RAM可以有效解决这个问题

▲ 邮购五片23LC1024芯片

▲ 邮购五片23LC1024芯片

本文下面通过具体实验来测试基于Microcchip公司的23LC1024(128MByte)的串口RAM的扩展方式,为今后构建数据采集单片机系统做好准备。

 

设计方案

实验AD工程:

D:\zhuoqing\AltiumDesigner\Test\2020\Test23ALC1024\Test23LC1024.SchDoc *

1. 实验电路的原理图

▲ 实验电路的原理图

▲ 实验电路的原理图

2. PCB

▲ 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中的基本信号,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寄存器的定义

▲ 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)

▲ LC1024读写单个字节时间(CS)

测量:LC1024ByteReadDim, LC1024ByteWriteDim,读写两个字节所需要的时间为:23.2us。

测量LC1024 CLK的波形,可以观察其中的主要延长来自于对于地址的操作。在LC1024ByteWrite()函数中存在对于长整地址的移位操作。所以前面的时序特别长了。

▲ 写操作中的CLK脉冲

▲ 写操作中的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波形

▲ 读写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位单片机则可以实质提高提高速度。

 

参考文献

  1. 为什么单片机通常只有那么小的数据内存?
  2. 扩展32KRAM的STC8H8K信号采集版
  3. STC8G1K单片机软件执行时间物理测量

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/105891541

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。