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. Далеко не все интерфейсы поддерживают такой режим.