راه اندازی نمایشگر با کنترلر ili9341 توسط برد sinux f1

سلام دوستان
یک ال سی دی ۲.۴ اینچ دارم که با spi راه اندازی میشه می‌خوام با spi1 که روی برد سینوکس در دسترس هست راه اندازیش کنم
ممنون میشم راهنمایی بفرمایید.
همچنین من میخوام از طریق پروتکل spi راه اندازی بشه

سلام.
برای راه اندازی این نمایشگر توسط تراشه f1c100s بهتره که اول از همه از نظر سخت افزاری و نرم افزاری امکان سنجی بشه راه اندازیش
در دیتاشیت این درایور ili9341 پروتکل های مختلفی که میشه توسط اونها راه اندازیش کرد ذکر شده
image
همونطور که در تصویر بالا مشخص هست چهار حالت اول به صورت موازی هست که خب بدرد ما نمیخوره ، میمونه دو مورد آخری ، مورد پنجم راه اندازی توسط spi 9 bit هست که خب سخت افزار ما از spi 9 bit پشتیبانی نمیکنه ، پس فقط مورد آخری رو داریم ، البته در مورد آخر اومده و همون بیت نهم رو به صورت یک پین جدا تعریف کرده و از اون استفاده میشه.

حالا باید ببینیم که درایوری هست برای لینوکس که اولا این کنترلر ili9341 رو ساپورت کنه و سپس بتونه توی مد 4 سیمه راه اندازیش کنه یا نه


با کمی بررسی به درایوری برخوردم که خدارو شکر این کار رو به طور کامل انجام میداد.
image


حالا نوبت به راه اندازیش میرسه ، من این کار رو انجام دادم و روندی که برای انجامش طی کردم رو براتون شرح میدم.

اول از همه درایور مربوطه رو در کرنل فعال کردم که در این مسیر بود
image
دقت کنید که این درایور رو به صورت ماژول لود کنید ، یعنی برای فعال کردنش به جای y کلید m رو بزنید (دلیلش رو دقیقا نمیدونم اما فقط در این صورت کار میداد ، شاید بخاطر این هست که توی staging هست و شایدم ؟!!)

بعد از اون نیاز به اضافه کردن اون به دیوایس تری هست برای اینکار ابتدا لازم بود spi 1 رو در دیوایس تری فعال و تنظیم کنم برای اینکار این دو قسمت رو باید به فایل suniv-f1c100s.dtsi اضافه کنید

***************
*** 145,150 ****
--- 145,152 ----
  			clock-names = "ahb", "mod";
  			resets = <&ccu RST_BUS_SPI1>;
  			status = "disabled";
+  			pinctrl-names = "default";
+  			pinctrl-0 = <&spi1_pins>;
  			#address-cells = <1>;
  			#size-cells = <0>;
  		};
***************
*** 371,376 ****
--- 373,384 ----
  				bias-pull-up;
  			};
  
+ 			spi1_pins: spi1-pins {
+ 				pins = "PA2", "PA0", "PA3", "PA1";
+ 				function = "spi1";
+ 				bias-pull-up;
+ 			};
+ 
  			mmc0_pins: mmc0-pins {
  				pins = "PF0", "PF1", "PF2", "PF3", "PF4", "PF5";
  				function = "mmc0";

سپس نود spi1 رو به همراه نود نمایشگر به فایل devicetree.dts اضافه کردم
در واقع از این لینک کمک گرفتم

&spi1 {
	status = "okay";

    device@0 {
        rotate = <270>;
        bgr;
        fps = <30>;
        compatible = "ilitek,ili9341";
        spi-max-frequency = <32000000>;   
        reg = <0>;
        regwidth = <8>;
        buswidth = <8>;
        verbose = <3>;
        reset-gpios = <&pio 4 8 GPIO_ACTIVE_HIGH>; // PE8 
        dc-gpios = <&pio 4 7 GPIO_ACTIVE_HIGH>; // PE7 
    };
};

حالا نوبت به سخت افزار میرسه ، این اتصالات من هست

|   sinux       |     LCD      |
--------------------------------
-SPI1MISO  (A3) -> SDO   (14)  -
-SPI1CLK   (A2) -> SCL   (10)  -
-SPI1MOSI  (A1) -> SDI   (13)  -
-SPI1CS    (A0) -> CS    (09)  -
-UART2TX   (E7) -> DC    (11)  -
-UART2RX   (E8) -> RESET (15)  -
--------------------------------

پین های IM نمایشگر هم که برای تنظیم پروتکل هست به این صورت تنظیم کردم

IM0=0
IM1=1
IM2=1

بک لایت رو هم 3.3 ولت دادم و بقیه پین های تغذیه هم 3.3 ولت.

بعد از اون ایمیج رو کامپایل کردم و اجرا کردم ، یک فریم بافر به سیستم اضافه شده بود که نشون دهنده لود شدن درایور بود ، در این آدرس

/dev/fb1

اما هرچه تلاش کردم نتونستم روی نمایشگر چیزی نشون بدم و هیچ عکس العملی نشون نمیداد

بعد از اون اومدم و با کمک کد پایین توسط esp32 راه اندازیش کردم تا از عملکرد سخت افزارم مطمئن بشم

include <Arduino_GFX_Library.h>
 
#define TFT_SCK    18
#define TFT_MOSI   23
#define TFT_MISO   19
#define TFT_CS     22
#define TFT_DC     21
#define TFT_RESET  17
 
void setup(void)
{
 
  Arduino_ESP32SPI bus = Arduino_ESP32SPI(TFT_DC, TFT_CS, TFT_SCK, TFT_MOSI, TFT_MISO);
  Arduino_ILI9341 display = Arduino_ILI9341(&bus, TFT_RESET);
 
  display.begin();
  display.fillScreen(WHITE);
  display.setCursor(20, 20);
  display.setTextSize(2);
  display.setTextColor(BLUE);
  display.print("Hello world");
}
 
void loop() {}

بعد از اجرای کد دیدم که خروجی روی نمایشگر میاد و همه چیز درست هست ، برای همین با کمک لاجیک آنالایزر تمام سیگنال ها رو ضبظ کردم تا با f1c100s مقایسه کنم .

حالا دوباره نمایشگر رو به f1c100s وصل کردم و دیدم که پین ریست NOT هست و در زمانیکه دیتا در حال ارسال به نمایشگر هست نمایشگر رو غیر فعال میکنه


با قطع کردن اتصال ریست دیتا به درستی روی نمایشگر اومد و نیازی به reset هم نبود

این هم از خروجی

4 پسندیده