开发环境
1、vscode+pio平台,使用arduino;
2、合宙esp32c3开发板,简约版;
3、spi四线tft屏,引脚为BLK CS DC RES SDA SCL VCC GND
原因分析
重启的时候,一般会收到如下的提示:
1、Guru Meditation Error: Core 0 panic’ed (Store access fault). Exception was unhandled.
2、Guru Meditation Error: Core 0 panic’ed (StoreProhibited). Exception was unhandled.
此问题在bodmer的tft_espi的issues有明确的讨论,其中tkggithub对这个问题的产生进行了详细的分析及描述。原因是新版的espidf中,有这么一句:
#define REG_SPI_BASE(i) (((i)==2) ? (DR_REG_SPI2_BASE) : (0)) // only one
而在tft_espi中,有如下的定义
/*
For ESP32/S2/C3:
SPI1_HOST = 0
SPI2_HOST = 1
SPI3_HOST = 2
*/
// Fix IDF problems with ESP32C3
#if CONFIG_IDF_TARGET_ESP32C3
// Fix ESP32C3 IDF bug for missing definition (VSPI/FSPI only tested at the moment)
#ifndef REG_SPI_BASE
#define REG_SPI_BASE(i) DR_REG_SPI2_BASE
#endif
// Fix ESP32C3 IDF bug for name change
#ifndef SPI_MOSI_DLEN_REG
#define SPI_MOSI_DLEN_REG(x) SPI_MS_DLEN_REG(x)
#endif
#endif
#define SPI_PORT SPI2_HOST
REG_SPI_BASE 是在基于使用 SPI2_HOST 的 SPI_PORT 定义的库中使用的,而SPI2_HOST值是1,然而核心REG_SPI_BASE期望的值是2,因此 _spi_user 变量的实际地址使用 0x0 作为基址而不是 SPI2 的预期地址 0x60024000,因此出现了错误。
解决办法
1、espressif32使用6.6.0及以下版本,后面的版本会导致上面的错误,无限重启。
2、#define USE_HSPI_PORT 有的文章提到使用这个就可以在高版本espidf中解决上述问题,但这个是esp32s3才支持(其支持spi3,未测试),esp32c3这个选项是不能打开的(因为没有spi3),如果打开屏幕会一直黑屏。因此使用esp32s3的可以打开此选项。
3、修改tft_espi/processors/tft_espi_esp32_c3.h文件的71行,修改后即可解决。
#define SPI_PORT SPI2_HOST
//将上面的内容,替换为下面的代码
#if ESP_IDF_VERSION_MAJOR< 3
#define SPI_PORT SPI2_HOST
#else
#define SPI_PORT 2
#endif
拾遗
1、必须的配置引脚
#define TFT_MOSI 3
#define TFT_SCLK 2
#define TFT_CS 7 // Chip select control pin,可不连
#define TFT_DC 6 // Data Command control pin
#define TFT_RST 10 // Reset pin (could connect to RST pin)
2、SPI引脚解释
BLK 屏幕背光控制
CS 片选
DC 数据/控制 选择
RES 重置
SCLK/SCL 时钟信号
MOSI/SDA 数据输出
MISO 数据输入,屏幕是输出设备,所以用不到
一般只需要指定CS、DC、RST引脚就行,MOSI、SCLK是固定的,不用指明,除想走软件模拟驱动。
3、所有SPI屏幕的CS引脚都可以省略,节省一个引脚。屏幕的CS接地就是启用了。
4、点阵屏(灰阶)OLED用u8g2,彩色tft屏用TFT_eSPI。
谢谢你,我出现的错误和你的一模一样,根据你的解决提议3修改后正常运行!再次向你感谢