Подключение sram к arduino

Подключение внешней SRAM 512 Кбайт к Arduino Mega. Часть 1 — Теория

Arduino Arduino Mega

Очень часто при разработке приложений и систем на базе Arduino встает проблема нехватки памяти, присущая среде программирования микроконтроллеров. С помощью серия Arduino Mega возможно решение данной проблемы, т.к.имеются варианты исполнения данной платформы с Flash-памятью программ 128 КБайт или 256 КБайт. А как насчет встроенной памяти SRAM? Максимальный объем в нашем случае (Arduino Mega) не превышает 8 КБайт.

К счастью, серия Mega позволяет работать с внешней SRAM, и что самое главное, программа может получать беспрепятственно доступ к ней, как если бы это была внутренняя SRAM микроконтроллера. В статье мы рассмотрим аппаратное и программное решение задачи расширения памяти на базе микроконтроллера Atmel AVR ATmega1280.

XMEM

В техническом описании на микроконтроллер ATmega1280 содержится вся информация для инженеров, необходимая для расширения памяти. В документе это 9 глава «External Memory Interface» (XMEM). Блок схема ниже поясняет, как микроконтроллер организует связь с внешней памятью.

Рис. 1. Блок-схема организации работы с внешней памятью с помощью XMEM. Блок в центре — высокоскоростной 8-битный регистр-защелка.

Наиболее интересная часть в этой схеме – блок в центре, который представляет собой высокоскоростную 8-разрядную защелку.

Мультиплексирование и защелка

Адресное пространство Arduino Mega позволяет подключать внешнюю память объемом до 64 КБайт при 8-битной организации. Обычно для этого требуется немалое количество линий ввода/вывода: 16 для адресной шины, 8 для шины данных и как минимум еще 2 для управления.

Чтобы сократить количество используемых линий ввода/вывода, для подключения внешней памяти, микроконтроллер мультиплексирует младшие 8 адресных линий с 8 линиями данных, экономя при этом 8 линий. При такой реализации используется 8-битная защелка (8-разрядный регистр), при этом временные диаграммы работы с внешней памятью следующие:

Рис. 2. Временные диаграммы работы интерфейса внешней памяти.

Период времени, обозначенный красной линией, показывает промежуток между установкой действительного адреса (достоверные данные на линиях A0 – A15) и началом передачи данных (действительные данные на линиях D0 – D7). Логика микроконтроллера начинает операции с внешней памятью, подтверждая действительный адрес на линиях A0 – A15. Мультиплексированные линии проходят через 8-разрядный регистр-защелку, который работает в «прозрачном» режиме (transparent mode). Затем регистр переключается в режим хранения (Hold mode), при котором игнорируются изменения на входе и продолжается хранение последних принятых данных на выходе. Микроконтроллер затем устанавливает действительные данные на мультиплексированных линиях (это уже будут данные D0 – D7) и, в результате, мы имеем успешно установленные все линии для работы с внешней памятью и сохранили 8 линий ввода/вывода, которые могут понадобиться при работе основного приложения.

Стоит заметить, что регистр-защелка должен успевать работать на тактовой частоте 16 МГц, поэтому серия 74HC не подойдет для нашей цели. В техническом описании на микроконтроллер рекомендуется серия 74AHC.

Адресация при объеме SRAM более 64 КБайт

Теперь, основная задача – это работа с внешней памятью объемом 512 КБайт с адресным пространством всего на 64 КБайт. Решение – разделить 512 КБайт на 8 банков памяти по 64 КБайт и сделать управление «видимостью» одного банка в каждый момент времени с использованием 3 выводов микроконтроллера.

Память объемом 512 КБайт при обращении к ней требует 19-битного адреса (адресные линии A0 – A18). Линии A0 – A15 мы подключим по интерфейсу xmem (интерфейс внешней памяти микроконтроллера) и управление 3 оставшимися (A16 – A18) осуществим с помощью цифровых линий ввода/вывода микроконтроллера.

Рис. 3. Разделение внешней SRAM на 8 банков памяти объемом 64 КБайт.

Следующее ограничение, которое накладывает карта памяти микроконтроллеров ATmega – нижние 8 КБайт SRAM (адресное пространство для такого объема) всегда занимаются внутренней памятью микроконтроллера. Это означает, что адресация внешней памяти осуществляется в диапазоне 0х2200 – 0хFFFF, т.е. мы теряем 69632 байта из общего объема 524288 Байт внешней SRAM. В спецификации на микроконтроллер объясняется метод адресации этих потерянных 8 КБайт, однако автор посчитал, что в данной задаче это не актуально.

Во второй части статьи представлены принципиальная схема подключения внешней ОЗУ к микроконтроллеру, список компонентов и рисунки печатной платы.

Перевод: Vadim по заказу РадиоЛоцман

Источник

Подключение внешней SRAM 512 Кбайт к Arduino Mega. Часть 3 — ПО, базовые решения

Arduino Arduino Mega

Примечание. Выборки исходного кода, размещенные в тексте описания, использовать в своих проектах не рекомендуется. В конце описания имеется ссылка на архив с исходными кодами.

В заключительной части статьи мы рассмотрим основные моменты в программном обеспечении микроконтроллера при работе с внешней памятью объемом 512 КБайт применительно к среде Arduino. Все материалы доступны для скачивания в разделе загрузок в конце статьи.

Для работы с внешней памятью в интегрированной среде разработки была составлена библиотека функций XMEM (xmem library), которые реализуют основные функции при работе с памятью. При разработке данной библиотеки ставилась цель позволить с помощью существующих функций для работы с памятью (malloc, free, new и delete) организовать работу с внешней памятью.

Следует отметить, что функции содержатся в диапазоне имен с именем xmem, поэтому следует использовать префикс при вызове функций, например, xmem::begin(…). Все функции определены в файле xmem.h, поэтому необходимо включить его в свой проект.

Инсталляция библиотеки в среде Arduino

  1. Загрузить zip-файл из раздела загрузок.
  2. Загруженный файл распаковать в установочную директорию Arduino, поддиректория Libraries, с созданием в ней новой папки с именем xmem. Например, C:Program Files ->(x86)arduino-0021-> libraries.
  3. Запустить среду Arduino и в настройках Tools -> Import Library -> xmem добавьте библиотеку в свой проект.

Функции библиотеки XMEM

Функция void begin(bool heapInXmem_);

Эта функция должна быть вызвана перед тем, как использовать внешнюю память. Она настраивает регистры микроконтроллера AVR для доступа к внешней памяти и выбирает 0 банк памяти как текущий. Если выбрать значение параметра heapInXmem как истина (true) – рекомендованное значение – то область памяти Heap (динамическая память), используемая функциями malloc, free, new и delete, будет размещена во внешней памяти.

Функция void setMemoryBank(uint8_t bank_, bool switchHeap_=true);

Эта функция используется для переключения банков памяти. Значение переменной bank_ должно лежать в диапазоне 0 – 7. Если значение параметра switchHeap_ истинна (по умолчанию), то текущее состояние динамической памяти сохраняется до переключения банка памяти, пока не станет активным новый банк памяти. Управление динамической памятью (Heap) подразумевает, что вы можете свободно переключаться между банками, таким образом достигается оптимальное использование внешней памяти.


Функция SelfTestResults selfTest():

Это диагностическая функция, которая может использоваться для проверки корректного функционирования аппаратной части. Она записывает битовый шаблон в каждый байт каждого банка памяти и затем считывает их, это говорит о том, что данную функцию не следует использовать при работе основной программы приложения.

Функция возвращает структуру, которая содержит результат теста. Структура определена следующим образом:

Если тест завершился успешно, без ошибок, значение переменной succeeded будет истина. Если были обнаружены ошибки, то адрес ошибки будет храниться в переменной failedAddress, номер банка — в переменной failedBank.

Базовые решения

Далее мы рассмотрим базовые решения с применением библиотеки xmem, а также методы конфигурирования внешней памяти.

Область Heap по умолчанию, область глобальных данных по умолчанию, непосредственное управление внешней памятью

В этом случае динамическая область памяти и область глобальных данных размещаются во внутренней памяти микроконтроллера, и пользователь непосредственно использует всю внешнюю память, определяя указатели на нее.

Область глобальных данных по умолчанию, Heap во внешней памяти

В этом решении мы перенесли область динамической памяти во внешнюю память. Кроме того, обслуживаются несколько состояний динамической памяти при переключении банков внешней памяти, таким образом, мы имеем 8 независимых областей динамической памяти по 56 КБайт, которые можно эффективно использовать в приложении. Это позволит использовать требовательные к оперативной памяти библиотеки и подпрограммы.

Загрузки:

Библиотека xmem для Arduino, исходные коды базовых решений – скачать

Перевод: Vadim по заказу РадиоЛоцман

Источник

The Arduino and Me

Just a collection of geeky little projects and tutorials based on the Arduino

External SRAM (23LC1024)

Introduction

This tutorial demonstrates how to connect the 23LC1024 (1MBit or 128KB SPI SRAM chip). The 23LC1024 is part of a SRAM Integrated Circuits from Microchip. The members of the family all vary with size, with regards to the SRAM, but utlise the same packaging, pin out and set of commands.

  • Rating – Easy
  • Total Cost – £3 (As usual the an Arduino and breadboard are not included)

Parts List

  • Arduino Uno
  • 23LC1024
  • Breadboard
  • Jumper Wires

Wiring Schematic

23LC1024 -> Arduino
1 CS (Chip Select) -> D10 (this can be changed to suit your needs)
2 SO (Slave Out) -> D12 (MOSI)
3 SIO2 -> 5V
4 Vss (Ground) -> Ground
5 SI (Slave In) -> D11 (MISO)
6 SCK (Clock) -> D13 (Clock)
7 HOLD -> 5V
8 Vcc (Supply) -> 5V
*Note the 23LC1024 will work with voltages from 3-5v.
**Note pullup resistors have been omitted from the
diagram but should be used on pins 3 and 7.

More information on the Chip can be found in its datasheet located here.

Method

The first step is to download the SpiRam_Extended Library from here. This library is an extended version, which i wrote, of the original SpiRam library. It allows for easy transfer of the three most commonly used variable types (Int, Long and Float).

Next you must wire up the Arduino and 23LC1024 as shown in the wiring schematic section. The chip utilises the SPI protocol but is also capable of SDI and SQI which is why pin 3 is simply pulled high. The hold functionality allows you to pause sending data to the chip and later resume without sending new initialisation commands. For the purpose of this tutorial we are not going to be using this. If your are not using an Arduino Uno I have also included the function that the pins you are connecting to have so that you may easily remap it to the SPI pins on your board.

Open up the Arduino IDE and select the SpiRam_Extended_Functions example script. If you are not using the 23LC1024 but one of the other chips you will have to modify the following line appropriately. Additionally if you find that the chip appears to be functioning sporadically try reducing the SPI_CLOCK speed to a slower speed e.g. SPI_CLOCK_DIV16.

SpiRAM SpiRam(SPI_CLOCK_DIV8, SS_PIN, CHIP_23LC1024);

If you have not used pin 10 as the chip select pin you will also have to modify the following line. Note remember that you will still need to ensure pin 10 is set to output to prevent the Arduino entering slave mode.

Upload the code to your Arduino. Once it has loaded open the Serial Monitor and you should see something like this:

Writing and reading int
Write Time = 716
Write Time = 416
Write and Read Successful

Writing and reading long
Write Time = 556
Read Time = 548
Write and Read Successful

Writing and reading float
Write Time = 556
Read Time = 548
Write and Read Successful

Writing and reading int array of 20
Write Time = 2948
Read Time = 2936
Write and Read Successful

Writing and reading long array of 20
Write Time = 5552
Read Time = 5544
Write and Read Successful

Writing and reading float array of 20
Write Time = 5548
Read Time = 5548
Write and Read Successful
Send any key to retest

Finally when it comes to implementing this yourself If your application requires fast storage, which if you are interested in using external SRAM it probably does, you will find that it is allot quicker to use the array writing functions to write a buffer of for example 20 values at a time than storing the individual value in 20 separate loops. The same goes for reading.

SpiRam.read_Ints(start Address,Array,Size of array);
SpiRam.read_longs(start Address,Array,Size of array);
SpiRam.read_floats(start Address,Array,Size of array);

SpiRam.write_ints(start Address,Array,Size of array);
SpiRam.write_longs(start Address,Array,Size of array);
SpiRam.write_floats(start Address,Array,Size of array);

The arrays used here are pointers to an array you defined. I.e. you must define your array of integers ready to hold the values obtained using the read_ints function.

Arduino Code

N/A – All code required can be found in the SpiRam_Extended example scripts

Processing Code

N/A – Processing was not used in this example

Источник

Adblock
detector