[SOLVED] STM32F103C8T6 bluepill clone - RFM69HW SPI port 1 and ILI9341 SPI port 2 not working together



  • Hi, I am using STM32F103C8T6 board with Arduino IDE 1.8.9 , library MySensors-2.3.1 and newest Arduino_STM32-master ILI9341_STM , bootloader generic_boot20_pc13.bin. I have a problem with using together RFM69HW on SPI-1 and TFT 2.2" ILI9341 display on SPI-2. TFT is working fine but RFM69HW radio stopped working after tft.begin(). Radio is working without problem on SPI1 when TFT on SPI2 is not initialized. Do you have any idea where should be a problem ?

    HW connection

    // RFM69HW radio on SPI-1 
    //
    // CS / NSS   - PA4
    // DI00 / IRQ - PA3
    // SCK        - PA5
    // MISO       - PA6
    // MOSI       - PA7
    
    // connection TFT DISPLAY ili9341 on SPI-2
    //
    // CS         - PB12
    // RESET /RST - PA8
    // DC / RS    - PA9
    // SCK        - PB13
    // MISO       - PB14
    // MOSI       - PB15
    

    RFM69HW - SPI 1 (without ili9341 TFT init tft.begin())

    24032 TSM:INIT
    24034 TSM:INIT:TSP OK
    24034 TSM:INIT:STATID=13
    24034 TSF:SID:OK,ID=13
    24034 TSM:FPAR
    24034 SGN:SGN:NREQ=255
    

    RFM69HW - SPI 1
    ILI9341 - SPI 2

    26029 TSM:FAIL:RE-INIT
    26029 TSM:INIT
    26030 !TSM:INIT:TSP FAIL
    26030 TSM:FAIL:CNT=2
    26030 TSM:FAIL:DIS
    26030 TSF:TDI:TSL
    

    Test code

    #define MY_DEBUG_VERBOSE_SIGNING
    #define MY_DEBUG
    #define MY_TRANSPORT_WAIT_READY_MS 3000
    
    #define MY_RADIO_RFM69
    #define MY_RFM69_FREQUENCY RFM69_868MHZ
    #define MY_IS_RFM69HW 
    #define MY_RFM69_NETWORKID 100  
    #define MY_NODE_ID 13
    #define RFM69_IRQ_PIN PA3  
    #define MY_RFM69_IRQ_NUM 3 
    #define MY_RFM69_SPI_CS PA4
    //#define MY_RFM69_TX_POWER_DBM 19
    #define MY_RFM69_NEW_DRIVER
    #define MY_RFM69_ENABLE_ENCRYPTION
    #define MY_SIGNING_SOFT
    #define MY_SIGNING_REQUEST_SIGNATURES
    
    #include <MySensors.h>
    
                                       
    #define CHILD_ID_RSSI_HIGH  7                // RSSI received signal level
    #define CHILD_ID_RSSI_LOW   8                // RSSI background noise level
    
    MyMessage msgRSSI1(CHILD_ID_RSSI_HIGH, V_LEVEL);
    MyMessage msgRSSI2(CHILD_ID_RSSI_LOW, V_LEVEL);
    uint8_t Send_rssi = 0;
    uint8_t Rec_rssi = 0; 
    
    void presentation() {  sendSketchInfo("Test node", "Ver. 1");present(CHILD_ID_RSSI_HIGH, S_SOUND); present(CHILD_ID_RSSI_LOW, S_SOUND); }
    
    ////////////////// TFT display ili9341 320x240 /////////////////////////////////////////////////////////////////////
    
    #include "SPI.h"
    #include "Adafruit_GFX_AS.h"
    #include "Adafruit_ILI9341_STM.h"
    //////////// SPI2
    
    #define TFT_DC PA9
    #define TFT_CS PB12
    #define TFT_RST PA8
    SPIClass  SPI_2(2);
    //#define SPI_PORT 2 //Use SPI2
    
    Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST); // Use hardware SPI
     
    #define TFT_CIERNA 0x0000
    #define TFT_BIELA 0xFFFF
    #define TFT_ORANZOVA 0xFCA0
    
    unsigned long ResendMessageMillis;
    
    
    void setup() {
     Serial.begin(115200);
    //SPI.setModule(SPI_PORT);
    
    tft.begin(SPI_2);
    //tft.begin();
    tft.setRotation(1); tft.fillScreen(ILI9341_BLACK); 
    tft.setTextSize(1); 
    tft.setCursor(100, 70); 
    tft.setTextColor(TFT_ORANZOVA, ILI9341_BLACK);
    tft.print("test");
    
      
    ResendMessageMillis = millis();
    }
    
    void loop() {
    
          if ((millis() - ResendMessageMillis) > 10000) {
    
               Send_rssi = RFM69_getSendingRSSI();   
               wait(500);  
               Rec_rssi = RFM69_getReceivingRSSI();  
               wait(500);    
    
               Serial.print("Send RSSI: ");
               Serial.println(String((int)(Send_rssi)));
    
               Serial.print("Receive RSSI: ");
               Serial.println(String((int)(Rec_rssi)));
    
               ResendMessageMillis = millis();
           }
    
    }
    


  • I will answer to myself. Problem were in wrong definition of IRQ pin in sketch. But, as I found out STM32F103C8T6 has SPI 1 running on 72MHz (for SPI max 72/2 = 36MHz) and SPI 2 36MHz (for SPI max 36/2 = 18MHz) so it were a stupid idea to wire TFT display to SPI 2 port which is slower than SPI 1 with RFM69HW which doesnt need so fast SPI. Therefore I switched radio to SPI-2 and TFT display to faster SPI-1.

    Radio SPI-2 and TFT ILI9341 SPI-1 wiring

    // RFM69HW radio on SPI-2 
    //
    // CS / NSS   - PB12
    // DI00 / IRQ - PA8
    // SCK        - PB13
    // MISO       - PB14
    // MOSI       - PB15
    
    // TFT DISPLAY ili9341 on SPI-1
    //
    // CS         - PA4
    // RESET /RST - PA2
    // DC / RS    - PA3
    // SCK        - PA5
    // MISO       - PA6
    // MOSI       - PA7
    

    Add to sketch before #include <MySensors.h>

    #define MY_RFM69_NEW_DRIVER
    #define MY_RFM69_IRQ_PIN PA8
    #define MY_RFM69_IRQ_NUM PA8
    #define MY_RFM69_CS_PIN PB12
    #define MY_RFM69_STM32F103_SPI2
    //#define MY_RFM69_SPI_SPEED (18*1000000ul) //When SPI-2 speed needs to be reduced
    
    //Possible speeds on SPI 2 for RFM69HW:
    //
    //SPI_CLOCK_DIV2 = 36 / 2 = 18 MHz
    //SPI_CLOCK_DIV4 = 36 / 4 = 9 MHz
    //SPI_CLOCK_DIV8 = 36 / 8 = 4.5 MHz
    //SPI_CLOCK_DIV16 = 36 / 16 = 2.25 MHz
    //SPI_CLOCK_DIV32 = 36 / 32 = 1.125 MHz
    

    As you can see there is a new defined parameter MY_RFM69_STM32F103_SPI2 so if we want to use SPI 2 then modification of RFM69_new.h is needed.

    Edit file: MySensors-master/hal/transport/RFM69/driver/new/RFM69_new.h

    Add following lines after line 112 (after #include <SPI.h>)

    #if defined(MY_RFM69_STM32F103_SPI2)
    SPIClass SPI_2(2);
    #define RFM69_SPI SPI_2
    #endif

    Modified RFM69_new.h should looks like:

    #if defined(ARDUINO) && !defined(__arm__) && !defined(RFM69_SPI)
    #include <SPI.h>
    #if defined(MY_SOFTSPI)
    SoftSPI<MY_SOFT_SPI_MISO_PIN, MY_SOFT_SPI_MOSI_PIN, MY_SOFT_SPI_SCK_PIN, RFM69_SPI_DATA_MODE>RFM69_SPI;
    #else
    #define RFM69_SPI SPI
    #endif
    #else
    #if defined(__arm__) || defined(__linux__)
    #include <SPI.h>
    #if defined(MY_RFM69_STM32F103_SPI2)  //!<  ADD THIS AFTER LINE 112
    SPIClass  SPI_2(2);                   //!<  ADD THIS AFTER LINE 112
    #define RFM69_SPI SPI_2               //!<  ADD THIS AFTER LINE 112
    #endif                                //!<  ADD THIS AFTER LINE 112
    #else
    extern HardwareSPI SPI;		//!< SPI
    #endif
    #if !defined(RFM69_SPI)
    #define RFM69_SPI SPI		//!< SPI
    #endif
    #endif
    

 

181
Online

8.7k
Users

9.5k
Topics

99.9k
Posts