СТАТЬИ
Внешняя шина ArduinoDue (SAM3X)
Все началось с того, когда, пролистывая datasheet контролера Atmel SAM3X, который стоит на небезызвестной плате Arduino Due, я наткнулся на интересную вещь.

На тот момент я не стал разбираться, что это такое. Да и вскоре забыл. Немного позже, я разрабатывал программу для ArduinoDue и мне критически не хватало оперативной памяти для моих нужд. Я задумал поставить внешнюю с параллельным интерфейсом, но куда ее подключать? — К GPIO? — тогда я и вспомнил про эту штуку. Заходим на forum.arduino.cc


Опа! ;-) Кто-то уже состряпал библиотеку.

Теория:

Что это вообще — «параллельный интерфейс/шина«? В самом простом представлении: куча параллельно идущих проводов, каждый из которых несет бит информации. Первое — шина данных.



Шина данных — самое главное, несколько проводников(бит), передающих информацию в двух (или одном) направлении. Количество этих жил будет равно ширине передаваемой единице информации. Если мы хотим передать байт, то это будет восемь проводов. Это также влияет на скорость передачи: мы можем сделать шины шире и передавать сразу несколько байт. Однако, имея только шину данных — мы можем передать устройству одну единицу этой информации. Второе — шина адреса.


Шина адреса — грубо говоря, указатель на ячейку, куда мы хотим передать/забрать информацию по шине данных. Обычно она всегда шире, чем шина адреса, так как количество информации, которое мы сможем передать, будет: 2 ^ ШиринаАдреса * ШиринаДанных = .бит. В случае с 16бит шиной адреса и 8бит шиной данных, мы сможем передать 65536байт. Чтобы точно понять принцип, давайте сократим до 3Bit Адрес и 1Bit Данные. Наглядно:


Стрелка — селектор, он управляется адресом, позволяя выбрать ячейку, с которой будет происходить работа по шине данных. Ячейка может быть каким-то регистром устройства, в случае с памятью у нас таких ячеек будет огромное количество. Любой параллельной памяти присуща линейность, что уравнивает скорости доступа к ячейкам. Третье - управляющие сигналы.



Основные управляющие: WE -разрешение записи RE -разрешение чтения CS0..n -выбор устройства Все три используют по одному биту. Если WE, то передаем информацию, если RE, то принимаем информацию. CSn — это разрешает взаимодействовать с устройством, что позволяет отключить его от всей шины. Тут у нас происходит разделение на главное устройство (одно) (Master) и ведомое(-ые) (Slave). Что же это дает? — Используя CS управляющие, мы можем подключить несколько устройств по одной шине! :-) Но, с каждым устройством — у нас будет уходить по одному пину CS.



Подобное используется в наших ПК. Данная система не имеет схем шифрования, сжатия — все сделано наиболее просто, а все простое — быстрое, но часто громоздкое. :-\ Скорость передачи будет напрямую зависеть от максимальной частоты I/O устройств. Если она 100MHz, а ширина данных — 8бит, то получаем 100МегаБайт/сек. :-) Таким может похвастаться не каждый HDD. Устройство внешней шины контроллера У контроллера ATSAM3X блок управления шиной состоит из нескольких частей.



SMC контроллер дает нам 24бита адреса и 16бит данных. NAND Flash — позволяет подключать флэш nand память, а также дает нам несколько линий CS и разрешения чтения/записи. ECC — контролирует остальные сигналы. При всем при этом, весь этот воз подключен к общей шине ЦП, что дает нам возможность обращаться напрямую к внешнему интерфейсу. То есть, мы можем просто послать данные на определенный адрес и он автоматом появится на внешней шине, причем со всеми необходимыми сигналами и установленными задержками. Это очень полезно при подключении доп. ОЗУ: при переполнении родного ОЗУ, данные пойдут на внешнее без участия пользователя. 1 2 3 4 5 uint8_t *addr = (uint8_t*)0x6xxxxxxx; ……… addr[x] = 128; //Отправим на внешнюю шину ячейку x (это ж указатель) i = addr[x]; //Прочитаем что-то memcpy(foo, addr, 978); //Или даже пересылки Изобразить схему работы можно так: