stm32f103c8t6 использование 2-х SPI

vadim_kkkk
Offline
Зарегистрирован: 21.07.2019

Здравствуйте.

Суть проблемы подключил к плате два SPI устройства

SPI 1 модуль nrf24L01

SPI 2 TFT млдуль на ILI9341

суть проблемы не работает SPI 1

дисплей работает нормально, nrf24L01 не принимает данные(работает только на приём)

вот код

#include <SPI.h>
#include <SoftWire.h>
#include "Wire.h"
#include "Adafruit_GFX_AS.h"
#include "Adafruit_ILI9341_STM.h"
#include "uRTCLib.h"

#include "nRF24L01_STM32.h"
#include "RF24_STM32.h"
RF24 radio(PA4,PA1);// CE, CSN

const uint64_t pipe = 0xF0F1F2F3F4LL;

SPIClass SPI_2(2); 

SoftWire SWire(PB6, PB7, SOFT_FAST);//SCL, SDA, 
uRTCLib rtc(0x68, 0x57);


#define TFT_CS        PB12
#define TFT_DC        PB11
#define TFT_RST       PB10

Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST); // Use hardware SPI
void setup() {
 // SPI.setModule(1);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  //SPI.setClockDivider(SPI_CLOCK_DIV16);
  radio.begin();
  delay(10);
  radio.setChannel(9);
  //radio.setRetries(15,15);
  radio.setDataRate(RF24_1MBPS); 
  radio.setPALevel(RF24_PA_HIGH);
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу

  Wire.begin();
  
  tft.begin(SPI_2, 16000000);  // set direct frequency value in MHz
  tft.fillScreen(ILI9341_BLACK);

}


void loop(void) {
 // for(uint8_t rotation=0; rotation<4; rotation++) {
   tft.setRotation(1);
   
  //  testText();
    delay(1000);
    
  tft.setTextColor(ILI9341_YELLOW,ILI9341_BLACK);  tft.setTextSize(4);
  rtc.refresh();
  tft.setCursor(0, 0);
  tft.print("           ");
  tft.setCursor(0, 0);
  tft.print(rtc.hour());
  tft.print(':');
  tft.print(rtc.minute());
  tft.print(':');
  tft.println(rtc.second());

  tft.print("Temp: ");
  tft.println(rtc.temp());

  int data; 
  
  if (radio.available()){ // проверяем не пришло ли чего в буфер.
    radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
    
  tft.print("Nrf: ");
  tft.println(data);
  }

}

если в эту же плату записываю другой код только на передачу с NRF24L01 ,но без других устройств (часы,дисплей) то передача работает. Вот код

#include <SPI.h>
#include "nRF24L01_STM32.h"
#include "RF24_STM32.h"

// Set up nRF24L01 radio on SPI-1 bus (MOSI-PA7, MISO-PA6, SCLK-PA5) ... IRQ not used?
RF24 radio(PA4,PA1);// CE, CSN

const uint64_t pipe = 0xF0F1F2F3F4LL;  // Radio pipe addresses for the 2 nodes to communicate.
int data = 1;
void setup(){
   
  Serial1.begin(9600);
  delay(1000);
  Serial.println("\n\rRF24 Sensor Receiver");
  
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);

  // Setup and configure rf radio
  
  radio.begin();
  
  // optionally, increase the delay between retries & # of retries
  //radio.setRetries(15,15);
  radio.setChannel(9);
  radio.setDataRate(RF24_1MBPS); 
  radio.setPALevel(RF24_PA_HIGH);


  // Open pipes to other nodes for communication

  // This simple sketch opens two pipes for these two nodes to communicate
  // back and forth.
  // Open 'our' pipe for writing
  // Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)

  radio.openWritingPipe(pipe); // открываем трубу на передачу.
}

void loop(){
  
delay(1000);
  data++; // читаем значение
  
  radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет
  
  Serial1.print("data: ");
  Serial1.println(data);
}

Может кто сталкивался с подобной проблемой...

nik182
Offline
Зарегистрирован: 04.05.2015

А прием без других устройств? Зачем передачу показывать, если прием не работает?

vadim_kkkk
Offline
Зарегистрирован: 21.07.2019

Придётся пробовать, но тогда дисплей придётся другой цеплять......

nik182
Offline
Зарегистрирован: 04.05.2015

Зачем дисплей? Выводи в сериал по шнурку, которым шьёш.

vadim_kkkk
Offline
Зарегистрирован: 21.07.2019

попробовал простой скрипт работает

#include <SPI.h>


#include "nRF24L01_STM32.h"
#include "RF24_STM32.h"
RF24 radio(PA4,PA1);// CE, CSN

const uint64_t pipe = 0xF0F1F2F3F4LL;

//SPIClass SPI_2(2); 

int data; 

void setup() {
  Serial1.begin(9600);
  Serial1.print("Yesy nfr24l01");
  pinMode(PC13, OUTPUT);

  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  //SPI.setClockDivider(SPI_CLOCK_DIV16);
  radio.begin();
  delay(10);
  radio.setChannel(9);
 // radio.setRetries(15,15);
  radio.setDataRate(RF24_1MBPS); 
  radio.setPALevel(RF24_PA_HIGH);
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу

  
}


void loop(void) {
 
 
  
  
  if (radio.available()){ // проверяем не пришло ли чего в буфер.
    radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
    digitalWrite(PC13, LOW);
     delay(100);
   digitalWrite(PC13, HIGH);
  Serial1.println("Yesy nfr24l01");
  Serial1.print(data);
  }

}

а основной с TFT бесконечно быстро выдаёт пустые данные, тоесть вроде бы данные приходят но пусто и быстро данные должны приходить раз в секунду

#include <SPI.h>
#include <SoftWire.h>
#include "Wire.h"
#include "Adafruit_GFX_AS.h"
#include "Adafruit_ILI9341_STM.h"
#include "uRTCLib.h"

#include "nRF24L01_STM32.h"
#include "RF24_STM32.h"
RF24 radio(PA4,PA1);// CE, CSN
#define SPI1_NSS_PIN PA4

const uint64_t pipe = 0xF0F1F2F3F4LL;
int data;
SPIClass SPI_2(2);
//SPIClass SPI(1);

SoftWire SWire(PB6, PB7, SOFT_FAST);//SCL, SDA,
uRTCLib rtc(0x68, 0x57);

#define TFT_CS        PB12
#define TFT_DC        PB11
#define TFT_RST       PB10

Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST); // Use hardware SPI
void setup() {
 
 // SPI.setModule(1);
 Serial1.begin(9600);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order
  SPI.setDataMode(SPI_MODE0); //Set the  SPI_2 data mode 0
  SPI.setClockDivider(SPI_CLOCK_DIV16);      // Slow speed (72 / 16 = 4.5 MHz SPI_1 speed)
  pinMode(SPI1_NSS_PIN, OUTPUT);

  radio.begin();
  delay(10);
  radio.setChannel(9);
  //radio.setRetries(15,15);
  radio.setDataRate(RF24_1MBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу

  Wire.begin();
 
  tft.begin(SPI_2, 16000000);  // set direct frequency value in MHz
  tft.fillScreen(ILI9341_BLACK);

}

void loop(void) {
 // for(uint8_t rotation=0; rotation<4; rotation++) {
   tft.setRotation(1);
   
  //  testText();
    //delay(1000);
    
  tft.setTextColor(ILI9341_YELLOW,ILI9341_BLACK);  tft.setTextSize(4);
  rtc.refresh();
  tft.setCursor(0, 0);
  tft.print(rtc.hour());
  tft.print(':');
  tft.print(rtc.minute());
  tft.print(':');
  tft.println(rtc.second());

  tft.print("Temp: ");
  tft.println(rtc.temp());

 
 
  if(radio.available()){ // проверяем не пришло ли чего в буфер.
    radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
    Serial1.print("Yesy nfr24l01-");
  Serial1.println(data);
  tft.print("Nrf: ");
  tft.println(data);
  }

}

 

nik182
Offline
Зарегистрирован: 04.05.2015

А в сериал что выходит из последней программы? Вроде одно и тоже должно быть на экране и в сериале. К тому же экран очень быстро перерисовывается. Зачем в лупе каждый раз инициализировать экран? Экран у Вас перерисовывается много раз в секунду. Повесте перерисовку экрана раз в секунду с помощью блинк без делэя.

vadim_kkkk
Offline
Зарегистрирован: 21.07.2019

В сериал постоянно очень быстро лелит Yesy nfr24l01-

то есть срабатывает команда

 

Serial1.print("Yesy nfr24l01-");

 

экспериментальным путём убрав всё что связано с SPI2 и построчно добавляя,

понял что проблемы вознмкаю после добавления

 

tft.begin(SPI_2, 16000); 

наверное какой то конфликт с SPI1 возникает

по поводу прорисовки дисплея пока не заморачивался потому что главное с SPI разобраться.

Спасибо за советы.

nik182
Offline
Зарегистрирован: 04.05.2015

Это не конфликт spi. Это конфликт библиотеки и назначения spi. Плохо написанная библиотека не понимает что ей инстанс поменяли. Нужно лезть в библиотеку и руками править назначение spi. При прямом програмировании всё бы работало без проблем. Как помочь не знаю. Смотрите в библиотеке место где идет инициализация. Должна быть команда привязки к конкретному spi. Для себя раз можно поменять. Может быть поможет это https://www.stm32duino.com/viewtopic.php?t=278

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Как вариант можно попробывать не создавать доп. класс, а менять каждый раз SPI, к которому идёт обращение, SPI.setModule();

vadim_kkkk
Offline
Зарегистрирован: 21.07.2019

нашёл вроде что то полезное , https://www.stm32duino.com/viewtopic.php?t=3813

но в англитйском не очень, попробовал библиотеку с изменениями дисплей не заработал

вообще,

зарегистрировался на

Arduino for STM32 но почемуто нет ссылок не на открытие тем не на посты, думаю там бы помогли грустно.

nik182
Offline
Зарегистрирован: 04.05.2015

В теме что Вы нашли всё написано. Надо модифицировать либу, хотя на это и ругаются, что не правильно либу править, но другого решения не предложили. Как вариант самому написать кусок вывода точки и подсунуть его либе.

vadim_kkkk
Offline
Зарегистрирован: 21.07.2019

Кому интересно проблему решил, заменил файлы библиотеки на файлы из этой темы https://www.stm32duino.com/viewtopic.php?t=3813

вот рабочая версия скрипта

#include <SPI.h>
#include <SoftWire.h>
#include "Wire.h"
#include "Adafruit_GFX_AS.h"
#include "Adafruit_ILI9341_STM.h"
#include "uRTCLib.h"

#include "nRF24L01_STM32.h"
#include "RF24_STM32.h"
RF24 radio(PA4,PA1);// CE, CSN
//#define SPI1_NSS_PIN PA4 

const uint64_t pipe = 0xF0F1F2F3F4LL;
int data; 
SPIClass SPI_2(2); 

SoftWire SWire(PB6, PB7, SOFT_FAST);//SCL, SDA, 
uRTCLib rtc(0x68, 0x57);


#define TFT_CS        PB12
#define TFT_DC        PB11
#define TFT_RST       PB10

Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST,SPI_2); // Use hardware SPI
void setup() {
  
  //SPI.setModule(2);
 Serial1.begin(9600);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order
  SPI.setDataMode(SPI_MODE0); //Set the  SPI_2 data mode 0
  SPI.setClockDivider(SPI_CLOCK_DIV16);      // Slow speed (72 / 16 = 4.5 MHz SPI_1 speed)
   //pinMode(SPI1_NSS_PIN, OUTPUT);

SPI_2.begin(); //Initialize the SPI_2 port.
  SPI_2.setBitOrder(MSBFIRST); // Set the SPI_2 bit order
  SPI_2.setDataMode(SPI_MODE0); //Set the  SPI_2 data mode 0
  SPI_2.setClockDivider(SPI_CLOCK_DIV16);

  radio.begin();
  delay(10);
  radio.setChannel(9);
  //radio.setRetries(15,15);
  radio.setDataRate(RF24_1MBPS); 
  radio.setPALevel(RF24_PA_HIGH);
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу

  Wire.begin();
  
  tft.begin(16000000);  // set direct frequency value in MHz
  tft.fillScreen(ILI9341_BLACK);

}


void loop(void) {
 
   tft.setRotation(1);
   
  
  tft.setTextColor(ILI9341_YELLOW,ILI9341_BLACK);  tft.setTextSize(4);
  rtc.refresh();
  tft.setCursor(0, 0);
  tft.print(rtc.hour());
  tft.print(':');
  tft.print(rtc.minute());
  tft.print(':');
  tft.println(rtc.second());

  tft.print("Temp: ");
  tft.println(rtc.temp());

  
  
  if(radio.available()){ // проверяем не пришло ли чего в буфер.
    radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
    Serial1.print("Yesy nfr24l01-");
  Serial1.println(data);
  tft.print("Nrf: ");
  tft.println(data);
  }

}