Работа SPI-устройств с Arduino Nano на LGT8F328P

Здравствуйте! У меня вопрос по работе SD карты с Arduino Nano на LGT8F328P. Использую Arduino IDE. Работает только со стандартной библиотекой SD. С библиотекой SDFat карта памяти не инициализируется (с обычной платой на ATMega328P работает). Встречал в сети (ссылки нет) информацию, что аппаратный SPI LGT8F328P имеет дополнительный буфер на 4 байта, и библиотеки, не умеющие работать с этим буфером, не работают. Видимо, SD – умеет, а SDFat – нет. Прошу помощи в том, чтобы наладить работу с использованием библиотеки SDFat и аппаратного SPI. Может самый лучший вариант – внести какие-то изменения в библиотеку SDFat? Но это сильно выходит за пределы моих возможностей. Думаю, что такая проблема есть и в работе с другими SPI-устройствами, например, с дисплеем ST7735. Поэтому, в идеале, хотелось бы найти универсальное решение для SPI-устройств. Встречал, предложение использовать программный SPI, но он медленнее и хотелось бы, чтобы до этого не дошло.

1 лайк

Ну для начала уточним, какую плату выбираете в Ардуино IDE? Потому как для вашей платы нужен спец.аддон

1 лайк

Цитата: “… Arduino Nano на LGT8F328P. Использую Arduino IDE. Работает только со стандартной библиотекой SD”. Аддон установлен. Плата - LGT8F328.

@бать, мне новые очки нужны похоже…

1 лайк

Попробуйте перед подключением библиотек добавить строку
#define SPI_DRIVER_SELECT 1
Вроде это должно дать команду использовать только стандартный драйвер
Сам не пробовал. Не уверен, что поможет.

Изменено позже.

#define SPI_DRIVER_SELECT 1
Добавлять надо в началоSDFatConfig.h
Проверил. У меня SdInfo работает.
Адон - by dbuezas версия 2.0.7

Вывод в монитор при #define SPI_DRIVER_SELECT 1

SdFat version: 2.2.2

Assuming the SD is the only SPI device.
Edit DISABLE_CS_PIN to disable an SPI device.

Assuming the SD chip select pin is: 10
Edit SD_CS_PIN to change the SD chip select pin.

type any character to start
init time: 3 ms

Card type: SD2
sdSpecVer: 2.00
HighSpeedMode: true

Manufacturer ID: 0X1B
OEM ID: SM
Product: UD
Revision: 1.0
Serial number: 0XC8A15627
Manufacturing date: 10/2008

cardSize: 1015.02 MB (MB = 1,000,000 bytes)
flashEraseSize: 128 blocks
eraseSingleBlock: true
dataAfterErase: zeros

OCR: 0X80FF8000

SD Partition Table
part,boot,bgnCHS[3],type,endCHS[3],start,length
1,0X0,0X3,0X3F,0X0,0X6,0XB,0XEB,0XD7,251,1982213
2,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0,0
3,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0,0
4,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0X0,0,0

Scanning FAT, please wait.

Volume is FAT32
sectorsPerCluster: 1
fatStartSector: 2557
dataStartSector: 33019
clusterCount: 1949445
freeClusterCount: 1949433

type any character to start

такая же проблема, так на SD и остался.

да с этим SD непросто, мало того, что медленный так еще и конфликтует со всеми библиотеками…то ди дело внутренняя флэш (на ESP32 sqlite3 в базе из полмиллиона записей в каждой из 5 таблиц делает нужную выборку за 0,8 секунды)

edem, для SD карты и ST7735 дисплея можно остаться на работающих библиотеках соответственно SD и TFT. Но что делать с другими SPI-устройствами, с которыми придётся работать, когда не будет большого выбора библиотек для них, а всего одна, и не будет двух лет времени для решения проблемы? Например, с BME280 - на I2C работает, на SPI - не пробовал. Думаю, что эта проблема интересует многих пользователей, не очень высокого уровня как программистов. Потратил на это много времени и усилий с пока скромными результатами, поэтому понял, что без помощи сообщества более опытных мне не справиться. Поэтому хотелось бы найти универсальное решение для всех SPI-устройств.

1 лайк

Upper, Ваше предложение опробую. Ранее встречал предложение сделать то же самое в файле SDFatConfig.h. Опробовал, но я не помню, чтобы получал положительный результат. Встречал информацию, что новый буфер в 4 байта имеется в самом аппаратном SPI контроллера LGT8F328P. Библиотека SPI с аддона умеет работать с этим буфером, как и библиотека SD, а библиотека устройства SDFat - нет. По моему мнению, положительного результата можно добиться двумя путями: заглушить использование 4 байтного буфера в контроллере и сделать его как в атмеле (худший вариант), или лучше научиться как подружить пользовательские библиотеки SPI-устройств с контроллером и его SPI библиотекой, которые уже друг друга понимают.

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

Да, в SDFatConfig.h - надежнее (т.к. я не разбираюсь в особенностях компиляции).
SPI_DRIVER_SELECT - 1 (по описанию) должен привести к использованию SPI из адона (т.е. LGT версию), а не улучшенную для AVR версию в SDFat.

Петрович говорит, что надо использовать транзакции

Upper, я понял, что установка 1 должна приводить к использованию старой версии библиотеки SPI, однако, сильно похоже, что не приводит. Пробовал в своей программе давать в кавычках (" ") прямую ссылку на старую библиотеку SPI, но в протоколе компиляции всегда было использование библиотеки SPI из аддона - видимо, работа оптимизатора компилятора, победить который я не смог.

ua6em, грешным делом, подумал, что Вы прикалываетесь над непонимающим или просто выругались. Посмотрел - штука интересная, но она предполагает посылку и приём с устройством напрямую без библиотеки устройства, к чему я сейчас сильно не готов. Как воспользоваться этой идеей?

когда меня занимала эта тема была мысль попробовать более старые библиотеки sdfat и если заработает , пройтись по

измеениям в версиях и найти решение

olegue, пробовал версии 1 и 2 библиотеки SDFat - не работают. Так может сейчас пришло время найти решение? С первого раза мало когда что-либо путное получается.

если SDFatBeta инициализирует, то это дает какие-то мысли?

olegue, только такие, что версия 2.2.2 не работает…

А может ну её эту LGT8F328P и там, где плохо с совместимостью устройств, воспользоваться православным атмелом? Такой вариант не рассматривается? Дядя на “гуталиновой” фабрике работает?