Часть 14: Внешняя SRAM — расширяем память за пределы 2 КБ

Внутренней SRAM в 2 КБ на ATmega328P катастрофически не хватает для проектов с большими массивами данных: аудио-буферы, графические фреймбуферы, логирование GPS-треков. 

Решение: подключаем внешнюю SRAM, например Microchip 23LC512 на 64 КБ через SPI. 

Схема подключения:

Пин 23LC512Подключение к Arduino
CS (Chip Select)Любой цифровой пин (например, D4)
SI (MOSI)D11 (MOSI)
SO (MISO)D12 (MISO)
SCKD13 (SCK)
VCC5V
GNDGND

Библиотека для работы с внешней SRAM:

#include <SPI.h>

#define SRAM_CS 4
#define SRAM_PAGE_SIZE 32

class ExternalSRAM {
private:
    void select() { digitalWrite(SRAM_CS, LOW); }
    void deselect() { digitalWrite(SRAM_CS, HIGH); }
    
    uint8_t readStatus() {
        select();
        SPI.transfer(0x05);  // READ STATUS
        uint8_t status = SPI.transfer(0x00);
        deselect();
        return status;
    }
    
public:
    void begin() {
        pinMode(SRAM_CS, OUTPUT);
        deselect();
        SPI.begin();
        SPI.setClockDivider(SPI_CLOCK_DIV2);  // 8 МГц — максимум для 23LC512
    }
    
    void writeByte(uint32_t addr, uint8_t data) {
        select();
        SPI.transfer(0x02);  // WRITE
        SPI.transfer((addr >> 16) & 0xFF);
        SPI.transfer((addr >> 8) & 0xFF);
        SPI.transfer(addr & 0xFF);
        SPI.transfer(data);
        deselect();
        delayMicroseconds(10);
    }
    
    uint8_t readByte(uint32_t addr) {
        select();
        SPI.transfer(0x03);  // READ
        SPI.transfer((addr >> 16) & 0xFF);
        SPI.transfer((addr >> 8) & 0xFF);
        SPI.transfer(addr & 0xFF);
        uint8_t data = SPI.transfer(0x00);
        deselect();
        return data;
    }
    
    // Пакетная запись для максимальной скорости
    void writeBlock(uint32_t addr, uint8_t* data, uint16_t len) {
        select();
        SPI.transfer(0x02);
        SPI.transfer((addr >> 16) & 0xFF);
        SPI.transfer((addr >> 8) & 0xFF);
        SPI.transfer(addr & 0xFF);
        for (uint16_t i = 0; i < len; i++) {
            SPI.transfer(data[i]);
        }
        deselect();
    }
};

ExternalSRAM sram;

void setup() {
    Serial.begin(115200);
    sram.begin();
    
    // Тест: записываем и читаем
    char test[] = "ARDUINOHACKS FOREVER!";
    sram.writeBlock(0, (uint8_t*)test, sizeof(test));
    
    char buffer[32];
    for (int i = 0; i < sizeof(test); i++) {
        buffer[i] = sram.readByte(i);
    }
    Serial.println(buffer);
}

void loop() {}

Скорость внешней SRAM

При тактовой частоте SPI 8 МГц скорость чтения/записи составляет около 200 КБ/сек (5 мкс на байт) . Этого достаточно для:

  • Хранения сэмплов аудио (8 кГц, 8 бит) — до 8 секунд в 64 КБ
  • Буфера для дисплея 128×64 (1 КБ)
  • Логирования данных с датчиков

Вам также может понравиться

About the Author: ардуинчиков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *