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.

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

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

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)

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: