單片機片外RAM,串行接口: 23LC1024

簡介

在博文"為什麼單片機通常只有那麼小的數據內存?

[1]"討論在單片機內部集成大規模RAM的問題。但在有的時候還是需要有大容量的RAM作為數據緩存。比如在博文“擴展32KRAM的STC8H8K信號採集版”介紹了通過並行接口擴展單片機片外內存的方法。在STC8H8K單片機運行在40MHz總線的情況下,完成片外RAM的讀寫僅僅需要0.5微秒。這在很多情況下可以滿足單片機數據訪問的要求了。

但是通過單片機的並口擴展外部RAM,一個最大的缺點就是造成了單片機引腳的大量浪費,增加了電子線路布板空間的浪費。因此使用高速同步串行接口(Serial Peripheral Interface)開展外部RAM可以有效解決這個問題

單片機片外RAM,串行接口: 23LC1024

▲ 郵購五片23LC1024芯片

本文下面通過具體實驗來測試基於Microcchip公司的23LC1024(128MByte)的串口RAM的擴展方式,為今後構建數據採集單片機系統做好準備。


設計方案

實驗AD工程:

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

1. 實驗電路的原理圖

單片機片外RAM,串行接口: 23LC1024

▲ 實驗電路的原理圖

2. PCB

單片機片外RAM,串行接口: 23LC1024

▲ PCB 設計版圖

3. 底層軟件設計

(1)單片機ISP硬件配置:

單片機的工作主要頻率:。

單片機片外RAM,串行接口: 23LC1024

▲ 單片機的硬件配置

(2)SPI設置:

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

單片機片外RAM,串行接口: 23LC1024

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

SPI 的CLK的頻率設置為:


SPISendChar():消耗時間:1.6us SPISendReceChar(): 1.6us

特性測試

1. MODE REGISTER

(1)上電後讀取Mode Register 缺省值: 上電後讀取LC1024: LC1024ReadMode: 0x40;

單片機片外RAM,串行接口: 23LC1024

▲ MODE寄存器的定義

(2)對Mode Register 讀寫:

<code>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]);
}/<code>

2. 測試對內部RAM讀寫

(1) 基本讀寫: 通過寫入和讀出驗證,可以驗證整個0x1ffff可以被測試正確存儲。

(2)讀寫時間測試:

循環寫入0x8000字節,需要時間為:0.671s 循環讀出0x8000字節,需要時間為 : 0.671s

<code>        nBegin = GetClickMS();        
        for(i = 0; i             LC1024ByteRead(lnAddress + i);
        }
        nEnd = GetClickMS();
        printf("Time:%d\\r\\n", nEnd - nBegin);/<code>

(3)測試讀寫單個字節的時間:

通過測試CS波形,可以測到對於LC1024單個字節的讀寫時間為:19.6us。 讀寫函數為: LC1024ByreRead(), LC1024ByteWrite().

單片機片外RAM,串行接口: 23LC1024

▲ LC1024讀寫單個字節時間(CS)

測量:LC1024ByteReadDim, LC1024ByteWriteDim,讀寫兩個字節所需要的時間為:23.2us。

測量LC1024 CLK的波形,可以觀察其中的主要延長來自於對於地址的操作。在LC1024ByteWrite()函數中存在對於長整地址的移位操作。所以前面的時序特別長了。

單片機片外RAM,串行接口: 23LC1024

▲ 寫操作中的CLK脈衝

將LC1024相關函數的地址進行改造,直接將24bit的三個字節的地址通過參數輸入。

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

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

單片機片外RAM,串行接口: 23LC1024

▲ 讀寫LC1024的CS和CLK波形

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

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

單片機片外RAM,串行接口: 23LC1024

▲ 地址移位所消耗的時間

測試的代碼:

<code>            OFF(LC1024_CS);
            lnAddress = lnAddress >> 8;
            ON(LC1024_CS);/<code>

結論

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

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

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


分享到:


相關文章: