Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 57

Переключение между устройствами подключенными по SPI

07.09.2021, 14:31. Показов 1411. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый день! Помогите разобраться с SPI.
Решил попробовать использовать RFID-RC522 и дисплей от Nokia 5110 в связке с ESP8266 (NodeMcu v3).
Схема подключения:

Распиновка:
ESP8266 RC522 PCD8544
__D1__ ________ __CE_
__D2__ __RST__ __RST
__D3__ ________ __DC_
__D4__ __SDA__ ______
__D5__ __SCK__ __CLK_
__D6__ __MISO_ ______
__D7__ __MOSI_ __DIN

Сначала подключил RFID без дисплея, проверил его работу, успешно считал данные с метки.
После подключил дисплей и попробовал вывести значение метки на него.
Предположил, что при следующем объявлении устройства в коде
C++
1
2
Adafruit_PCD8544 display = Adafruit_PCD8544 (CLK,DIN,DC,CE,RST);
MFRC522 mfrc522(SS_PIN, RST_PIN);
а именно программном указании пинов Chip/Slave Select, а не просто физическому подключению к ним, esp-шка должна сама переключаться между устройствами при обращении к ним в коде, но чуда не случилось: исправно работал дисплей, но, судя по логам, rc522 в процессе не участвовал. Нашел пример в интернете, где при подключении к контроллеру нескольких устройств, переключение между ними осуществлялось вручную:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setup() {
  ...
  pinMode(CE, OUTPUT);
  pinMode(SS_PIN, OUTPUT);
  ...
}
 
void selectDevice(int id){
  if(deviceId != id){
    deviceId = id;
    Serial.println("Select device " + String(id));
    if(id == 1) digitalWrite (CE, LOW); else digitalWrite (CE, HIGH);
    if(id == 2) digitalWrite (SS_PIN, LOW); else digitalWrite (SS_PIN, HIGH);
  }
}
Но это не помогло
Подскажите пожалуйста, каким образом правильно организовать переключение между устройствами по интерфейсу SPI?

Мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <SPI.h>
#include <MFRC522.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
 
//rc522
#define SS_PIN D4
#define RST_PIN D2
 
//nokia 5110
#define CLK D5
#define DIN D7
#define DC  D3
#define CE  D1
#define RST D2
 
Adafruit_PCD8544 display = Adafruit_PCD8544 (CLK,DIN,DC,CE,RST);
MFRC522 mfrc522(SS_PIN, RST_PIN);
 
int mfrcMode = 1; // [0] - off, [1] - r, [2] - w
int displayId = 0; // 
int deviceId = 0; // [1] - display, [2] - rc522
 
void setup() {
  Serial.begin(115200);
  
  SPI.begin();
  mfrc522.PCD_Init();
 
  pinMode(CE, OUTPUT);
  pinMode(SS_PIN, OUTPUT);
 
  display.begin ();
  display.setContrast (53);                        
  display.setRotation (2);   
}
 
void selectDevice(int id){
  if(deviceId != id){
    deviceId = id;
    Serial.println("Select device " + String(id));
    if(id == 1) digitalWrite (CE, LOW); else digitalWrite (CE, HIGH);
    if(id == 2) digitalWrite (SS_PIN, LOW); else digitalWrite (SS_PIN, HIGH);
  }
}
 
void setDisplayID(int id){
  if(displayId != id){
    selectDevice(1);
    displayId = id;
    display.clearDisplay();
    switch(displayId){
      case 1:
        display.setTextSize (1);
        display.setTextColor (BLACK);
        display.setCursor (15,5);
        display.println ("RFID READ");
        display.setCursor (10,20);
        display.println ("Waiting tag!");
        break;
    }
    display.display ();
    Serial.println("DISPLAY ID " + String(displayId));
  }
}
 
void setDisplayID(int id, String str){
    if(displayId != id){
      selectDevice(1);
      displayId = id;
      display.clearDisplay();
      switch(displayId){
        case 2:
          display.setTextSize (2);
          display.setTextColor (BLACK);
          display.setCursor (24,5);
          display.println ("RFID tag found:");
          display.setTextSize (1);
          display.setCursor (7,20);
          display.println (str);
          break;
      }
      display.display ();
      Serial.println("DISPLAY ID " + String(displayId));
      Serial.println("DISPLAY STRING "+str);
   }
}
 
void loop() {
  switch(mfrcMode){
    case 1:
      selectDevice(2);
      if(mfrc522.PICC_IsNewCardPresent()){
        Serial.println("NEW CARD ");
        if(mfrc522.PICC_ReadCardSerial()){
          Serial.println("READ TRUE ");
          String str = "";
          for(byte i = 0; i < mfrc522.uid.size; i++){
            str += mfrc522.uid.uidByte[i] < 0x10 ? " 0": " ";
            str += String(mfrc522.uid.uidByte[i], HEX);
          }
          Serial.println("STR "+str);
          setDisplayID(2, str);
        }
        mfrc522.PICC_HaltA();
      }else{
        setDisplayID(1);
      }
      break;
  }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.09.2021, 14:31
Ответы с готовыми решениями:

Переключение периферии между устройствами
Нужно подключить к 2 устройствам хаб и колонку и сделать некий переключатель, либо купить Будет стоять хаб с внешними ЖД, периферией,...

Обмен данными с несколькими USB CDC устройствами, подключёнными через USB HUB с внешним питанием
Добрый день уважаемые форумчане, форумчанки, форумчата и форумчатки. Столкнулся с такой проблемой, есть несколько одинаковых устройств,...

Чат между подключенными к серверу клиентами
Здравствуйте всем. Я никогда не пользовался и не использовал Java EE. Но есть такая необходимость и желание. Я хочу написать маленькое...

1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.09.2021, 18:33
C++
1
2
3
4
5
6
7
8
9
enum class Device { display , rfid  }
 
void selectDevice(Device device)
{
     // Serial.println("Select device " + String(int(id)));
 
    digitalWrite (CS_display_pin, device==Device::display); 
    digitalWrite (CS_rfid_pin, device==Device::rfid); // Или наоборот не помню точно какой там уровень выбора.
}
Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void setup() 
{
  Serial.begin(115200);
   
  pinMode(CE, OUTPUT);
  pinMode(SS_PIN, OUTPUT);
 
  SPI.begin();
 
  selectDevice(Device::rfid); // Выбрать rfid
  mfrc522.PCD_Init();
 
 
  selectDevice(Device::display); // Нужно выбрать дисплей перед тем как что-то с ним делать    !!!
  display.begin ();
  display.setContrast (53);                        
  display.setRotation (2);   
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.09.2021, 18:33
Помогаю со студенческими работами здесь

создать сеть между пк подключёнными к netgear <wgr612 100>
Здравствуйте! поскажите пожалуйста чайнику следующее, есть настольный пк и есть ноутбук оба подключены к интернет через netgear...

Нет связи между компьютерами Vista+XP подключенными через коммутатор к инету
Оказалась непосильная задача увидеть папки в отличие, когда на обоих компах стояла XP. В Висту забыли вложить протокол IPX/SPX и поэтому...

Обмен данными между устройствами
Всем привет. Требуется совет по поводу реализации обмена данными, между несколькими устройствами. Первое устройство ПК, только у которого...

Передача данных между устройствами
Всем привет! Подскажите, пожалуйста, как передать значение переменной на другое устройство. Думал использовать wifi direct. Но как это...

Обмен данными между устройствами
Пишу программу, в которой необходимо вычислять расстояние до другого пользователя, не знаю, как можно реализовать обмен данными между...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru