LinTai: качественные китайские корпуса и каркасы

VNC1L и все, все, все

FTDI VNC1L

Сергей Корыстов

Предисловие

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

FTDI - VNC1L

Задача

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

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

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

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

Решение с VNC1L (“Винни”) обещало рай за дополнительные 450 рублей розницы. И прежде всего, никаких забот по FAT. Но как это всегда бывает, рай нужно было еще заработать. Фирменное описание изложено тяжеловато, встречаются противоречия с примерами программ.

По умолчанию, подключение идет через UART. Идея замечательная. AVR общается с «Винни» через три интерфейса: UART, SPI, Параллельный. Выбор осуществляется перемычками. Для нашей задачи актуально было только SPI, т.к. все два UART-а были заняты. Конечно, скоростей при этом не достичь, но нам и не надо. Команды, которые подает AVR, имеют формат ASCII. Список этих команд достаточно развит: можно открывать файл, писать, читать, добавлять и.т.д.

VNC1L и все, все, все
Кликните для увеличения

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

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

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

SPI - Чтение байта данных

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

SPI - Чтение байта статуса

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

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

Как видно из диаграмм, сигнал 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

   
 

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

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

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

VNC1L и все, все, все

Во-вторых. Работая с различными по емкости «свистками» было замечено, что при инициализации идет бросок питания, который сбрасывал процессор. Т.е. питание, которое идет на разъем 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 в том виде, в каком они предоставляются, не реализовывались автором. Дополнения, которые описаны в разделе «Некоторые особенности и дополнения», схемотехнически не поддержаны.

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

keklab.ru

37 предложений от 22 поставщиков
USB интерфейс, Контроллер Vinculum USB Host, USB 2.0, 3 В, 3.6 В, LQFP, 48 вывод(-ов)
VNC1L-1A
FTDI
455 ₽
AiPCBA
Весь мир
VNC1L-1A-TRAY
FTDI
717 ₽
VNC1L-1A-REEL
FTDI
от 2 504 ₽
VNC1L-1A
по запросу
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя