單片機片外RAM,串行的

簡介

在博文"爲什麼單片機通常只有那麼小的數據內存?"討論在單片機內部集成大規模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硬件配置:

單片機的工作主要頻率:fosc=35MHzf_{osc} = 35MHz
▲ 單片機的硬件配置

▲ 單片機的硬件配置

(2)SPI設置:

SPI基本信號,下圖顯示CS,CLK的信號。

▲ SPI中的基本信號,CS,CLK

▲ SPI中的基本信號,CS,CLK

SPI 的CLK的頻率設置爲:TSPI=4fosc=435×106=114.3nsT_{SPI} = {4 \over {f_{osc} }} = {4 \over {35 \times 10^6 }} = 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]);
}

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

(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);

改造後的讀寫速度波形爲:

▲ 讀寫LC1024的CS和CLK波形

▲ 讀寫LC1024的CS和CLK波形

此時,讀寫一個字節所需要的時間爲7.86us。

直接對長整地址移位所消耗的時間測量:
下面是測量的數據:

▲ 地址移位所消耗的時間

▲ 地址移位所消耗的時間

測試的代碼:

            OFF(LC1024_CS);
            lnAddress = lnAddress >> 8;
            ON(LC1024_CS);

 

結論

測試了23LC1024的基本的SPI模式的讀寫性能,這對於一般的數據緩存是滿足的。

但是在高速數據採集過程中,高達20多微妙的訪問時間受限。這需要通過芯片的SQI多數據線模式來提高訪問速度。

還是受限於8051這個單片機的內核,使得該芯片的高速性能無法進一步提高了。將MCU更換成ARM的32位單片機則可以實質提高提高速度。

 

參考文獻

  1. 爲什麼單片機通常只有那麼小的數據內存?
  2. 擴展32KRAM的STC8H8K信號採集版
  3. STC8G1K單片機軟件執行時間物理測量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章