SPI. прошу подсказать.

sasken
Offline
Зарегистрирован: 28.10.2015

есть мастер, где использую 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. пример тут на форуме про двусторонний обмен смотрел. часть от туда даже использовал. все равно не фурычит.

sasken
Offline
Зарегистрирован: 28.10.2015

хммм. если в слейве постоянно обнулять регистр управления SPI и снова ставить его в слейв, а потом читать что пришло, тогда все работает нормально.
 

  SPCR = B00000000;         
  SPCR = (1 << SPE);  

вангую, что три пина SPI (кроме ss ибо он всегда на земле) надо было подтягивать через 100К к земле. в момент, когда я вытаскиваю эти три провода, происходит какая-то дикая шляпа и контроллер сходит с ума. Я прав?

UPD: хммм. нет. это не решило проблему.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Возможно надо "передёрнуть"  CS что-бы возобновить общение

sasken
Offline
Зарегистрирован: 28.10.2015

Дим-мычъ пишет:

Возможно надо "передёрнуть"  CS что-бы возобновить общение

а какое отношение CS имеет к SPI ? не понял. или все-таки SS? так он у меня на землю посажен полностью.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

sasken пишет:

а какое отношение CS имеет к SPI ? не понял. или все-таки SS? так он у меня на землю посажен полностью.

На слэйве может называться CS

sasken
Offline
Зарегистрирован: 28.10.2015

Дим-мычъ пишет:
На слэйве может называться CS

нет возможности передернуть. он посажен на землю.

rkit
Offline
Зарегистрирован: 23.11.2016

sasken пишет:

стоит убрать провода mosi, miso и sck

Ты дурак? Ты зачем провода из работающего прибора убираешь?

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

rkit пишет:

Ты дурак? Ты зачем провода из работающего прибора убираешь?

А может он разрабатывает "горячее" подключение SPI?)))

mixail844
Offline
Зарегистрирован: 30.04.2012

то есть питание на слейве остаеться когда линии spi отключены ?

а что по вашему слейв должен ответить если примит пробел т.е. ´ ´ ?

sasken
Offline
Зарегистрирован: 28.10.2015

rkit пишет:
Ты дурак? Ты зачем провода из работающего прибора убираешь?

Ты идиот? у отключаемого устройства питание может и не пропадать.

Дим-мычъ пишет:
А может он разрабатывает "горячее" подключение SPI?)))

Разве такой метод называется "горячее подключение"?

mixail844 пишет:
то есть питание на слейве остаётся когда линии spi отключены ?

Всё верно. У него своё есть питание. когда отключаю провода от него, то слейв продолжает работать и выполнять свои функции, когда подключаю заново, земли объединяются, но связи уже нет.

mixail844 пишет:
а что по вашему слейв должен ответить если примет пробел т.е. ´ ´ ?

кому должен? у меня такой ответ слейва на ' ' не прописан. так что в принципе отвечать слейв на ' ' не должен..... или должен?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

sasken пишет:

вангую, что три пина SPI (кроме ss ибо он всегда на земле) надо было подтягивать через 100К к земле. в момент, когда я вытаскиваю эти три провода, происходит какая-то дикая шляпа и контроллер сходит с ума. Я прав?

Если, положим, тактовый висит в воздухе и ловит "Радио Маяк", то МК считает, что ему на вход идет очень важная информация, которую нужно в буфер засунуть. Буфер же забить - дело секундное.

rkit
Offline
Зарегистрирован: 23.11.2016

sasken пишет:

у отключаемого устройства питание может и не пропадать.

печально

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

sasken пишет:

Разве такой метод называется "горячее подключение"?

Именно. Почитайте про HotPlug. Далеко не все интерфейсы поддерживают такой режим.