moononournation / Arduino_GFX

Arduino GFX developing for various color displays and various data bus interfaces
Other
796 stars 157 forks source link

esp32s2 error with software-spi &GC9A01 #136

Closed gyjmy111 closed 2 years ago

gyjmy111 commented 2 years ago

This code can not run well on esp32s2/gc9a01 by your library but can be driven well by LovyanGFX. Could you please help find anything wrong of the code?

include

//Arduino_DataBus bus = new Arduino_ESP32SPI(2 / DC /, 3 / CS /, 4 / SCK /, 5 / MOSI /, -1 / MISO /); Arduino_DataBus bus = new Arduino_SWSPI(2 / DC /, 3 / CS /, 4 / SCK /, 5 / MOSI /, -1 / MISO /); Arduino_GFX gfx = new Arduino_GC9A01(bus, 6 / RST /, 0 / rotation /, true / IPS */); /***

void setup(void) { gfx->begin(); gfx->fillScreen(BLACK);

ifdef DF_GFX_BL

pinMode(1, OUTPUT);
digitalWrite(1, HIGH);

endif

gfx->setCursor(100, 100);
gfx->setTextColor(RED);
gfx->println("Hello World!");

delay(5000); // 5 seconds

}

void loop() { gfx->setCursor(random(gfx->width()), random(gfx->height())); gfx->setTextColor(random(0xffff), random(0xffff)); gfx->setTextSize(random(6) / x scale /, random(6) / y scale /, random(2) / pixel_margin /); gfx->println("Hello World!");

delay(1000); // 1 second

}

gyjmy111 commented 2 years ago

Here is the setting by LovyanGFX and it works.

// v1.0.0 を有効にします(v0からの移行期間の特別措置です。これを書かない場合は旧v0系で動作します。)

define LGFX_USE_V1

include

// ESP32でLovyanGFXを独自設定で利用する場合の設定例

/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。 class LGFX : public lgfx::LGFX_Device { /* クラス名は"LGFX"から別の名前に変更しても構いません。 AUTODETECTと併用する場合は"LGFX"は使用されているため、LGFX以外の名前に変更してください。 また、複数枚のパネルを同時使用する場合もそれぞれに異なる名前を付けてください。 ※ クラス名を変更する場合はコンストラクタの名前も併せて同じ名前に変更が必要です。

名前の付け方は自由に決めて構いませんが、設定が増えた場合を想定し、 例えばESP32 DevKit-CでSPI接続のILI9341の設定を行った場合、 LGFX_DevKitC_SPI_ILI9341 のような名前にし、ファイル名とクラス名を一致させておくことで、利用時に迷いにくくなります。 //*/

// 接続するパネルの型にあったインスタンスを用意します。 lgfx::Panel_GC9A01 _panel_instance; //lgfx::Panel_GDEW0154M09 _panel_instance; //lgfx::Panel_HX8357B _panel_instance; //lgfx::Panel_HX8357D _panel_instance; //lgfx::Panel_ILI9163 _panel_instance; // lgfx::Panel_ILI9341 _panel_instance; //lgfx::Panel_ILI9342 _panel_instance; //lgfx::Panel_ILI9481 _panel_instance; //lgfx::Panel_ILI9486 _panel_instance; //lgfx::Panel_ILI9488 _panel_instance; //lgfx::Panel_IT8951 _panel_instance; //lgfx::Panel_SH110x _panel_instance; // SH1106, SH1107 //lgfx::Panel_SSD1306 _panel_instance; //lgfx::Panel_SSD1327 _panel_instance; //lgfx::Panel_SSD1331 _panel_instance; //lgfx::Panel_SSD1351 _panel_instance; // SSD1351, SSD1357 //lgfx::Panel_SSD1963 _panel_instance; //lgfx::Panel_ST7735 _panel_instance; //lgfx::Panel_ST7735S _panel_instance; //lgfx::Panel_ST7789 _panel_instance; //lgfx::Panel_ST7796 _panel_instance;

// パネルを接続するバスの種類にあったインスタンスを用意します。 lgfx::Bus_SPI _bus_instance; // SPIバスのインスタンス //lgfx::Bus_I2C _bus_instance; // I2Cバスのインスタンス (ESP32のみ) //lgfx::Bus_Parallel8 _bus_instance; // 8ビットパラレルバスのインスタンス (ESP32のみ)

// バックライト制御が可能な場合はインスタンスを用意します。(必要なければ削除) lgfx::Light_PWM _light_instance;

// タッチスクリーンの型にあったインスタンスを用意します。(必要なければ削除) // lgfx::Touch_FT5x06 _touch_instance; // FT5206, FT5306, FT5406, FT6206, FT6236, FT6336, FT6436 //lgfx::Touch_GT911 _touch_instance; //lgfx::Touch_STMPE610 _touch_instance; //lgfx::Touch_XPT2046 _touch_instance;

public:

// コンストラクタを作成し、ここで各種設定を行います。 // クラス名を変更した場合はコンストラクタも同じ名前を指定してください。 LGFX(void) { { // バス制御の設定を行います。 auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。

// SPIバスの設定 cfg.spi_host = SPI2_HOST; // 使用するSPIを選択 ESP32-S2,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST // ※ ESP-IDFバージョンアップに伴い、VSPI_HOST , HSPI_HOSTの記述は非推奨になるため、エラーが出る場合は代わりにSPI2_HOST , SPI3_HOSTを使用してください。 cfg.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3) cfg.freq_write = 40000000; // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます) cfg.freq_read = 16000000; // 受信時のSPIクロック cfg.spi_3wire = true; // 受信をMOSIピンで行う場合はtrueを設定 cfg.use_lock = true; // トランザクションロックを使用する場合はtrueを設定 cfg.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定) // ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。 cfg.pin_sclk = 4; // SPIのSCLKピン番号を設定 cfg.pin_mosi = 5; // SPIのMOSIピン番号を設定 cfg.pin_miso = -1; // SPIのMISOピン番号を設定 (-1 = disable) cfg.pin_dc = 2; // SPIのD/Cピン番号を設定 (-1 = disable) // SDカードと共通のSPIバスを使う場合、MISOは省略せず必ず設定してください。 //*/

  _bus_instance.config(cfg);    // 設定値をバスに反映します。
  _panel_instance.setBus(&_bus_instance);      // バスをパネルにセットします。
}

{ // 表示パネル制御の設定を行います。
  auto cfg = _panel_instance.config();    // 表示パネル設定用の構造体を取得します。

  cfg.pin_cs           =    3;  // CSが接続されているピン番号   (-1 = disable)
  cfg.pin_rst          =    6;  // RSTが接続されているピン番号  (-1 = disable)
  cfg.pin_busy         =    -1;  // BUSYが接続されているピン番号 (-1 = disable)

  // ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。

  cfg.memory_width     =   240;  // ドライバICがサポートしている最大の幅
  cfg.memory_height    =   240;  // ドライバICがサポートしている最大の高さ
  cfg.panel_width      =   240;  // 実際に表示可能な幅
  cfg.panel_height     =   240;  // 実際に表示可能な高さ
  cfg.offset_x         =     0;  // パネルのX方向オフセット量
  cfg.offset_y         =     0;  // パネルのY方向オフセット量
  cfg.offset_rotation  =     0;  // 回転方向の値のオフセット 0~7 (4~7は上下反転)
  cfg.dummy_read_pixel =     8;  // ピクセル読出し前のダミーリードのビット数
  cfg.dummy_read_bits  =     1;  // ピクセル以外のデータ読出し前のダミーリードのビット数
  cfg.readable         =  true;  // データ読出しが可能な場合 trueに設定
  cfg.invert           =  true;  // パネルの明暗が反転してしまう場合 trueに設定
  cfg.rgb_order        = false;  // パネルの赤と青が入れ替わってしまう場合 trueに設定
  cfg.dlen_16bit       = false;  // データ長を16bit単位で送信するパネルの場合 trueに設定
  cfg.bus_shared       =  true;  // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)

  _panel_instance.config(cfg);
}

//* { // バックライト制御の設定を行います。(必要なければ削除) auto cfg = _light_instance.config(); // バックライト設定用の構造体を取得します。

  cfg.pin_bl = 1;              // バックライトが接続されているピン番号
  cfg.invert = false;           // バックライトの輝度を反転させる場合 true
  cfg.freq   = 44100;           // バックライトのPWM周波数
  cfg.pwm_channel = 7;          // 使用するPWMのチャンネル番号

  _light_instance.config(cfg);
  _panel_instance.setLight(&_light_instance);  // バックライトをパネルにセットします。
}

//*/

/* { // タッチスクリーン制御の設定を行います。(必要なければ削除) auto cfg = _touch_instance.config();

  cfg.x_min      = 0;    // タッチスクリーンから得られる最小のX値(生の値)
  cfg.x_max      = 239;  // タッチスクリーンから得られる最大のX値(生の値)
  cfg.y_min      = 0;    // タッチスクリーンから得られる最小のY値(生の値)
  cfg.y_max      = 319;  // タッチスクリーンから得られる最大のY値(生の値)
  cfg.pin_int    = 38;   // INTが接続されているピン番号
  cfg.bus_shared = true; // 画面と共通のバスを使用している場合 trueを設定
  cfg.offset_rotation = 0;// 表示とタッチの向きのが一致しない場合の調整 0~7の値で設定

// SPI接続の場合 cfg.spi_host = VSPI_HOST;// 使用するSPIを選択 (HSPI_HOST or VSPI_HOST) cfg.freq = 1000000; // SPIクロックを設定 cfg.pin_sclk = 18; // SCLKが接続されているピン番号 cfg.pin_mosi = 23; // MOSIが接続されているピン番号 cfg.pin_miso = 19; // MISOが接続されているピン番号 cfg.pin_cs = 5; // CSが接続されているピン番号

// I2C接続の場合 cfg.i2c_port = 1; // 使用するI2Cを選択 (0 or 1) cfg.i2c_addr = 0x38; // I2Cデバイスアドレス番号 cfg.pin_sda = 23; // SDAが接続されているピン番号 cfg.pin_scl = 32; // SCLが接続されているピン番号 cfg.freq = 400000; // I2Cクロックを設定

  _touch_instance.config(cfg);
  _panel_instance.setTouch(&_touch_instance);  // タッチスクリーンをパネルにセットします。
}

*/

setPanel(&_panel_instance); // 使用するパネルをセットします。

} };

// 準備したクラスのインスタンスを作成します。 LGFX display;

void setup(void) { // SPIバスとパネルの初期化を実行すると使用可能になります。 display.init();

display.setTextSize((std::max(display.width(), display.height()) + 255) >> 8);

// タッチが使用可能な場合のキャリブレーションを行います。(省略可) if (display.touch()) { if (display.width() < display.height()) display.setRotation(display.getRotation() ^ 1);

// 画面に案内文章を描画します。
display.setTextDatum(textdatum_t::middle_center);
display.drawString("touch the arrow marker.", display.width()>>1, display.height() >> 1);
display.setTextDatum(textdatum_t::top_left);

// タッチを使用する場合、キャリブレーションを行います。画面の四隅に表示される矢印の先端を順にタッチしてください。
std::uint16_t fg = TFT_WHITE;
std::uint16_t bg = TFT_BLACK;
if (display.isEPD()) std::swap(fg, bg);
display.calibrateTouch(nullptr, fg, bg, std::max(display.width(), display.height()) >> 3);

}

display.fillScreen(TFT_BLACK); }

uint32_t count = ~0; void loop(void) { display.startWrite(); display.setRotation(++count & 7); display.setColorDepth((count & 8) ? 16 : 24);

display.setTextColor(TFT_WHITE); display.drawNumber(display.getRotation(), 16, 0);

display.setTextColor(0xFF0000U); display.drawString("R", 30, 16); display.setTextColor(0x00FF00U); display.drawString("G", 40, 16); display.setTextColor(0x0000FFU); display.drawString("B", 50, 16);

display.drawRect(30,30,display.width()-60,display.height()-60,count*7); display.drawFastHLine(0, 0, 10);

display.endWrite();

int32_t x, y; if (display.getTouch(&x, &y)) { display.fillRect(x-2, y-2, 5, 5, count*7); } }

moononournation commented 2 years ago

Can you describe what's mean cannot run well? and why software SPI?

gyjmy111 commented 2 years ago

It's just that the screen doesn't light up. The screen shows nothing. ohhhh, It's the fisrt time for me to design the pcb and I just used the GPIO that I want. So..... Is there any way to make it running well?

moononournation commented 2 years ago

Just tested it works with you pin config and using Arduino_ESP32SPI Databus class:

#include <Arduino_GFX_Library.h>
#define GFX_BL 1
Arduino_DataBus *bus = new Arduino_ESP32SPI(2 /* DC */, 3 /* CS */, 4 /* SCK */, 5 /* MOSI */, -1 /* MISO */, HSPI /* spi_num */);
Arduino_GFX *gfx = new Arduino_GC9A01(bus, 6 /* RST */, 0 /* rotation */, true /* IPS */);

void setup(void)
{
    gfx->begin();
    gfx->fillScreen(BLACK);

#ifdef GFX_BL
    pinMode(GFX_BL, OUTPUT);
    digitalWrite(GFX_BL, HIGH);
#endif

    gfx->setCursor(100, 100);
    gfx->setTextColor(RED);
    gfx->println("Hello World!");
}

image