Внутренней SRAM в 2 КБ на ATmega328P катастрофически не хватает для проектов с большими массивами данных: аудио-буферы, графические фреймбуферы, логирование GPS-треков.
Решение: подключаем внешнюю SRAM, например Microchip 23LC512 на 64 КБ через SPI.
Схема подключения:
| Пин 23LC512 | Подключение к Arduino |
|---|---|
| CS (Chip Select) | Любой цифровой пин (например, D4) |
| SI (MOSI) | D11 (MOSI) |
| SO (MISO) | D12 (MISO) |
| SCK | D13 (SCK) |
| VCC | 5V |
| GND | GND |
Библиотека для работы с внешней 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 КБ)
- Логирования данных с датчиков