• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
SPI sterowanie pinem SS
#1
Witam,
mam problem z magistralą SPI na Wemos D1 mini. Na chwilę obecną podłączyłem LCD. Docelowo ma być jeszcze podłączona LoRa SX1278 również po SPI. Jeśli dobrze rozumiem sterowanie urządzeniami realizujemy zmieniając stan na pinach SS. Aby urządzenie komunikowało się z Master-em, należy ustawić stan LOW na pinie SS. I tutaj pojawia się problem. Napisałem kilka linijek prostego kodu, gdzie podłączony jest tylko LCD i niezależnie czy na pinie  jest LOW czy HIGH, na wyświetlaczu pojawia się napis. Teoretycznie jeśli na pinie jest HIGH to komunikacja nie powinna się odbywać. Nie mogę namierzyć błędu.
Poniżej kod


Kod:
#include <SPI.h>
#include <U8g2lib.h>

#define ss_lcd 15 //LCD
#define sclk 14 // LCD
#define mosi 13 // LCD

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, sclk, mosi ,ss_lcd, U8X8_PIN_NONE);

void setup() {
  digitalWrite(ss_lcd, LOW);  // włączenie urządzanie na pinie ss_lcd
  u8g2.begin ();
  u8g2.clearBuffer();
  u8g2.setFont (u8g2_font_ncenB14_tr);   
  u8g2.setCursor (15,30);
  u8g2.print("TEST");
  delay(3000);
  digitalWrite(ss_lcd, HIGH); // wyłączenie urządzenia na pinie ss_lcd
}

void loop()  {
digitalWrite(ss_lcd, HIGH); // wyłączenie urządzenia na pinie ss_lcd
u8g2.clearBuffer();
u8g2.setFont (u8g2_font_ncenB14_tr); // font     
u8g2.setCursor(1,16);
u8g2.print("TEST");
u8g2.sendBuffer ();

}
 
Odpowiedź
#2
W loop() ss jest na LOW, a piszesz że jest HIGH.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
(02-05-2021, 23:20)Robson Kerman napisał(a): W loop() ss jest na LOW, a piszesz że jest HIGH.

Mój błąd. Wkleiłem nie to co trzeba do postu. Poprawiłem. 

Zmiana stanu pinu na HIGH, czyli wyłączenie komunikacji z LCD nic nie daje. Komunikacja nadal się odbywa.
 
Odpowiedź
#4
Bo ty swoje a biblioteka swoje....
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
(03-05-2021, 18:10)Jarewa0606 napisał(a): Bo ty swoje a biblioteka swoje....

Tyle to już się domyśliłem. Szukam rozwiązania jak sterować pinem "nad" biblioteką. Głowię się nad tym jakiś czas.  Undecided
 
Odpowiedź
#6
Musisz ustawić pinMode dla SS jako wyjście, bo domyślne ustawienia zawsze są jako wejścia, więc digitalWrite nie zadziała.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#7
Dodanie w setup pinMode(ss_lcd, OUTPUT); niewiele zmienia. 
Już tak próbowałem kilkukrotnie i nie było efektu. Chyba, że źle konfiguruje pin w setupie. 

Kod:
#include <SPI.h>
#include <U8g2lib.h>

#define ss_lcd 15 //LCD
#define sclk 14 // LCD
#define mosi 13 // LCD

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, sclk, mosi ,ss_lcd, U8X8_PIN_NONE);

void setup() {
  pinMode(ss_lcd, OUTPUT);
  digitalWrite(ss_lcd, LOW);  // włączenie urządzanie na pinie ss_lcd
  u8g2.begin ();
  u8g2.clearBuffer();
  u8g2.setFont (u8g2_font_ncenB14_tr);   
  u8g2.setCursor (15,30);
  u8g2.print("TEST");
  delay(3000);
  digitalWrite(ss_lcd, HIGH); // wyłączenie urządzenia na pinie ss_lcd
}

void loop()  {
digitalWrite(ss_lcd, HIGH); // wyłączenie urządzenia na pinie ss_lcd
u8g2.clearBuffer();
u8g2.setFont (u8g2_font_ncenB14_tr); // font     
u8g2.setCursor(1,16);
u8g2.print("TEST");
u8g2.sendBuffer ();

}
 
Odpowiedź
#8
Nie potrzebnie z tym kombinujesz, bo to działa tylko ci się wydaje że nie działa. Biblioteka sama przestawia pin jak ma dochodzić do komunikacji. Po prostu masz taki program że tego nie zobaczysz bo robi tylko jedno, musiał byś go rozbudować o dwie funkcje by zobaczyć. Np podłączając drugi wyświetlacz lub inne urządzenie pod SPI. Nie musisz nawet machać tymi pianami..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#9
Podłączyłem moduł LoRa. Oczywiście jako drugie urządzenie. Magistrala SPI jest wspólna dla LCD i LoRa. Różny jest natomiast pin SS. Odbieram dane z modułu LoRa, jednak ekran zatrzymuje się na napisie TEST 1. Loop dla ekranu LCD się nie wykonuje. Na ekranie mam tylko napis TEST 1 oraz migające poziomo  pojedyncze piksele.
Kod:
#include <SPI.h>
#include <LoRa.h>
#include <U8g2lib.h>


String temperatura;
String cisnienie;
String wilgotnosc;
String bateria;

#define ss_lcd 15 //LCD
#define sclk 14 // LCD
#define mosi 13 // LCD

#define ss 2  // LoRa
#define rst 12 //LoRa

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, sclk, mosi ,ss_lcd, U8X8_PIN_NONE);
 
void setup() {
  u8g2.begin ();
  digitalWrite(ss_lcd, HIGH);
  u8g2.clearBuffer();
  u8g2.setFont (u8g2_font_ncenB14_tr);  
  u8g2.setCursor (15,30);
  u8g2.print("TEST 1 ");
  u8g2.sendBuffer ();
  delay(3000);

  //początek konfiguracji LoRa
 
  Serial.begin(9600);
  Serial.println("LoRa odbiornik");
  LoRa.setPins(ss,rst);
  if (!LoRa.begin(433E6))
  {
   Serial.println("Starting LoRa failed!");
   delay(100);
    while (1);
  }
   Serial.println("LoRa Started");
 
}

void loop()  {


int pos1, pos2, pos3;
int packetSize = LoRa.parsePacket();
if (packetSize)
{

  String LoRaData = LoRa.readString();
  while (LoRa.available())
{
    ((char)LoRa.read());
  }
  pos1 = LoRaData.indexOf('/');
  pos2 = LoRaData.indexOf('&');
  pos3 = LoRaData.indexOf('!');

  temperatura = LoRaData.substring(0,pos1);
  cisnienie = LoRaData.substring(pos1 + 1, pos2);
  wilgotnosc = LoRaData.substring(pos2 +1, pos3);
  bateria = LoRaData.substring(pos3 +1, LoRaData.length());

  Serial.println(temperatura);
  Serial.println(cisnienie);
  Serial.println(wilgotnosc);
  Serial.println(bateria);
}
u8g2.clearBuffer();
u8g2.setFont (u8g2_font_ncenB14_tr);   
u8g2.setCursor(2,16);
u8g2.print("EKRAN W LOOP");
u8g2.sendBuffer ();
}
 
Odpowiedź
#10
Kod:
#include <SPI.h>
#include <LoRa.h>
#include <U8g2lib.h>


String temperatura;
String cisnienie;
String wilgotnosc;
String bateria;

bool flaga = false;

#define ss_lcd 2 //LCD
#define sclk 14 // LCD
#define mosi 13 // LCD

#define ss 15  // LoRa
#define rst 12 //LoRa

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R2, sclk, mosi ,ss_lcd, U8X8_PIN_NONE);

void LCD (){
// program wykonawczy dla lcd

flaga = false;

u8g2.begin ();
u8g2.clearBuffer();
u8g2.setFont (u8g2_font_ncenB10_tr);
u8g2.setCursor(2,16);
u8g2.print("EKRAN W LOOP");
u8g2.sendBuffer ();
}

void Lora(){
//program wykonawczy dla komunikacji
int pos1, pos2, pos3;
LoRa.begin(433E6);
int packetSize = LoRa.parsePacket();

if (packetSize)
{

flaga =true;

String LoRaData = LoRa.readString();
while (LoRa.available())
{
((char)LoRa.read());
}
pos1 = LoRaData.indexOf('/');
pos2 = LoRaData.indexOf('&');
pos3 = LoRaData.indexOf('!');

temperatura = LoRaData.substring(0,pos1);
cisnienie = LoRaData.substring(pos1 + 1, pos2);
wilgotnosc = LoRaData.substring(pos2 +1, pos3);
bateria = LoRaData.substring(pos3 +1, LoRaData.length());


Serial.println(temperatura);
Serial.println(cisnienie);
Serial.println(wilgotnosc);
Serial.println(bateria);


Serial.println(flaga);
}
}

void setup(){
  Serial.begin(9600);
  }

void loop(){

if (flaga)
  {
  LCD();
  }
else
  {
  Lora();
  }
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości