Hi everyone !
I am trying to connect a round 1.28" LCD device (from Waveshare) to the brand new Arduino Nicla Vision (based on an STM32H7). I also want to add a MCP2515 (CAN) on the SPI (but it's for later)
I try several solutions :
- The "stock" solution from Arduino_GFX wasn't working with the nicla vision (no problem with an arduino nano to test the LCD).
- I got an example working with the nicla using micropython, but it's very slow and openMV is more limited with libraries than ArduinoIDE.
- So I try to modify the C code by Waveshare. I placed serial's flags to identify the problem.
I would like to keep the SPI.beginTransaction(...) function to modify the SPI parameters between the MCP2515 and the LCD.
- If I use the SPI.beginTransaction(...) function : I got an infinite loop in the SPI.beginTransaction(...) function.
- If I use the SPI.begin() function : I got an infinite loop in the SPI.transfer(...) function.
I post a zip with the 7 files used in the project.
This is a core extract of the LCD initialisation function.
Is someone has more knowledge than me on this type of device, thank you for your help
. To understand why the program seems crash without any explanation !!!? ![]()
The hardware setup seems correct because it work on micropython. So it seems a SPI software problem.
LCD_1inch28_2.zip (22,9 Ko)
#include "LCD_Driver.h"
#include <SPI.h>
SPISettings LCD_SPI_settings(1000000, MSBFIRST, SPI_MODE3);
#define LCD_SPI_WRITE SPI.transfer
#define LCD_SPI_BEGIN() SPI.beginTransaction(LCD_SPI_settings) //SPI.beginTransaction(LCD_SPI_settings(10000000, MSBFIRST, SPI_MODE3))
#define LCD_SPI_END() SPI.endTransaction()
#define LCD_SELECT() digitalWrite(LCD_CS_PIN, LOW)
#define LCD_UNSELECT() digitalWrite(LCD_CS_PIN, HIGH)
#define LCD_COMMAND() digitalWrite(LCD_CS_PIN, LOW)
#define LCD_UNCOMMAND() digitalWrite(LCD_DC_PIN, HIGH)
#define LCD_RST_ON() digitalWrite(LCD_RST_PIN, LOW)
#define LCD_RST_OFF() digitalWrite(LCD_RST_PIN, HIGH)
void LCD_WriteData_Byte(uint8_t da) {
LCD_SPI_BEGIN();
LCD_SELECT();
LCD_UNCOMMAND();
LCD_SPI_WRITE(da);
LCD_UNSELECT();
LCD_SPI_END();
}
void LCD_WriteData_Word(uint16_t da) {
// uint8_t i = (da >> 8) & 0xff;
LCD_SPI_BEGIN();
LCD_SELECT();
LCD_UNCOMMAND();
LCD_SPI_WRITE(da>>8);
LCD_SPI_WRITE(da);
LCD_UNSELECT();
LCD_SPI_END();
}
void LCD_WriteReg(uint8_t da) {
LCD_SPI_BEGIN();
Serial.println("Begin OK");
LCD_SELECT();
Serial.println("Select OK");
LCD_COMMAND();
Serial.println("Command OK");
LCD_SPI_WRITE(da);
Serial.println("Write OK");
LCD_UNSELECT();
Serial.println("Unselect OK");
LCD_SPI_END();
}
void LCD_Init(void) {
//Déclaration des pins
pinMode(LCD_CS_PIN, OUTPUT);
pinMode(LCD_RST_PIN, OUTPUT);
pinMode(LCD_DC_PIN, OUTPUT);
pinMode(LCD_BL_PIN, OUTPUT);
//Serial
Serial.begin(115200);
delay(1000);
Serial.println("Serial OK; Reset start");
LCD_UNSELECT();
LCD_UNCOMMAND();
LCD_RST_ON();
delay(10);
LCD_RST_OFF();
delay(10);
Serial.println("Reset OK; Sequence start");
LCD_WriteReg(0xEF);
Serial.println("firt byte OK");
LCD_WriteReg(0xEB);
LCD_WriteData_Byte(0x14);
LCD_WriteReg(0xFE);
LCD_WriteReg(0xEF);
LCD_WriteReg(0xEB);
LCD_WriteData_Byte(0x14);
LCD_WriteReg(0x84);
LCD_WriteData_Byte(0x40);
LCD_WriteReg(0x85);
LCD_WriteData_Byte(0xFF);
LCD_WriteReg(0x86);
LCD_WriteData_Byte(0xFF);
LCD_WriteReg(0x87);
LCD_WriteData_Byte(0xFF);
LCD_WriteReg(0x88);
LCD_WriteData_Byte(0x0A);
LCD_WriteReg(0x89);
LCD_WriteData_Byte(0x21);
LCD_WriteReg(0x8A);
LCD_WriteData_Byte(0x00);
LCD_WriteReg(0x8B);
LCD_WriteData_Byte(0x80);
LCD_WriteReg(0x8C);
LCD_WriteData_Byte(0x01);
LCD_WriteReg(0x8D);
LCD_WriteData_Byte(0x01);
LCD_WriteReg(0x8E);
LCD_WriteData_Byte(0xFF);
LCD_WriteReg(0x8F);
LCD_WriteData_Byte(0xFF);
LCD_WriteReg(0xB6);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x20);
LCD_WriteReg(0x36);
LCD_WriteData_Byte(0x08);
LCD_WriteReg(0x3A);
LCD_WriteData_Byte(0x05);
LCD_WriteReg(0x90);
LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x08);
LCD_WriteReg(0xBD);
LCD_WriteData_Byte(0x06);
LCD_WriteReg(0xBC);
LCD_WriteData_Byte(0x00);
LCD_WriteReg(0xFF);
LCD_WriteData_Byte(0x60);
LCD_WriteData_Byte(0x01);
LCD_WriteData_Byte(0x04);
LCD_WriteReg(0xC3);
LCD_WriteData_Byte(0x13);
LCD_WriteReg(0xC4);
LCD_WriteData_Byte(0x13);
LCD_WriteReg(0xC9);
LCD_WriteData_Byte(0x22);
LCD_WriteReg(0xBE);
LCD_WriteData_Byte(0x11);
LCD_WriteReg(0xE1);
LCD_WriteData_Byte(0x10);
LCD_WriteData_Byte(0x0E);
LCD_WriteReg(0xDF);
LCD_WriteData_Byte(0x21);
LCD_WriteData_Byte(0x0c);
LCD_WriteData_Byte(0x02);
LCD_WriteReg(0xF0);
LCD_WriteData_Byte(0x45);
LCD_WriteData_Byte(0x09);
LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x26);
LCD_WriteData_Byte(0x2A);
LCD_WriteReg(0xF1);
LCD_WriteData_Byte(0x43);
LCD_WriteData_Byte(0x70);
LCD_WriteData_Byte(0x72);
LCD_WriteData_Byte(0x36);
LCD_WriteData_Byte(0x37);
LCD_WriteData_Byte(0x6F);
LCD_WriteReg(0xF2);
LCD_WriteData_Byte(0x45);
LCD_WriteData_Byte(0x09);
LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x26);
LCD_WriteData_Byte(0x2A);
LCD_WriteReg(0xF3);
LCD_WriteData_Byte(0x43);
LCD_WriteData_Byte(0x70);
LCD_WriteData_Byte(0x72);
LCD_WriteData_Byte(0x36);
LCD_WriteData_Byte(0x37);
LCD_WriteData_Byte(0x6F);
LCD_WriteReg(0xED);
LCD_WriteData_Byte(0x1B);
LCD_WriteData_Byte(0x0B);
LCD_WriteReg(0xAE);
LCD_WriteData_Byte(0x77);
LCD_WriteReg(0xCD);
LCD_WriteData_Byte(0x63);
LCD_WriteReg(0x70);
LCD_WriteData_Byte(0x07);
LCD_WriteData_Byte(0x07);
LCD_WriteData_Byte(0x04);
LCD_WriteData_Byte(0x0E);
LCD_WriteData_Byte(0x0F);
LCD_WriteData_Byte(0x09);
LCD_WriteData_Byte(0x07);
LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x03);
LCD_WriteReg(0xE8);
LCD_WriteData_Byte(0x34);
LCD_WriteReg(0x62);
LCD_WriteData_Byte(0x18);
LCD_WriteData_Byte(0x0D);
LCD_WriteData_Byte(0x71);
LCD_WriteData_Byte(0xED);
LCD_WriteData_Byte(0x70);
LCD_WriteData_Byte(0x70);
LCD_WriteData_Byte(0x18);
LCD_WriteData_Byte(0x0F);
LCD_WriteData_Byte(0x71);
LCD_WriteData_Byte(0xEF);
LCD_WriteData_Byte(0x70);
LCD_WriteData_Byte(0x70);
LCD_WriteReg(0x63);
LCD_WriteData_Byte(0x18);
LCD_WriteData_Byte(0x11);
LCD_WriteData_Byte(0x71);
LCD_WriteData_Byte(0xF1);
LCD_WriteData_Byte(0x70);
LCD_WriteData_Byte(0x70);
LCD_WriteData_Byte(0x18);
LCD_WriteData_Byte(0x13);
LCD_WriteData_Byte(0x71);
LCD_WriteData_Byte(0xF3);
LCD_WriteData_Byte(0x70);
LCD_WriteData_Byte(0x70);
LCD_WriteReg(0x64);
LCD_WriteData_Byte(0x28);
LCD_WriteData_Byte(0x29);
LCD_WriteData_Byte(0xF1);
LCD_WriteData_Byte(0x01);
LCD_WriteData_Byte(0xF1);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x07);
LCD_WriteReg(0x66);
LCD_WriteData_Byte(0x3C);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0xCD);
LCD_WriteData_Byte(0x67);
LCD_WriteData_Byte(0x45);
LCD_WriteData_Byte(0x45);
LCD_WriteData_Byte(0x10);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x00);
LCD_WriteReg(0x67);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x3C);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x01);
LCD_WriteData_Byte(0x54);
LCD_WriteData_Byte(0x10);
LCD_WriteData_Byte(0x32);
LCD_WriteData_Byte(0x98);
LCD_WriteReg(0x74);
LCD_WriteData_Byte(0x10);
LCD_WriteData_Byte(0x85);
LCD_WriteData_Byte(0x80);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x4E);
LCD_WriteData_Byte(0x00);
LCD_WriteReg(0x98);
LCD_WriteData_Byte(0x3e);
LCD_WriteData_Byte(0x07);
LCD_WriteReg(0x35);
LCD_WriteReg(0x21);
LCD_WriteReg(0x11);
delay(120);
LCD_WriteReg(0x29);
delay(20);
Serial.println("sequence end");
}