Как установить скорость SPI для ATmega1284P?

spi

Я использую MightyCore и platformio. Мой конфигурационный файл выглядит следующим образом

Мои предохранители установлены следующим образом:

E:FD 
H:D6 
L:8F

У меня контроллер работает на частоте 16 МГц, а частота SCK - 8 МГц. Мой дисплей показывает белый цвет, и это все. Я знаю, что для того, чтобы он функционировал должным образом, я должен использовать тактовую частоту SPI 1 МГц. Если я запрограммирую предохранитель CKDIV8, мой контроллер не запустится. Не знаю почему, но для меня там творится какая-то черная магия. Мой недостаток знаний здесь не поможет.

Я попытался использовать следующие приемы:

Настройка скорости SPI с помощью библиотеки TFT

// ранее в main.cpp
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// позже в setup()
tft.setSPISpeed(1000000); // не влияет на SCK

Попытка установить его непосредственно через экземпляр класса SPI:

// в setup()
SPI.setClockDivider(SPI_CLOCK_DIV128); // нет эффекта

Или статически:

// в setup()
SPIClass::setClockDivider(SPI_CLOCK_DIV128); // по-прежнему нет эффекта

Также я попытался передать флаг сборки DEFAULT_SPI_FREQ с предустановленной частотой.

У меня закончились идеи.

Схема здесь: Schematic

, 👍0

Обсуждение

является ли setSPISpeed после init?, @Juraj

"Если я запрограммирую предохранитель CKDIV8, мой контроллер не запустится". Как вы это определяете?, @timemage

@Juraj нет. Это было раньше. Я поместил его позже, и теперь он работает., @zoonman

@timemage У меня есть некоторые манипуляции с выводом позже в setup(), и они не происходят., @zoonman

зачем вам размещать его раньше? init инициализирует SPI, а затем, конечно, устанавливает значение по умолчанию., @Juraj


1 ответ


1

В соответствии с этой проблемой setSPISpeed должен быть сделан после initR следующим образом:

tft.initR(INITR_BLACKTAB);
tft.setSPISpeed(1000000);
,

init инициализирует SPI и, конечно же, устанавливает значение по умолчанию. вы можете изменить его только после этого, @Juraj

@Juraj Я понятия не имею, что происходило в голове инженеров Adafruit. Дисплей не может выполнить инициализацию при частоте 8 МГц, потому что SPI слишком быстр для этого. Он должен быть инициализирован на частоте 1 МГц, тогда он должен функционировать должным образом., @zoonman