How to get the rp2040 spi to work ?

Hi,

I've been trying to get the rp2040 spi to work on the type c board.

I'm using this board:

I'm trying to run my ST7796 tft spi display. It worked with my STM32 black pill and ESP32 boards. So the code is fine.

I'm using TFT_eSPI library.

But trying to run the code on the rp2040 isn't working, I also tried my logic analyzer to check for spi signal on the multiplexed spi0 sck pins but there isn't any.

Any suggestions ?

On rp2040 core SPI pins can be multiplexed to different pins rather than on picture.
You have to consult the documentation
of used rp2040 core for default spi0 pin numbers.

1 Like

here is an example of a RP2040 with two SPI devices - LoRa RFM95 module on SPI0 and MFRC522 RFID reader on SPI1

// Raspberry Pi pico RP2040 with LoRa RFM95 on SPI0 and MFRC522 RFID reader on SPI1

#include <SPI.h>
#include <LoRa.h>

// RP2040 RFM95 connections
// RP2040 SPIO0 SCK pin GPIO18  to RFM95 SCK
// RP2040 SPI0 Rx pin GPIO16  to RFM95 MISO
// RP2040 SPI0 Tx pin GPIO19  to RFM95 MOSI
// RP2040 SPI0 CSn pin GPIO 17  to RFM95 SS
// RP2040 GP20 to RFM95 Reset
// RP2040 GP21 to RFM95 DIO0

// MFRC522 RFID
#include <MFRC522v2.h>
#include <MFRC522DriverSPI.h>
#include <MFRC522DriverPinSimple.h>
#include <MFRC522Debug.h>

// Raspberry Pi pico RP2040 MFRC522 RFID connections to SPI1
#define SCK 10
#define MISO 11
#define MOSI 12
#define CS 13

MFRC522DriverPinSimple ss_pin(13);            // Create pin driver. See typical pin layout above.
SPIClass &spiClass = SPI1;                    // Alternative SPI e.g. SPI2 or from library e.g. softwarespi.
MFRC522DriverSPI driver{ ss_pin, spiClass };  //, spiClass, spiSettings}; // Create SPI driver.
MFRC522 mfrc522{ driver };
int counter = 0;

void setup() {
  Serial.begin(115200);
  while (!Serial)
    ;

  Serial.println("Raspberry Pi pico RP2040 LoRa with MFRC522 RFID reader sender");
  // void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN);
  //LoRa.setPins(8,4,7);     // for Lora 32u4
  LoRa.setPins(17, 20, 21);  // for RP2040
  if (!LoRa.begin(866E6)) {
    Serial.println("Starting LoRa failed!");
    while (1)
      ;
  }
  SPI1.setRX(MOSI);   //  MFRC522 RFID connections to SPI1
  SPI1.setCS(CS);
  SPI1.setSCK(10);
  SPI1.setTX(MISO);
  SPI1.begin(true);
  mfrc522.PCD_Init();                                      // Init MFRC522 board.
  MFRC522Debug::PCD_DumpVersionToSerial(mfrc522, Serial);  // Show details of PCD - MFRC522 Card Reader details.
  Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  // MFRC522Debug::PCD_DumpVersionToSerial(mfrc522, Serial);
  // MFRC522Debug::PICC_DumpToSerial(mfrc522, Serial, &(mfrc522.uid));
  // Show some details of the PICC (that is: the tag/card).
  Serial.print("Sending packet Card UID:");
  MFRC522Debug::PrintUID(Serial, mfrc522.uid);
  Serial.print(F("  PICC type: "));
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(MFRC522Debug::PICC_GetTypeName(piccType));
  // create string to transmit to receiver over LoRa
  String s = " Card UID:";
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    char text[10] = { 0 };
    snprintf(text, 100, " 0x%2X", mfrc522.uid.uidByte[i]);
    s += String(text);
  }
  s += "  PICC type: " + String((const char *)MFRC522Debug::PICC_GetTypeName(piccType));
  mfrc522.PICC_HaltA();       // Halt PICC.
  mfrc522.PCD_StopCrypto1();  // Stop encryption on PCD.
  LoRa.beginPacket();         // LoRa send packet
  LoRa.print(s.c_str());
  LoRa.endPacket();
  delay(500);
}

RP20040 serial monitor

Raspberry Pi pico RP2040 LoRa with MFRC522 RFID reader sender
Firmware Version: 0x92 = v2.0
Scan PICC to see UID, SAK, type, and data blocks...
Sending packet Card UID: XX FF FD C2  PICC type: MIFARE 1KB
Sending packet Card UID: XX FF FD C2  PICC type: MIFARE 1KB
Sending packet Card UID: ZZ FF 62 1A  PICC type: MIFARE 1KB
Sending packet Card UID: ZZ FF 62 1A  PICC type: MIFARE 1KB
Sending packet Card UID: XX FF FD C2  PICC type: MIFARE 1KB

ESP32 receiver displays

Received packet ' Card UID: 0xXX 0xFF 0xFD 0xC2  PICC type: MIFARE 1KB' with RSSI -98
Received packet ' Card UID: 0xXX 0xFF 0xFD 0xC2  PICC type: MIFARE 1KB' with RSSI -98
Received packet ' Card UID: 0xZZ 0xFF 0x62 0x1A  PICC type: MIFARE 1KB' with RSSI -99
Received packet ' Card UID: 0xZZ 0xFF 0x62 0x1A  PICC type: MIFARE 1KB' with RSSI -98
Received packet ' Card UID: 0xXX 0xFF 0xFD 0xC2  PICC type: MIFARE 1KB' with RSSI -99

1 Like

These are the pin settings I have in Setup36_RPi_touch_ST7796.h for the tft_espi library.

I've used 2 sets of pin arrangements, I don't know which one is correct. Even using my logic analyzer, I checked all the sck pins on the board but didn't get any signal.

// See SetupX_Template.h for all options available
#define USER_SETUP_ID 36

#define RPI_DISPLAY_TYPE
#define ST7796_DRIVER

#if 0
// For the Pico use these #define lines
#define TFT_MISO  0
#define TFT_MOSI  3
#define TFT_SCLK  2
#define TFT_CS   20  // Chip select control pin
#define TFT_DC   18  // Data Command control pin
#define TFT_RST  19  // Reset pin (could connect to Arduino RESET pin)

#define TOUCH_CS 21     // Chip select pin (T_CS) of touch screen

#else

#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS   15  // Chip select control pin
#define TFT_DC    2  // Data Command control pin
#define TFT_RST   4  // Reset pin (could connect to RST pin)

#define TOUCH_CS 22     // Chip select pin (T_CS) of touch screen

#endif

#define LOAD_GLCD   // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6  // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7  // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF  // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts

#define SMOOTH_FONT


#define SPI_FREQUENCY  40000000
//#define SPI_FREQUENCY  70000000

#define SPI_TOUCH_FREQUENCY  2500000

looking at the PRI pico pinout (post 1) these look correct for SPI0 - I used SPI0 to connect the LoRa RFM95 in post 2 with the exception I used GP17 as CS (chip select)

are you attempting to test just the TFL device - nothing else connected to the RP2040?

if you do a web search for ST7796 tft you will get plenty of links - may give you some ideas

1 Like

What is RP2040 board package you use?

If you are using the Earle Philhower package you may see that SPI pins defined like this:

// SPI
#define PIN_SPI0_MISO  (16u)
#define PIN_SPI0_MOSI  (19u)
#define PIN_SPI0_SCK   (18u)
#define PIN_SPI0_SS    (17u)

#define PIN_SPI1_MISO  (12u)
#define PIN_SPI1_MOSI  (15u)
#define PIN_SPI1_SCK   (14u)
#define PIN_SPI1_SS    (13u)
1 Like

For now, yes. I'm working only on the TFT display. Later I would connect an I2C module.

My code is working perfectly on my STM32 boards. So I'm sure about the code.

I have other SPI modules but my work for now is on the TFT module.

I used these pin assignment:

#define TFT_MISO 16
#define TFT_MOSI 19
#define TFT_SCLK 18
#define TFT_CS   17  // Chip select control pin
#define TFT_DC   20  // Data Command control pin
#define TFT_RST  21  // Reset pin (could connect to RST pin)

#define TOUCH_CS 22     // Chip select pin (T_CS) of touch screen

This is pin toggle demo on pulseview, to be sure that the board is working:

OK it worked !

Thank you guys :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.