Teensy 4.1 + MSP2807 (V1.2)

Status
Not open for further replies.

Cal

Member
Hi team, I recently bought a Teensy 4.1 and I am having a hard time running an MSP2807 (V1.2) display; I think the issue is because of the frequency in which the T4.1 "talks" with the MSP2807. I have already tried what you indicate in the link: https://www.pjrc.com/store/display_ili9341_touch.html, but the screen remains illuminated white. I am using Teensyduino for the codes and I have taken the "graphictest" example that the ILI9341_t3 library inside teensyduino libraries. Additionally, the MSP2807 has a touchscreen, but I am not enabling it yet. I have some photos but I couldn't upload them. This 2.8 "screen works fine with UNO R3 and MEGA. I need to replace these with a more powerful CPU, that's why I need to migrate to Teensy 4.1. I appreciate in advance the help you can give me
 
Again hard to know what is going on without details about the display and your wiring and...

Is it this one: http://www.lcdwiki.com/2.8inch_SPI_Module_ILI9341_SKU:MSP2807
Which is another ILI9341 display?

Again it would help to see your wiring. Could be something simple like the pins are not properly soldered to Teensy. or running to wrong place.

Could be a library issue? Again can not say much without knowing more. If you are using the ili9341_t3 library. What version of Teensyduino are you running? Assuming something reasonably recent, it should work as long as the wiring matches and that you are using proper SPI pins.

As for the ILI9341 screen stays illuminated white. That is because the backlight pin (LED) is run directly to voltage through resistor. On one of my boards, which was modeled after one of frank's boards the LED pin is connected to an PWM enabled IO pin through a transistor (or transistors) and you can control the brightness of the screen using analogWrite to that pin...
 
Thank you for your quick response and my apologies for answering you at these times due to work. Answering to @MarkT and @KurtE, the link you sent me (http://www.lcdwiki.com/2.8inch_SPI_M...41_SKU:MSP2807), is that i am using for references, notice in that link the photo of the board show the following description: "2.8 TFT SPI 240X320 V1.1", and the board i am working is "2.8 TFT SPI 240X320 V1.2", I don't know if the version change has to do with any difference. Just as a reference, look at the following link because this is the correct board i am using (V1.2): https://store.siqma.com/msp2807-tft-touch.html.

I continue answering (@FrankB):

Librarie: ILI9341_t3
Teensyduino: 1.53
Arduino: 1.8.13


Pin connections:
ILI9341 Teensy 4.1
VCC VIN
GND GND
CS Pin 10 (CS)
RESET Pin with 3.3V (in the middle of Pin GND and PIN 23)
D/C Pin 9 (PWM/OUT1C)
SDI (MOSI) Pin 11 (MOSI)
SCK Pin 13 SCK (pin in the middle of pin 14 and GND), this is the pin of LED.
LED (BL) VIN (connected using a 100 ohm resistor). This VIN-Pin is the same i use to connect MSP2807 VCC.
SDO (MISO) Pin 12 (MISO)

Next CODE is an example of library ILI9341_t3 under name "graphicstest"; i change the serial.begin command to 115200 (original was 9600 - baud_rate)and I also played around for a moment specifying the other pins and changing the frequency in tft.Clock and checking this with an oscilloscope on pin 13. This showed me some inconsistent flickering on the screen.:

/***************************************************
This is our GFX example for the Adafruit ILI9341 Breakout and Shield
----> http://www.adafruit.com/products/1651

Check out the links above for our tutorials and wiring diagrams
These displays use SPI to communicate, 4 or 5 pins are required to
interface (RST is optional)
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/


#include "SPI.h"
#include "ILI9341_t3.h"
#include "font_Arial.h"

// For the Adafruit shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
ILI9341_t3 tft = ILI9341_t3(TFT_CS, TFT_DC);

void setup() {
tft.begin();
// Note: you can now set the SPI speed to any value
// the default value is 30Mhz, but most ILI9341 displays
// can handle at least 60Mhz and as much as 100Mhz
// tft.setClock(60000000);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_YELLOW);
tft.setTextSize(2);
tft.println("Waiting for Arduino Serial Monitor...");

Serial.begin(115200);
while (!Serial) ; // wait for Arduino Serial Monitor
Serial.println("ILI9341 Test!");

// read diagnostics (optional but can help debug problems)
uint8_t x = tft.readcommand8(ILI9341_RDMODE);
Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDMADCTL);
Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDPIXFMT);
Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDIMGFMT);
Serial.print("Image Format: 0x"); Serial.println(x, HEX);
x = tft.readcommand8(ILI9341_RDSELFDIAG);
Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX);

Serial.println(F("Benchmark Time (microseconds)"));

Serial.print(F("Screen fill "));
Serial.println(testFillScreen());
delay(200);

Serial.print(F("Text "));
Serial.println(testText());
delay(600);

Serial.print(F("Proportional Text "));
Serial.println(testProportionalText());
delay(600);

Serial.print(F("Lines "));
Serial.println(testLines(ILI9341_CYAN));
delay(200);

Serial.print(F("Horiz/Vert Lines "));
Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE));
delay(200);

Serial.print(F("Rectangles (outline) "));
Serial.println(testRects(ILI9341_GREEN));
delay(200);

Serial.print(F("Rectangles (filled) "));
Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA));
delay(200);

Serial.print(F("Circles (filled) "));
Serial.println(testFilledCircles(10, ILI9341_MAGENTA));

Serial.print(F("Circles (outline) "));
Serial.println(testCircles(10, ILI9341_WHITE));
delay(200);

Serial.print(F("Triangles (outline) "));
Serial.println(testTriangles());
delay(200);

Serial.print(F("Triangles (filled) "));
Serial.println(testFilledTriangles());
delay(200);

Serial.print(F("Rounded rects (outline) "));
Serial.println(testRoundRects());
delay(200);

Serial.print(F("Rounded rects (filled) "));
Serial.println(testFilledRoundRects());
delay(200);

Serial.println(F("Done!"));

}


void loop(void) {
for(uint8_t rotation=0; rotation<4; rotation++) {
tft.setRotation(rotation);
testText();
delay(1000);
}
}

unsigned long testFillScreen() {
unsigned long start = micros();
tft.fillScreen(ILI9341_BLACK);
tft.fillScreen(ILI9341_RED);
tft.fillScreen(ILI9341_GREEN);
tft.fillScreen(ILI9341_BLUE);
tft.fillScreen(ILI9341_BLACK);
return micros() - start;
}

unsigned long testText() {
tft.fillScreen(ILI9341_BLACK);
unsigned long start = micros();
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
tft.println("Hello World!");
tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
tft.println(1234.56);
tft.setTextColor(ILI9341_RED); tft.setTextSize(3);
tft.println(0xDEADBEEF, HEX);
tft.println();
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(5);
tft.println("Groop");
tft.setTextSize(2);
tft.println("I implore thee,");
tft.setTextSize(1);
tft.println("my foonting turlingdromes.");
tft.println("And hooptiously drangle me");
tft.println("with crinkly bindlewurdles,");
tft.println("Or I will rend thee");
tft.println("in the gobberwarts");
tft.println("with my blurglecruncheon,");
tft.println("see if I don't!");
return micros() - start;
}

unsigned long testProportionalText() {
tft.fillScreen(ILI9341_BLACK);
unsigned long start = micros();
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_WHITE); tft.setFont(Arial_10);
tft.println("Hello World!");
tft.setTextColor(ILI9341_YELLOW); tft.setFont(Arial_16);
tft.println(1234.56);
tft.setTextColor(ILI9341_RED); tft.setFont(Arial_24);
tft.println(0xDEADBEEF, HEX);
tft.println();
tft.setTextColor(ILI9341_GREEN);
tft.setFont(Arial_40);
tft.println("Groop");
tft.setFont(Arial_16);
tft.println("I implore thee,");
tft.setFont(Arial_10);
tft.println("my foonting turlingdromes.");
tft.println("And hooptiously drangle me");
tft.println("with crinkly bindlewurdles,");
tft.println("Or I will rend thee");
tft.println("in the gobberwarts");
tft.println("with my blurglecruncheon,");
tft.println("see if I don't!");
tft.setFontAdafruit();
return micros() - start;
}

unsigned long testLines(uint16_t color) {
unsigned long start, t;
int x1, y1, x2, y2,
w = tft.width(),
h = tft.height();

tft.fillScreen(ILI9341_BLACK);

x1 = y1 = 0;
y2 = h - 1;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t = micros() - start; // fillScreen doesn't count against timing

tft.fillScreen(ILI9341_BLACK);

x1 = w - 1;
y1 = 0;
y2 = h - 1;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t += micros() - start;

tft.fillScreen(ILI9341_BLACK);

x1 = 0;
y1 = h - 1;
y2 = 0;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
t += micros() - start;

tft.fillScreen(ILI9341_BLACK);

x1 = w - 1;
y1 = h - 1;
y2 = 0;
start = micros();
for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);

return micros() - start;
}

unsigned long testFastLines(uint16_t color1, uint16_t color2) {
unsigned long start;
int x, y, w = tft.width(), h = tft.height();

tft.fillScreen(ILI9341_BLACK);
start = micros();
for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);

return micros() - start;
}

unsigned long testRects(uint16_t color) {
unsigned long start;
int n, i, i2,
cx = tft.width() / 2,
cy = tft.height() / 2;

tft.fillScreen(ILI9341_BLACK);
n = min(tft.width(), tft.height());
start = micros();
for(i=2; i<n; i+=6) {
i2 = i / 2;
tft.drawRect(cx-i2, cy-i2, i, i, color);
}

return micros() - start;
}

unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
unsigned long start, t = 0;
int n, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
n = min(tft.width(), tft.height()) - 1;
for(i=n; i>0; i-=6) {
i2 = i / 2;
start = micros();
tft.fillRect(cx-i2, cy-i2, i, i, color1);
t += micros() - start;
// Outlines are not included in timing results
tft.drawRect(cx-i2, cy-i2, i, i, color2);
}

return t;
}

unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
unsigned long start;
int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;

tft.fillScreen(ILI9341_BLACK);
start = micros();
for(x=radius; x<w; x+=r2) {
for(y=radius; y<h; y+=r2) {
tft.fillCircle(x, y, radius, color);
}
}

return micros() - start;
}

unsigned long testCircles(uint8_t radius, uint16_t color) {
unsigned long start;
int x, y, r2 = radius * 2,
w = tft.width() + radius,
h = tft.height() + radius;

// Screen is not cleared for this one -- this is
// intentional and does not affect the reported time.
start = micros();
for(x=0; x<w; x+=r2) {
for(y=0; y<h; y+=r2) {
tft.drawCircle(x, y, radius, color);
}
}

return micros() - start;
}

unsigned long testTriangles() {
unsigned long start;
int n, i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
n = min(cx, cy);
start = micros();
for(i=0; i<n; i+=5) {
tft.drawTriangle(
cx , cy - i, // peak
cx - i, cy + i, // bottom left
cx + i, cy + i, // bottom right
tft.color565(0, 0, i));
}

return micros() - start;
}

unsigned long testFilledTriangles() {
unsigned long start, t = 0;
int i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
start = micros();
for(i=min(cx,cy); i>10; i-=5) {
start = micros();
tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(0, i, i));
t += micros() - start;
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(i, i, 0));
}

return t;
}

unsigned long testRoundRects() {
unsigned long start;
int w, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
w = min(tft.width(), tft.height()) - 1;
start = micros();
for(i=0; i<w; i+=6) {
i2 = i / 2;
tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
}

return micros() - start;
}

unsigned long testFilledRoundRects() {
unsigned long start;
int i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;

tft.fillScreen(ILI9341_BLACK);
start = micros();
for(i=min(tft.width(), tft.height()) - 1; i>20; i-=6) {
i2 = i / 2;
tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
}

return micros() - start;
}
 
I'm sorry for the previous connection as it did not look good. I repeat in a better way:

Pin connections:
ILI9341 ----- Teensy 4.1
VCC ----------- VIN
GND ---------- GND
CS ----------- Pin 10 (CS)
RESET -------- Pin with 3.3V (in the middle of Pin GND and PIN 23)
D/C ---------- Pin 9 (PWM/OUT1C)
SDI (MOSI) --- Pin 11 (MOSI)
SCK ----------- Pin 13 SCK (pin in the middle of pin 14 and GND), this is the pin of LED.
LED (BL) ------ VIN (connected using a 100 ohm resistor). This VIN-Pin is the same i use to connect MSP2807 VCC.
SDO (MISO) --- Pin 12 (MISO)
 
Dear Group, after so many tests, I replaced this new screen with similar one, apparently the first MSP2807 has intermittent damage. By replacing it, everything was working without errors. Thanks anyway for the support.
 
Status
Not open for further replies.
Back
Top