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

(Часть 1)

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

Всем здравствуйте, продолжим наше знакомство с интерфейсным чипом 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, кириллическое имя файла к сожалению не удалось прочитать.

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

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

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

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
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.