Seeed Round Display 点亮屏幕 — Xiao Esp32 S3 simulation

使用 XIAO ESP32-S3 驱动 Seeed Round Display (GC9A01) 圆形屏幕显示内容

An interactive Xiao Esp32 S3 circuit simulation you can run free in your browser on Velxio, by buduojun.

Components

Sketch code

#include <SPI.h>
#include "driver/twai.h"

// 引脚定义 (XIAO ESP32-S3)
#define LCD_CS    D1  // GPIO 2
#define LCD_DC    D3  // GPIO 4
#define LCD_BL    D6  // GPIO 43 (背光)
#define LCD_SCK   D8  // GPIO 7
#define LCD_MOSI  D10 // GPIO 9

// CAN (TWAI) 引脚(开发板上 D4 与 D5 已通过导线短接回路)
#define CAN_TX    GPIO_NUM_4
#define CAN_RX    GPIO_NUM_5

// 发送 GC9A01 命令
void writeCommand(uint8_t cmd) {
  digitalWrite(LCD_DC, LOW);
  digitalWrite(LCD_CS, LOW);
  SPI.transfer(cmd);
  digitalWrite(LCD_CS, HIGH);
}

// 发送 GC9A01 数据
void writeData(uint8_t data) {
  digitalWrite(LCD_DC, HIGH);
  digitalWrite(LCD_CS, LOW);
  SPI.transfer(data);
  digitalWrite(LCD_CS, HIGH);
}

// 全屏单色填充 (16位 RGB565)
void fillScreen(uint16_t color) {
  writeCommand(0x2A); // 列地址
  writeData(0x00); writeData(0x00);
  writeData(0x00); writeData(0xEF); // 239

  writeCommand(0x2B); // 行地址
  writeData(0x00); writeData(0x00);
  writeData(0x00); writeData(0xEF); // 239

  writeCommand(0x2C); // 写显存
  digitalWrite(LCD_DC, HIGH);
  digitalWrite(LCD_CS, LOW);
  uint8_t hi = color >> 8;
  uint8_t lo = color & 0xFF;
  for (int i = 0; i < 240 * 240; i++) {
    SPI.transfer(hi);
    SPI.transfer(lo);
  }
  digitalWrite(LCD_CS, HIGH);
}

// 初始化 GC9A01 屏幕
void initDisplay() {
  pinMode(LCD_CS, OUTPUT);
  pinMode(LCD_DC, OUTPUT);
  pinMode(LCD_BL, OUTPUT);
  digitalWrite(LCD_CS, HIGH);
  digitalWrite(LCD_BL, HIGH); // 打开背光

  SPI.begin(LCD_SCK, -1, LCD_MOSI, LCD_CS);
  SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));

  delay(100);
  writeCommand(0xEF);
  writeCommand(0xEB); writeData(0x14);
  writeCommand(0xFE);
  writeCommand(0xEF);
  writeCommand(0x3A); writeData(0x05); // 16-bit RGB565
  writeCommand(0x11); // Sleep Out
  delay(120);
  writeCommand(0x29); // Display ON
}

// 初始化 TWAI 为自测 (NO_ACK) 模式
void initTWAI() {
  twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(CAN_TX, CAN_RX, TWAI_MODE_NO_ACK);
  twai_timing_config_t t_config = TWAI_TIMING_CONFIG_50KBITS();
  twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();

  if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
    Serial.println("TWAI 驱动安装成功");
  }
  if (twai_start() == ESP_OK) {
    Serial.println("TWAI 启动成功");
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("启动 XIAO ESP32-S3 屏幕与 CAN 自发自收测试");

  initDisplay();
  fillScreen(0x001F); // 初始填充蓝色

  initTWAI();
}

int count = 0;

void loop() {
  // 1. 发送 CAN 消息
  twai_message_t tx_msg;
  tx_msg.identifier = 0x123;
  tx_msg.self = 1; // 发送给自身
  tx_msg.extd = 0;
  tx_msg.data_length_code = 4;
  tx_msg.data[0] = 'C';
  tx_msg.data[1] = 'A';
  tx_msg.data[2] = 'N';
  tx_msg.data[3] = '0' + (count % 10);

  if (twai_transmit(&tx_msg, pdMS_TO_TICKS(100)) == ESP_OK) {
    Serial.printf("发送成功: CAN%d\n", count % 10);
  }

  // 2. 接收 CAN 消息并在屏幕上变色响应
  twai_message_t rx_msg;
  if (twai_receive(&rx_msg, pdMS_TO_TICKS(200)) == ESP_OK) {
    Serial.printf("自收成功! 内容: %c%c%c%c\n", rx_msg.data[0], rx_msg.data[1], rx_msg.data[

More projects by buduojun