Подключение и использование модуля на интерфейсном чипе CH376S (часть 2)

(Часть 1)
(Часть 3)
Из этой статьи вы узнаете о дополнительном инструменте, который нам понадобится, сделаем первые шаги по работе с файлами — откроем файл, узнаем его размер и разберемся с конвертацией полученных результатов.

Всем здравствуйте, продолжим наше знакомство с интерфейсным чипом CH376S.
Для дальнейшей работы нам понадобится как-то конвертировать полученные или наоборот подготавливаемые данные, для этого будем использовать инструментарий:

RapidTables это онлайн конвертер из ASCII в Hex и обратно, он удобен тем что позволяет вставлять (знак разделитель, в нашем случае '$')

конвертер из ASCII в Hex и обратно

Как я понял из DataSheet имена файлов для чтения/записи с (на) USB устройство, должны быть указанны в заглавном виде, например: TEST.TXT, но мы это проверим на практике, дабы удостовериться в этом).
Подготовим наш flash накопитель (он должен быть отформатирован в файловую систему FAT( пусть это будет 32) в операционной системе Windows и в настройках всё должно быть по умолчанию.
На flash накопителе в корне создаём файл: TEST-1.TXT (Заполним его какими-нибудь случайными данными) что бы файл был не пустым, это нам понадобится в дальнейшем, а также создадим копию этого файла, но только всё прописными буквами и назовем его test-2.txt

вот такой текстовый файл получился у меня

ну и ещё для одного теста запишем на flash какой-нибудь большой файл, например фильм.

так выглядят файлы на flash накопителе

Итак, файлы имеют следующие размеры:
  • TEST-1.TXT — 192 байта;
  • test-2.txt — 192 байта;
  • файл film.mkv — 779 723 203 байт.

Итак, первым делом подключимся (см. часть 1), и проведем инициализацию:

1. $57$AB$05 — сброс контроллера (RESET_ALL);
2. $57$AB$15$06 — переключение в режим USB (SET_USB_MODE) — ответ должен быть: 51 15 (значит всё хорошо, продолжаем);
3. $57$AB$30 — подключение USB Flash (DISK_CONNECT) — ответ должен быть: 14 (значит всё хорошо, продолжаем);
4. $57$AB$31 — монтируем USB Flash (DISK_MOUNT) — ответ должен быть: 14 (значит всё хорошо, продолжаем);

Ну и теперь наберем следующую команду (только сначала разберем на составные части)

5. $57$AB$2F$2F+FileName+$00 — (SET_FILE_NAME);
— $57$AB — синхронизационные байты;
— $2F — команда SET_FILE_NAME;
— $2F — "\" — ASCII символ обозначающий корневой каталог, знак может быть как "\ backslash", так и "/ slash" — это не будет ошибкой.
FileName — это сделано для удобства восприятия (здесь конечно же должна быть шестнадцатеричная последовательность), здесь то нам и понадобится RapidTables
вводим TEST-1.TXT


Итак, наш FileName получился таким: 54$45$53$54$2D$31$2E$54$58$54
в конце ставим $00 — свидетельствует об окончании имени файла

Ну и окончательно наша команда будет выглядеть так:
$57$AB$2F$2F$54$45$53$54$2D$31$2E$54$58$54$00 — (не забудьте вставить $ вначале имени файла, конвертер это не делает)
ничего не произойдет, но будьте уверенны, если всё сделано правильно, то чип запомнит что работать надо именно с указанным файлом.

6. $57$AB$32 (FILE_OPEN) — открываем файл (ответ -14, значит всё хорошо)
7. $57$AB$0C$68 (GET_FILE_SIZE) получаем размер файла (команда $0C$68) — в ответе мы получим данные из четырех байт — это unsigned long (4 байта) 32 разрядное значение.


При этом передача идет с младшего байта (в нашем случае):

0 байт — С0
1 байт — 00
2 байт — 00
3 байт — 00

Наверное многие знают как можно эти значения преобразовать (например) в десятичный вид, но есть люди которые этого не знают. Есть разные способы, но приведу на мой взгляд самый понятный. Давайте попробуем:

Наша Задача последовательно перебирать каждый байт кроме нулевого (его значение сразу запоминаем) умножать его на максимальное количество значений помещающихся в байте (это числа от 0 до 255, а всего 256 значений) возведенных в степень соответствующую номеру каждого байта (незабываем нумерация с нулевого) и складываем полученные результаты. Делаем по шагам:

Шаг -1
берем 0 байт
С0 — или в десятичной системе 192 — этот значение запоминаем
Шаг — 2
берем 1 байт
00 — в дес 0 — и умножаем его на 256^1
Шаг — 3
берем 2 байт
00 — в дес 0 — и умножаем его на 256^2
Шаг — 4
берем 3 байт
00 — в дес 0 — и умножаем его на 256^3
Шаг — 5
полученные результаты суммируем и получаем: 192 байта (не самый лучший пример, но мы ещё посчитаем размер файла film.mkv, там будет всё наглядней)

Теперь давайте попробуем открыть и посмотреть файл test-2.txt (помните я писал что мы можем работать, только с заглавными буквами имен файлов)

Пробуем:
обращаемся к RapidTables — вводим test-2.txt — получаем $74$65$73$74$2D$32$2E$74$78$74

Полностью команда выглядит так: $57$AB$2F$2F$74$65$73$74$2D$32$2E$74$78$74$00


ошибка — ответ 42 при попытке открыть файл

Вводим, ну и получаем ошибку ( — и да я попробовал всё же получить размер, но данные получились неверными (видно на картинке выше).

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

Продолжим, посчитаем размер файла film.mkv, только обзовём его правильно FILM.MKV

Получаем имя файла: $46$49$4C$4D$2E$4D$4B$56

Полностью команда выглядит так: $57$AB$2F$2F$46$49$4C$4D$2E$4D$4B$56$00


размер файла FILM.MKV

0 байт — С3
1 байт — A1
2 байт — 79
3 байт — 2E

Шаг -1
берем 0 байт
С3 — или в десятичной системе 195 — этот значение запоминаем
Шаг — 2
берем 1 байт
A1 — в дес 161 — и умножаем его на 256^1 = 41216
Шаг — 3
берем 2 байт
79 — в дес 121 — и умножаем его на 256^2 = 7929856
Шаг — 4
берем 3 байт
2E — в дес 46 — и умножаем его на 256^3 = 771751936
Шаг — 5
складываем:
195+41216+7929856+771751936=779723203 (помните выше я писал размер файла film.mkv — 779 723 203 байт)

Всё сошлось )

Upd: Да и совсем забыл написать...
По окончании всех операций с файлом или каталогом мы должны его корректно закрыть
выполняется это командой $36$00
Полностью команда выглядит так: $57$AB$36$00 ответ должен быть: 14 (значит операция по закрытию файла завершена успешно)

Upd:
По подсказкам читателей мы упростим работу в терминале, команды переводить в Hex нет необходимости, запись типа (SET_FILE_NAME) будем писать так: $57$AB$2F/TEST-1.TXT$00 (ну что же, это упростит восприятие и сократит текст)

Всё же к именам файлов с нижним регистром можно обращаться, если вызов указывать в верхнем регистре (не буду приводить скриншоты, уж поверьте на слово)
то есть обращаясь к тестовому файлу test-2.txt, как $57$AB$2F/TEST-2.TXT$00 — файл откроется без ошибки, проверено.

Также проверил с какой длиной имени файла может работать чип и понимает ли он кирилицу на flash были дополнительно созданы файлы с такими именами:
  • 12345678.txt
  • 123456789.txt
  • кирилица.txt
Каковы результаты?
Мы смогли открыть только первый файл, значит действительно, формат имени файла должен быть, как в MS-DOS — короткое имя 8+3, кириллическое имя файла к сожалению не удалось прочитать.

На этом буду заканчивать, надеюсь было интересно…

В следующий раз мы будем читать файлы, производить запись, попробуем дописать в файл что-нибудь, попробуем создать файл и может ещё чего-нибудь ))
  • +3
  • 24 марта 2020, 15:43
  • Saylon

Комментарии (23)

RSS свернуть / развернуть
Я конвертирую HEX <-> DEC по другому, и по моему удобнее. Получили ответ от устройства в HEX, вызвали стандартный калькулятор CALC.exe, если он еще не в режиме программиста переключили, радиокнопкой переключили в HEX режим, ввели 2E79A1C3 (здесь размер файла FILM.MKV), радиокнопкой переключили в DEC режим. Калькулятор покажет 779723203, собственно этого и добивались.
Когда нужно преобразовывать множество значений это более удобный способ чем предложенный.
0
Спасибо, за советы, я обязательно приму их к сведению. Да, можно было использовать и калькулятор, но мне хотелось показать ручной способ преобразования (алгоритм), я надеялся что кому-то это может пригодится, ну или просто для понимания.
0
А Вы параллельный интерфейс не пользовали с этим модулем?
0
К сожалению нет, но в DataSheet по моему в пункте 6.2 приведена табличка и кратким описанием по подключению
0
Ну и окончательно наша команда будет выглядеть так:
$57$AB$2F$2F$54$45$53$54$2D$31$2E$54$58$54$00 — (не забудьте вставить $ вначале имени файла, конвертер это не делает)
Ничуть не хуже оно работает с $57$AB$2F/TEST-1.TXT$00, и незачем морочиться с конвертером.

Ну и такими темпами до реальной работы с файлами мы дойдем части к десятой…
0
  • avatar
  • Vga
  • 24 марта 2020, 22:21
Спасибо за подсказку, в следующей части попробую полностью разобрать работу с файлами, уже работаю над ней.
0
Можешь еще более другую терминалку попробовать. В ней команда будет выглядеть как \x57\xAB\x2F/TEST-1.TXT\0 (режим отправки ASCII C-style).
0
Спасибо попробую
0
Латиницу в терминале можно напрямую вводить, без преобразования в hex.
И по поводу капса в названиях вфайлов. Попробуйте назвать файл test-2.txt но открыть его как TEXT-2.TXT, полагаю у вас получится. Скорее всего чип читает короткие имена файлов, а не полные (8 символов имя + 3 расширение). Если тут на сайте нет статей, то в описании библиотеки FatFS (или PetitFS) должно быть. Конвертация латинницы в верхний регистр много не просит по коду. Минус будет только в том, что кириллические имена не поддерживаются.
За статьи спасибо. Продолжайте писать.
0
Спасибо, очень интересно, обязательно попробую и отпишусь.
0
Там есть команда поиска файлов (FILE_ENUM_GO или как-то так). Накидай на флешку файлов с длинными именами, с кириллическими именами, с длинными кириллическими именами и посмотри что чип сумеет найти) А потом — попробуй что из найденного сумеет открыть.
0
Внёс изменения в конце, действительно поддерживает короткие имена без кириллицы
0
Не-не, ты именно поиск по папке прогони, командой CMD_FILE_ENUM_GO. 123456789.txt вполне вероятно откроется как 123456~1.txt, а вот видит ли он кириллицу и под каким именем — вопрос интересный. Вполне может показать как "ЄЁаЁ«Ёж .txt".
0

вот такие файлы были созданы

а вот что вышло при чтении из буфера
Есть такое
вполне вероятно откроется как 123456~1.txt

Если интересно, повторить, то делаем так:

1 — $57$AB$2F/*$00 set_file_name
2 — $57$AB$32 open_file

3 — $57$AB$33 file_enum_go
4 — $57$AB$27 rd_usb_data0
если после file_enum_go 1D повторяем последовательность 3-4, пока не появится 42 после выполнения file_enum_go
Не очень понимаю почему из буфера возвращается 33 байта, а вроде должно быть 32 ???
0
Ну ты же видишь, что на картинке ничего не разобрать. И возьми мою терминалку (VSTerm 2.0 alpha), в режиме приема HEX она более читаемый результат вывалит (также желательно поставить галку Captions), плюс она не такая широкая (а местный движок режет картинки именно по ширине).
0
VSTerm 2.0 alpha
— там только исходники или скомпилированный есть?
VSTerm 1.1b пока пробую
0
1.1 слишком старый, бери 2.0. Скомпилированный лежит в разделе Releases на гитхабе.
0
Я попробовал, но мне как-то не очень удобно. И в вашей программе не хватает чего-то типа макросов в виде кнопок (историей не очень удобно пользоваться — но это лично моё мнение), это очень необходимо когда множество раз нужно отправить определённые команды. Для меня идеалом скорее всего будет Docklight, хорошая программа но платная. Вот, если бы вы доработали свою, до похожего уровня.
0
А что конкретно неудобно?
Макросами я не пользовался. Что они делают? Просто отправляют по нажатию кнопки заранее подготовленную последовательность или позволяют что-то более сложное, типа скриптинга?
Хистори доступна по стрелочкам, если надо несколько раз послать одно и то же — то каждая отправка выполняется как .
Для меня идеалом скорее всего будет Docklight, хорошая программа но платная. Вот, если бы вы доработали свою, до похожего уровня.
Терминалка изначально задумана как простая, так что дорабатывать до подобного монстра врядли буду.
0
Покажи уже, как выглядят файлы с кириллическими именами в выхлопе file_enum_go в гексе, а не аскии-мусоре.
0

Сделал что вы просили на Docklight
Кстати, слева те самые макросы (скриптинг в моём случае не нужен, а вообще terminal его поддерживает)
Удобно же нажать кнопку, где ассоциативно названа какая-то последовательность действий, на мой взгляд да.
Я думаю лучше в winhex посмотреть, там мы и увидем LFN (long file name) записи, имена на кирилице, автоматом считаются LFN записью, так-как в Unicod-е — но…
И ещё по поводу имён, производитель ссылается на пример в DataSheet —
8.4.10. Operation lower-case file name and long file name, please refer to the explain of example EXAM11
, надо посмотреть )
0
Ровно та же проблема под названием «картинку сплющило и хрен что разберешь». Но, тем не менее, текст достаточно разборчив чтобы понять — оно работает! Третий файл называется ПРИВЕТ~1.TXT, четвертый — КИРИЛИЦА.TXT. Не надо только забывать, что FAT — ФС досовская и, соответственно, использует кодировку 866. Надо полагать, точно так же оно будет работать и с именами на любом другом языке.
Над макросами я подумаю.
0
Не знаю, что за проблема с картинками — у меня вроде всё нормально отображается. По поводу Вашей программы, да, вполне заслуживающая внимания, но в моём случае ввод большого количества однообразных команд вызывает неудобство, также удобной функцией (в Docklight) считаю мгновенное переключение отображения в окне Communication — ASCII, HEX, Decimal, Binary.
Над макросами я подумаю.
— обеими руками за ). С удовольствием потестирую, если захотите.
По поводу обращения к файлам в кодировке 866 —
Надо полагать, точно так же оно будет работать и с именами на любом другом языке.
— попробую поэкспериментировать, может и будет в этом толк.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.