Официальный сайт компании Arduino по адресу arduino.cc
stm32f103c8t6 использование 2-х SPI
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 21/07/2019 - 05:25
Здравствуйте.
Суть проблемы подключил к плате два 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); }
Может кто сталкивался с подобной проблемой...
А прием без других устройств? Зачем передачу показывать, если прием не работает?
Придётся пробовать, но тогда дисплей придётся другой цеплять......
Зачем дисплей? Выводи в сериал по шнурку, которым шьёш.
попробовал простой скрипт работает
а основной с TFT бесконечно быстро выдаёт пустые данные, тоесть вроде бы данные приходят но пусто и быстро данные должны приходить раз в секунду
А в сериал что выходит из последней программы? Вроде одно и тоже должно быть на экране и в сериале. К тому же экран очень быстро перерисовывается. Зачем в лупе каждый раз инициализировать экран? Экран у Вас перерисовывается много раз в секунду. Повесте перерисовку экрана раз в секунду с помощью блинк без делэя.
В сериал постоянно очень быстро лелит
Yesy nfr24l01-
то есть срабатывает команда
экспериментальным путём убрав всё что связано с SPI2 и построчно добавляя,
понял что проблемы вознмкаю после добавления
наверное какой то конфликт с SPI1 возникает
по поводу прорисовки дисплея пока не заморачивался потому что главное с SPI разобраться.
Спасибо за советы.
Это не конфликт spi. Это конфликт библиотеки и назначения spi. Плохо написанная библиотека не понимает что ей инстанс поменяли. Нужно лезть в библиотеку и руками править назначение spi. При прямом програмировании всё бы работало без проблем. Как помочь не знаю. Смотрите в библиотеке место где идет инициализация. Должна быть команда привязки к конкретному spi. Для себя раз можно поменять. Может быть поможет это https://www.stm32duino.com/viewtopic.php?t=278
Как вариант можно попробывать не создавать доп. класс, а менять каждый раз SPI, к которому идёт обращение, SPI.setModule();
нашёл вроде что то полезное , https://www.stm32duino.com/viewtopic.php?t=3813
но в англитйском не очень, попробовал библиотеку с изменениями дисплей не заработал
вообще,
зарегистрировался на
Arduino for STM32 но почемуто нет ссылок не на открытие тем не на посты, думаю там бы помогли грустно.
В теме что Вы нашли всё написано. Надо модифицировать либу, хотя на это и ругаются, что не правильно либу править, но другого решения не предложили. Как вариант самому написать кусок вывода точки и подсунуть его либе.
Кому интересно проблему решил, заменил файлы библиотеки на файлы из этой темы https://www.stm32duino.com/viewtopic.php?t=3813
вот рабочая версия скрипта