Индекс материала
VNC1L и все, все, все
Задача
Особенности SPI интерфейса
Некоторые особенности и дополнения
Программа
Дополнительные материалы
Все страницы
Vinculum

Предисловие

Речь пойдет о микросхеме под названием VNC1L (“Винни”), которую сделала фирма FTDI. Это хост-контроллер USB. С её появлением открывается возможность для микроконтроллера управлять USB-флэш-диском, в простонародье именуемым «свистком».

Полезные ссылки для ознакомления:


Задача

Любая задача по управлению предполагает наличие измерения и хранения результатов измерения. В нашем случае контроллер измеряет, решает задачу управления исполнительными устройствами и пишет логи один раз в минуту. Непрерывный процесс управления может быть достаточно длительным, например 7 дней. Удобно логи писать прямо в ASCII, с тем, чтобы полученный файл легко импортировался в MS Excel. Взятый за основу контроллер Atmega128, имея на борту энергонезависимую память, не удовлетворяет нашим требованиям по емкости этой памяти. Вначале было отработано решение с SD картами. За основу взята библиотека, поддерживающая FAT.

Это решение имело одно достоинство и два недостатка для нашей задачи.

Достоинство: дешево, аппаратно никаких промежуточных драйверов.
Недостатки:
  • занимает 17% памяти;
  • при подключении пяти SD карт разных емкостей и производителей, одна SD карта не работала с контроллером, хотя стандартный CARD Reader ее читал.

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

Решение с VNC1L (“Винни”) обещало рай за дополнительные 450 рублей розницы. И прежде всего никаких забот по FAT. Но как это всегда бывает, рай нужно было еще заработать. Фирменное описание изложено тяжеловато, встречаются противоречия с примерами программ.
По умолчанию подключение идет через UART. Идея замечательная. AVR общается с «Винни» через три интерфейса: UART, SPI, Параллельный. Выбор осуществляется перемычками. Для нашей задачи актуально было только SPI, т.к. все два UART-а были заняты. Конечно скоростей при этом не достичь, но нам и не надо. Команды, которые подает AVR имеют формат ASCII. Список этих команд достаточно развит: можно открывать файл, писать, читать, добавлять и.т.д.

vinischfull


 

Особенности SPI интерфейса

SPI интерфейс, реализованнай в AVR не имеет никакого отношения к SPI интерфейсу “Винни”. Исходя из этого 4 ноги AVR, реализующие взаимодействие могут быть любыми. Диаграммы взаимодействия реализованы программно. “Винни”, как SPI устройство может быть только SLAVE. Режим SPI выбирается ногами 46 и 47 “Винни” и никак не связан с прошивкой. Всего существует три режима взаимодействия низкого уровня:

Чтение байта данных:

datar

Чтение байта статуса:

statusr

Запись байта данных:

dataw

Как видно из диаграмм сигнал CS активен по высокому уровню, что не является общепринятым. Запись бита происходит по переднему фронту SCLK. Существует три фазы диаграммы:

  • • Подготовительная, где определяется направление передачи (Чтение/Запись) и адресс. (3 цикла)
  • • Фаза передачи бйта данных. (8 циклов)
  • • Завершающая, где происходит чтение статусного бита, и завершение CS. (2 цикла)

Всего взаимодействие происходит за 13 циклов SCLK.

Статусный бит определяет правильность прохождения всей последовательности на низком уровне. Его суть проста, если статусный бит равен нулю, все ОК. В противном случае необходимо повторить диаграмму. Это справедливо для всех трёх режимов. Если читается байт статуса, бит статуса при этом всегда ноль.

Бит направления (R/W) Бит адреса (ADDR) Операция
1 0 Чтение байта данных в буфер приемника
1 1 Чтение байта статуса
0 0 Запись байта данных в буфер передатчика

Байт статуса определяет взаимодействие на более высоком уровне, это уровень передачи команд и получение ответа. Чтобы синхронизировать эти взаимодействия в “Винни” еть буфер приемника и буфер передатчика. Их сосотяние определяется значением битов байта статуса.

Биты Значение Состояние
Bit0 0 Буфер приемника пуст
1 Буфер приемника заполнен
Bit1 0 Буфер передатчика заполнен
1 Буфер передатчика пуст
Bit4
Bit5

Некоторые особенности и дополнения

После начала написания статьи прошло достаточно времени и за это время появились некоторые аппаратные дополнения в схеме, которые повышают надежность схемы.

usbВо-первых. Чтобы быстро определять наличие флешки в разъеме одних программных мер не достаточно. Программные меры есть - процедура check_flesh, но она занимает слишком много времени. Для быстрого анализа факта наличия флешки была сделана схема, которая использует тот факт, что сигнал D+ на разъёме USB меняет свой уровень в зависимости от наличия или отсутствия флешки. Этот сигнал через сопротивление 100 ком поступает на транзистор, а дальше в процессор. Динамический характер данных D+ сглаживается конденсатором 0.1uF.

Во-вторых. Работая с различными по ёмкости «свистками» было замечено, что при инициализации идет бросок питания, который сбрасывал процессор. Т.е. питание, которое идет на разъем USB должно быть отфильтровано, либо вообще иным, нежели питание процессора.


Программа

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

Программа для Atmega128 написана на AVR Studio V4.18 Build 716. Модуль su.c – главный. В нем настраиваются системные прерывания и его задача раз в минуту писать в «Винни» строку, представленную в header.h. Модуль - spiflash.c реализует низкоуровневый аналог SPI интерфейса и высокоуровневый доступ к «Винни» для реализации процедур с файлами: открыть, записать, закрыть, определить наличие файла и т.д. Данный программный модуль работает в реальном проекте пол-года. Разработана процедура bootloader для Atmega128, которая загружает подготовленный hex-файл c флешки. «Зависонов» не наблюдается.

Для борьбы с «зависонами» в определенных местах низкоуровневых процедур, там, где есть оператор While, вылезти из бесконечного цикла помогает счетчик count1min. Этот счетчик инкреминируется по прерыванию, в то время как работа с «Винни» происходит без всякого аппаратного прерывания. Встроенный в процессор WatchDog также на страже.


Дополнительные материалы

 

 

 

 

ВНИМАНИЕ!

Данные проекты для PCAD в том виде, в каком они предоставляются не реализовывались автором. Дополнения, которые описаны в разделе «Некоторые особенности и дополнения» схемотехнически не поддержаны.

Проблеммы программирования «Винни» описаны в ссылках «Полезные ссылки для ознакомления». Обращаю внимания, что микросхема «Винни» поставляется девственно чистая и программировать её надо обязательно. Это тоже не простая задача, есть свои нюансы, но это уже совсем другая история.

Обновлено (17.06.2012 09:04)

 
Новости электроники от РадиоЛоцмана
Вопросы искусственного интеллекта, философия и практика
. @Mail.ru