簡介
在博文"為什麼單片機通常只有那麼小的數據內存?
[1]"討論在單片機內部集成大規模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硬件配置:
單片機的工作主要頻率:。
▲ 單片機的硬件配置
(2)SPI設置:
SPI基本信號,下圖顯示CS,CLK的信號。
▲ SPI中的基本信號,CS,CLK
SPI 的CLK的頻率設置為:
SPISendChar():消耗時間:1.6us SPISendReceChar(): 1.6us
特性測試
1. MODE REGISTER
(1)上電後讀取Mode Register 缺省值: 上電後讀取LC1024: LC1024ReadMode: 0x40;
▲ 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().
▲ LC1024讀寫單個字節時間(CS)
測量:LC1024ByteReadDim, LC1024ByteWriteDim,讀寫兩個字節所需要的時間為:23.2us。
測量LC1024 CLK的波形,可以觀察其中的主要延長來自於對於地址的操作。在LC1024ByteWrite()函數中存在對於長整地址的移位操作。所以前面的時序特別長了。
▲ 寫操作中的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>
改造後的讀寫速度波形為:
▲ 讀寫LC1024的CS和CLK波形
此時,讀寫一個字節所需要的時間為7.86us。
直接對長整地址移位所消耗的時間測量: 下面是測量的數據:
▲ 地址移位所消耗的時間
測試的代碼:
<code> OFF(LC1024_CS);
lnAddress = lnAddress >> 8;
ON(LC1024_CS);/<code>
結論
測試了23LC1024的基本的SPI模式的讀寫性能,這對於一般的數據緩存是滿足的。
但是在高速數據採集過程中,高達20多微妙的訪問時間受限。這需要通過芯片的SQI多數據線模式來提高訪問速度。
還是受限於8051這個單片機的內核,使得該芯片的高速性能無法進一步提高了。將MCU更換成ARM的32位單片機則可以實質提高提高速度。
閱讀更多 TsinghuaZhuoqing 的文章