[uquote="olegue",url="/forum/viewtopic.php?p=4239433#p4239433"]прокомментируйте....[/uquote]
это кусок кода для работы с флешкой: чтение/запись... подсчёт контрольных сумм...
а всякие там Адс, таймеры, сэмплирование, это все еще предстоит написать...
как этот кусок кода работает ? очень просто))
введение))
для работы с флешками все используют библиотеки... типа #include <SD.h>
в этой библиотеке (#include <SD.h>) уже есть встроенная инициализация... управление... и т.д.
https://radioprog.ru/post/334
Но ! Настоящие программисты не используют библиотек ! )) Настоящие программисты пишут всё сами... "вручную" ))
Открываем даташит флешки и читаем...
Всё управление флешкой происходит через регистры. Как и всеми другими устройствами (радио модулями... LCD экранами... и т.д.).
Регистры можно читать/писать...
Есть разные регистры... регистры статуса... регистры управления (они же регистры команд)... и т.д.
Код простой - тупо читаем/пишем регистры флешки... с помощью любого МК... Например ATmega8.
Пример:
1.
после включения питания первым делом надо проинициализировать флешку.
по умолчанию флешка работает по интерфейсу SD.
а нам надо чтобы флешка работала по интерфейсу SPI.
а так же перед началом работы с флешкой надо настроить дополнительные параметры работы флешки... всякие там напряжения питания... и т.д. (см. даташит).
для этого подключаем флешку к ATmega8 и отправляем по SPI следующие несколько команд (прописываем регистры управления флешки)...
///////////////////////////////////////////////////////////////// инициализация microSD:
///////////////////////////////// Преамбула - 80 синхроимпульсов.
for (x=0; x<10; x++) { tx3=0xFF; SPI3(); }; // "11111111"
PORTB.0=0; // SS microSD
/////////////////////////////////////////////////////////////////
//сброс microSD и перевод в режим SPI:
tx3=0x40; SPI3(); // 01xx xxxx + Номер команды - CMD0
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x95; SPI3(); // CRC7
// ответ R1: 0000 0001 - команда microSD принята
tx3=0xFF; SPI3(); // задержка 1 байт 0xFF
tx3=0xFF; SPI3(); x1 = rx3; // STATUS R1 0000 0001
//состояния интерфейса microSD (напряжение хоста и любой шаблон):
tx3=0x48; SPI3(); // 01xx xxxx + Номер команды - CMD8
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x01; SPI3(); // 0000 0001 -напряжение хоста 2.7 – 3.6 V
tx3=0xAA; SPI3(); // 1010 1010 -1010 1010 -проверочный шаблон
tx3=0x87; SPI3(); // CRC7
// ответ R7: 0000 0001; 0000 0000; 0000 0000; 0000 0001; 1010 1010
tx3=0xFF; SPI3(); // задержка 1 байт 0xFF
tx3=0xFF; SPI3(); // STATUS R1 0000 0001
tx3=0xFF; SPI3(); // 0000 0000
tx3=0xFF; SPI3(); // 0000 0000
tx3=0xFF; SPI3(); // 0000 0001 -напряжение хоста 2.7 – 3.6 V
tx3=0xFF; SPI3(); x1 = rx3; // 1010 1010 -проверочный шаблон
/////////////////////////////////////////////////////////////////
while ( (x1 != 0x00) && (tm_microSD != 255) ) { // MOSI 0xFF > MOSI 0x00 // -цикл 2...21
//////////////////////////////// ждём ответ R1: 0000 0000 STATUS:
//старт microSD: // microSD версия v.2 и выше.
tx3=0x77; SPI3(); // 01xx xxxx + Номер команды - CMD55
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // CRC7
// ответ R1: 0000 0001 - команда microSD принята
tx3=0xFF; SPI3(); // задержка 1 байт 0xFF
tx3=0xFF; SPI3(); x1 = rx3; // STATUS R1 0000 0001
//
tx3=0x69; SPI3(); // 01xx xxxx + Номер команды - CMD41
tx3=0x40; SPI3(); // 0100 0000 - хост поддерживает карту памяти высокой емкости SD
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // 0000 0000
tx3=0x00; SPI3(); // CRC7
// ответ R1: 0000 0000 - инциализация microSD завершена.
tx3=0xFF; SPI3(); // задержка 1 байт 0xFF
tx3=0xFF; SPI3(); x1 = rx3; // STATUS R1 0000 0000
/////////////////////////////////////////////////////////////////////
tm_microSD++; // таймаут microSD.
};
//////////////
if (tm_microSD == 255) { // таймаут microSD:
error_microSD_EEPROM |= 0b00000001; // 0000 0001 - error init microSD
};
tm_microSD = 0; // сброс таймаут tm_microSD.
///////////////////////////////////////////
PORTB.0=1; // SS microSD
//////////////////////////////////////////////////////////////////////////////////
// microSD - ток = 7 mA.
//////////////////////////////////////////////////////////////////////////////////////////////////////////
после этого флешка переключает интерфейс с SD на SPI... и переходит в рабочий режим.
теперь можно писать/читать данные на флешку.
для записи на флешку используем функцию TX_microSD(x); // где unsigned long x - это адрес сектора флешки
для чтения с флешки используем функцию RX_microSD(x); // где unsigned long x - это адрес сектора флешки
чтение/запись я сделал через буфер... так удобней))
пример ? пожалуйста))
например нам надо записать данные на флешку...
1.
записываем данные сначала в буфер bufer_microSD[512]...
2.
затем вызываем функцию TX_microSD(x); // указываем адрес для записи (сектор для записи - x).
*Примечание.
Флешка разбита на сектора. Один сектор это 512 байт. Сектор надо читать/писать целиком. Поэтому буфер так же имеет размер 512 байт.
После этого все данные из буфера будут записаны на флешку))
Или например надо прочитать данные на флешки...
1.
вызываем функцию RX_microSD(x); // указываем адрес для чтения (сектор для чтения - x).
*Примечание.
Флешка разбита на сектора. Один сектор это 512 байт. Сектор надо читать/писать целиком. Поэтому буфер так же имеет размер 512 байт.
2.
все считанные данные из флешки будут помещены в буфер bufer_microSD[512]...
*Примечание))
потребляемый ток:
-во время записи до 7 mA (microSD - ток = 7 mA).
-во время чтения ~0 mA (microSD - ток = 0 mA).
-во время простоя ~0 mA (microSD - ток = 0 mA).
вот так вот работает обычная флешка))
это кратко))
Добавлено after 3 minutes 13 seconds:
[uquote="Morroc",url="/forum/viewtopic.php?p=4239474#p4239474"]фм приемник еще и экранчик )[/uquote]
никаких ФМ ! ))
WEB-радио рулит ! ))
