SPI. прошу подсказать.
- Войдите на сайт для отправки комментариев
Ср, 29/06/2022 - 17:59
есть мастер, где использую softSPI (аппаратный spi для экранчика, а низкочастотный программный spi для слейва, тактирующегося от 4МГц)
полный код мастера
#include "SPI.h" #include <SoftSPI.h> #include "Adafruit_GFX.h" #include "Adafruit_ILI9341.h" #include <Fonts/FreeMonoBold24pt7b.h> long previousMillis = 0; byte incomingByteSPI; bool synchmk = false; // Create a new SPI port with: // Pin 3 = MOSI, // Pin 4 = MISO, // Pin 5 = SCK SoftSPI mySPI(3, 4, 5); #define TFT_DC 7 //пин для управления экраном 9 #define TFT_CS 6 //пин для управления экраном 10 #define TFT_RST 4 //8 #define TFT_MISO 12 // Пин подключения вывода дисплея SDO(MISO) #define TFT_MOSI 11 // Пин подключения вывода дисплея SDI(MOSI) #define TFT_CLK 13 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); //управление экраном void setup() { mySPI.setClockDivider(SPI_CLOCK_DIV32); mySPI.begin(); delay(1); tft.begin(); //инициализация экрана delay(20); tft.cp437(true); //инициализация русского алфавита для экрана tft.setRotation(3); delay(20); tft.setFont(); } void loop(void) { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > 1000) { previousMillis = currentMillis; testingEnableMK(); } } void testingEnableMK(){ SynMK(); tft.fillRect(10, 30, 165, 60, ILI9341_BLACK); tft.setCursor(10, 40); tft.setTextSize(1); if (synchmk){ tft.setTextColor(ILI9341_GREEN); tft.print("synchronizing OK"); }else{ tft.setTextColor(ILI9341_RED); tft.print("NOT synchronizing"); } tft.setCursor(10, 50); tft.print(incomingByteSPI); } void SynMK(){ mySPI.transfer('S'); delay(1); incomingByteSPI = mySPI.transfer(' '); delay(1); if (incomingByteSPI == 'A'){ synchmk = true; }else{ synchmk = false; } }
код ведомого (пин ss постоянно на земле)
#include <SPI.h> volatile byte incomingByteSPI; void setup() { SPI.begin(); SPI.beginTransaction(SPISettings()); pinMode(MISO, OUTPUT); pinMode(MOSI, INPUT); pinMode(SCK, INPUT); pinMode(SS, INPUT); SPI.attachInterrupt(); // Включаем прерывания } void loop() { } ISR(SPI_STC_vect) { incomingByteSPI = SPDR; if (incomingByteSPI == 'S'){ SPDR = 'A'; }else{ SPDR = 'B'; } }
когда оба устройства подключаю вместе, подаю на них одновременно питание, тогда на экране выводится, что все ок, стоит убрать провода mosi, miso и sck, тогда экран выводит что связи нет. стоит вернуть эти провода, все равно пишет что нет связи.
т.е. правильный обмен только при первом включении.
Подскажите, пожалуйста, что я делаю не так.
p.s. пример тут на форуме про двусторонний обмен смотрел. часть от туда даже использовал. все равно не фурычит.
хммм. если в слейве постоянно обнулять регистр управления SPI и снова ставить его в слейв, а потом читать что пришло, тогда все работает нормально.
вангую, что три пина SPI (кроме ss ибо он всегда на земле) надо было подтягивать через 100К к земле. в момент, когда я вытаскиваю эти три провода, происходит какая-то дикая шляпа и контроллер сходит с ума. Я прав?
UPD: хммм. нет. это не решило проблему.
Возможно надо "передёрнуть" CS что-бы возобновить общение
Возможно надо "передёрнуть" CS что-бы возобновить общение
а какое отношение CS имеет к SPI ? не понял. или все-таки SS? так он у меня на землю посажен полностью.
а какое отношение CS имеет к SPI ? не понял. или все-таки SS? так он у меня на землю посажен полностью.
На слэйве может называться CS
нет возможности передернуть. он посажен на землю.
стоит убрать провода mosi, miso и sck
Ты дурак? Ты зачем провода из работающего прибора убираешь?
Ты дурак? Ты зачем провода из работающего прибора убираешь?
А может он разрабатывает "горячее" подключение SPI?)))
то есть питание на слейве остаеться когда линии spi отключены ?
а что по вашему слейв должен ответить если примит пробел т.е. ´ ´ ?
Ты идиот? у отключаемого устройства питание может и не пропадать.
Разве такой метод называется "горячее подключение"?
Всё верно. У него своё есть питание. когда отключаю провода от него, то слейв продолжает работать и выполнять свои функции, когда подключаю заново, земли объединяются, но связи уже нет.
кому должен? у меня такой ответ слейва на ' ' не прописан. так что в принципе отвечать слейв на ' ' не должен..... или должен?
вангую, что три пина SPI (кроме ss ибо он всегда на земле) надо было подтягивать через 100К к земле. в момент, когда я вытаскиваю эти три провода, происходит какая-то дикая шляпа и контроллер сходит с ума. Я прав?
Если, положим, тактовый висит в воздухе и ловит "Радио Маяк", то МК считает, что ему на вход идет очень важная информация, которую нужно в буфер засунуть. Буфер же забить - дело секундное.
у отключаемого устройства питание может и не пропадать.
печально
Разве такой метод называется "горячее подключение"?
Именно. Почитайте про HotPlug. Далеко не все интерфейсы поддерживают такой режим.