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

CH376S
(часть 1)
(часть 2)

*Представленные материалы в статьях являются моей изыскательской работой в практическом использовании CH376, поэтому они вряд ли тянут на учебное пособие, но уверен, что облегчат сообществу easyelectronics, освоить этот чип, не наступая на разнообразные подводные камни, которых тут хватает.

Продолжим практический разбор работы с MCU CH376, заранее попрошу у вас прощения, что я в этой части не буду рассматривать операций записи, как обещал, но в любом случае, здесь будут рассмотрены те ньюансы, которые несомненно помогут самостоятельно разобрать и эти вопросы.

Перед началом хотелось бы, всё-таки определиться к какому классу устройств принадлежит данный чип, так вот в Datasheet производитель часто его именует как MCU (Micro Controller Unit или по-русски Микроконтроллер), такчто именование CH376 как микроконтроллер не ошибочно.

*И ещё, чтобы флешь накопитель правильно работал и у вас не было проблем, необходимо отформатировать флешь с размером секторов 512 dec байт.

В этой статье попробуем поработать с файлами.

В комментариях к предыдущей статье у нас были обсуждения, связанные с представлением файлов MCU ch376s и было предложено исполнить команду FILE_ENUM_GO (вывод списка файлов каталога или выбранной директории), поэтому с неё и начнём.

Команда FILE_ENUM_GO (аналог команды DIR в Windows)

$57$AB$33 – вызов выглядит так

Но, как и многие другие операции, требует подготовительных действий:


1. - $57$AB$2F/*$00 – SET_FILE_NAME, устанавливаем имя файла, символ «*» - в данном случае означает выбор всех файлов 
и каталогов из корневого каталога, также символом «*» можно задать некоторые условия вывода файлов или каталогов, 
например, $57$AB$2F/123*$00, покажет все файлы, начинающиеся на 123 и т.п.

2. -  $57$AB$32 FILE_OPEN - открываем файл. 

На этом подготовка завершена, начинаем операции перебора.

3. - $57$AB$33 FILE_ENUM_GO -  перебираем файлы по заданному условию, если файлы есть, получаем ответ 1D  - и 
результат содержится в буфере (при этом обращаю ваше внимание в результате содержится одна файловая запись FAT).

4. - $57$AB$27 RD_USB_DATA0 - читаем буфер.

Повторяем пункт 3, если ответ 1D – значит есть ещё одна запись, тогда читаем буфер, если ответ 42- (ERR_MISS_FILE),
больше файлов для перебора нет.    

5. – Ну и напомню, что все операции с файлами надо завершать, выполнив команду $57$AB$36$00 – FILE_CLOSE.


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

Пример ответа MCU (выведет за раз одну файловую запись см. FAT)

*значение 20h идет следом за 1D, содержит длину выводимой информации 32 Dec байта, что соответствует одной файловой записи FAT

1D 20 31 32 33 34 35 36 37 38 54 58 54 20 10 01 D7 B9 78 50 7B 50 00 00 AF BB 77 50 F8 5C C0 00 00 00 1D – в данном 
примере файловая запись FAT32 размещена в буфере, а в примере между 1D20 и 1D, 
31 32 33 34 35 36 37 38 54 58 54 – имя файла с расширением по схеме 8+3  12345678TXT
20 – DIR_Attr, атрибуты файла,  0x20 означает архивный 
10 – DIR_NTRes
01 - DIR_CrtTimeTenth 
D7 B9  (меняем местами B9D7)- DIR_CrtTime, время создания файла, 
10111 001110 10111, 
10111 биты 0–4 секунды (в FAT Считается по 2 секунды), 23*2=46 сек
001110 биты 5-10 минуты 0-59=14 мин
10111 биты 11-15 часы=23 часа
78 50 - (меняем местами 50 78)  DIR_CrtDate, дата создания файла,
	0101000 0011 11000,
	11000 биты 0-4 секунды день месяца= 24 
	0011 биты 5-8 месяц =03 (март)
	0101000 биты 9-15 год, считается как 1980+результат( в моём случае 40)=2020
7B 50 - DIR_LstAccDate 
00 00 - DIR_FstClusHI
AF BB - DIR_WrtTime 
77 50 - DIR_WrtDate
F8 5C - DIR_FstClusLO DIR_FileSize
C0 00 00 00 - DIR_FileSize 4 байта, (уже мной рассмотрено в предыдущей статье)


Не трудно предположить, что, используя FILE_ENUM_GO с указанием полного имени, мы можем вызвать нужную нам файловую запись и получить сведения о файле.

На этом мы более или менее рассмотрели FILE_ENUM_GO.

Теперь попробуем прочитать какой-нибудь файл.

В прошлой статье я специально создавал файл, чтобы в дальнейшем произвести его чтение, но думаю его размера недостаточно чтобы подробно разобрать операцию чтения, поэтому сделаем файл побольше. Был создан файл размером 510 dec байт (это сам текст), «newtest.txt» и чтобы показать на скриншотах границу буфера созданы метки, первая на 252 dec байте (поставил там звездочку), вторая в конце, где написано 510b. Как вы знаете, наш рабочий буфер имеет максимально — 256 байт, а также при чтении мы будем туда же считывать служебную информацию (это и длина считываемой записи, и файловый дескриптор и т.п.), это мы увидим ниже на картинке.
Нам понадобятся новые команды для осуществления операций чтения:

— $57$AB$39 BYTE_LOCATE – команда принимает 4 байта – это значение типа longint без знака, пример расчёта был у нас рассмотрен во второй части, данная команда выставляет абсолютную позицию (file pointer) — точка откуда читать данные из файла.

— $57$AB$3A BYTE_READ – команда принимает 2 байта (эти два байта вводим в формате little-endian, то есть сначала младший байт– это значение типа unsigned integer, данная команда определяет сколько байт из файла необходимо прочитать от точки «file pointer» до значения «file pointer» +значение (unsigned integer 2 байта). Если значение в BYTE_READ больше чем 255 байт, то нам понадобится ещё одна команда BYTE_RD_GO.

— $57$AB$3B BYTE_RD_GO – команда продолжает чтение байтов из файла по 255 байт (от 0 до
255-го), она необходима в том случае, если в BYTE_READ указано число от 255 до 65536 — но это
в теории (в Datasheet – я не увидел, что это число должно быть меньше), если же число от 0 до 255- нам достаточно команды BYTE_READ и ещё выполнение этой команды автоматически передвигает file pointer в следующую позицию.

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

Алгоритм чтения (после открытия файла) выглядит примерно так:

Вариант I (вариант не самый правильный, но имеет место быть):

1. BYTE_LOCATE – выставляем file pointer, если есть такая необходимость (если файл только что открыт, MCU сам выставляет file pointer в ноль);
2. BYTE_READ + значение, например, $FF$00 (255), ну или другое, меньше $FF$00;
3. RD_USB_DATA0 (напоминаю — первая цифра ответа содержит длину данных в буфере);
4. BYTE_LOCATE, передвигаем file pointer самостоятельно;
5. продолжаем с пункта 2, пока не достигнем желательного результата.

Вариант II (можно использовать, когда BYTE_READ принял значении больше $FF$00 (little-endian):

1. BYTE_LOCATE;
2. BYTE_READ;
3. RD_USB_DATA0 — читаем буфер;
4. BYTE_RD_GO;
5. если ответ 1D, переходим к пункту 3.

Ну что же, попробуем прочитать файл по более правильному второму варианту:

1.	Первым делом проводим инициализацию (подключаем нашу флешку);
2.	$57$AB$2F/NEWTEST.TXT$00 – SET_FILE_NAME, устанавливаем имя файла.
3.	$57$AB$32 FILE_OPEN, открываем файл, здесь немного забегая вперед сообщу – при открытии файла, точка 
позиционирования (file pointer) переводится в нулевую.
4.	$57$AB$39$00$00$00$00 BYTE_LOCATE – устанавливаем позицию в ноль (не обязательна, если
только что выполнили пункт 3).
5.	$57$AB$3A$00$02 BYTE_READ – в общем запросили 512 байт из файла, если ответ 1D данные лежат в буфере,
а file pointer переместился в следующую позицию (таким образом, каждый вызов этой команды позволяет считывать 
последовательно n-е количество байт из файла, где это количество ограничено либо буфером, либо остаточным 
количеством байт (это в том случае, если их количество меньше размера буфера), если ответ 14 – мы достигли 
конца файла (но в нашем случае этого не произойдет). 
6.	$57$AB$27 RD_USB_DATA0 - читаем буфер.
7.	$57$AB$3B BYTE_RD_GO, если ответ 1D данные лежат в буфере, если 14 – мы достигли конца файла.
8.	Если не конец файла выполняем пункт 6.


Результаты выполнения представлены на картинках ниже:





Ну вот и всё, что в этот раз я хотел показать. В следующей части мы всё же дойдем до операций записи и подробно их рассмотрим, боюсь анонсировать что-нибудь ещё, а то вдруг не получится это сделать.
  • +2
  • 05 апреля 2020, 21:25
  • Saylon

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

RSS свернуть / развернуть
Запись/чтение/изменение файла уже было вами осуществлено?
0
  • avatar
  • Aneg
  • 24 апреля 2020, 16:54
Здравствуйте, да. Почти всё закончил, но последнее время сильно занят (очень много работы), поэтому руки не доходят. Если у Вас есть вопрос, то постараюсь ответить.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.