完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教下,使用 esp32-S3-WROOM-1 N16R8 的模块,
目前想使用 2 个 spi 接口, 具体定义如下: 1. spi2 定义为驱动 lcd 显示屏,接口如下: // LCD SPI 接口定义 #define GPIO_LCD_MOSI 0 //23 /*!< for 1-line SPI, this also refered as MOSI */ #define GPIO_LCD_MISO -1 #define GPIO_LCD_SCLK GPIO_LCD_SCK //19 #define GPIO_LCD_CS 40 //22 #define GPIO_LCD_DC 2 //21 H/L 命令数据选通端,H:数据,L:命令 #define GPIO_LCD_RESET -1 // 18 // 定义为 -1 表示不使用,屏蔽复位管脚,因为复位使用 io 扩展芯片实现 #define GPIO_LCD_BL -1 // 5 // 定义为 -1 表示不使用,屏蔽背光控制管脚,因为使用 io 扩展芯片实现 2. spi3 定义为驱动 外部 spi flash ,驱动 spi 接口的 flash 及 触摸屏 xpt2046 等 #define GPIO_T_MOSI (GPIO_NUM_19) #define GPIO_T_MISO (GPIO_NUM_20) #define GPIO_T_SCK (GPIO_NUM_46) #define GPIO_SPI_MISO (GPIO_T_MISO) #define GPIO_SPI_MOSI (GPIO_T_MOSI) #define GPIO_SPI_SCLK (GPIO_T_SCK) 片选 使用外部扩展 的 io 芯片实现 3. 上述的定义功能,单独的使用的话,都是没有问题的,但是如果吧 spi2 及 spi3 同时编译后,发现 spi3 驱动 spi flash 及 xpt2046 的这组 spi 总线可以正常工作,spi2 驱动 lcd 的没有工作,不知道为何会这样呀 ?????? 4. 相关的部分代码如下: a. lcd 初始化 // 使用 spi bus 总线驱动的方式 void spi_master_init(_TFT_device_t * dev, int16_t GPIO_MOSI, int16_t GPIO_MISO, int16_t GPIO_SCLK, int16_t GPIO_CS, int16_t GPIO_DC, int16_t GPIO_RESET, int16_t GPIO_BL) { ESP_LOGI(TAG, "GPIO_CS=%d",GPIO_CS); if ( GPIO_CS >= 0 ) { gpio_pad_select_gpio( GPIO_CS ); gpio_set_direction( GPIO_CS, GPIO_MODE_OUTPUT ); gpio_set_level( GPIO_CS, 0 ); } ESP_LOGI(TAG, "GPIO_DC=%d",GPIO_DC); gpio_pad_select_gpio( GPIO_DC ); gpio_set_direction( GPIO_DC, GPIO_MODE_OUTPUT ); gpio_set_level( GPIO_DC, 0 ); ESP_LOGI(TAG, "GPIO_MISO=%d",GPIO_MISO); ESP_LOGI(TAG, "GPIO_MOSI=%d",GPIO_MOSI); ESP_LOGI(TAG, "GPIO_SCLK=%d",GPIO_SCLK); spi_config_t bus_conf = { .miso_io_num = GPIO_MISO, .mosi_io_num = GPIO_MOSI, .sclk_io_num = GPIO_SCLK, .quadwp = -1, .quadhd = -1, .max_transfer_sz = HX8357_TFTWIDTH * HX8357_TFTHEIGHT * sizeof(uint16_t) }; spi_bus_handle_t lcd_bus_handle = NULL; lcd_bus_handle = spi_bus_create(LCD_HOST, &bus_conf); assert(lcd_bus_handle != NULL); spi_device_config_t device_conf = { .cs_io_num = GPIO_CS, .clock_speed_hz = SPI_Frequency, .mode = 0, // 这个设置为 2 工作不稳, 设置为 0 or 3 都可以正常稳定工作 }; spi_bus_device_handle_t device_handle = NULL; device_handle = spi_bus_device_create(lcd_bus_handle, &device_conf); printf( "rnLCD HX8357 - **** spi_bus_add_device addr = %p ****rn", &device_handle); assert(device_handle != NULL); dev->_dc = GPIO_DC; dev->_bl = GPIO_BL; dev->_SPIHandle = device_handle; } spi_master_init(&tft_handle, LCD_GPIO_MOSI, LCD_GPIO_MISO, LCD_GPIO_SCLK, LCD_GPIO_CS, LCD_GPIO_DC, LCD_GPIO_RESET, LCD_GPIO_BL); // ------------------------------------------------------------------------------------------------------------------------------ b. spi flash 初始化 spi_bus_device_handle_t device_handle_at = NULL; //spi_bus_device_handle_t device_handle_xpt = NULL; /* at45db161 flash and xpt2046 触摸屏 都使用这个初始化函数 */ esp_err_t bsp_generality_spi_init(void) { ESP_LOGI(TAG, "SPI_MISO=%d",SPI_MISO); ESP_LOGI(TAG, "SPI_MOSI=%d",SPI_MOSI); ESP_LOGI(TAG, "SPI_SCLK=%d",SPI_SCLK); spi_config_t bus_conf = { .miso_io_num = SPI_MISO, .mosi_io_num = SPI_MOSI, .sclk_io_num = SPI_SCLK, .quadwp = -1, .quadhd = -1, .max_transfer_sz = 8192 }; spi_bus_handle_t spi_bus_handle = NULL; spi_bus_handle = spi_bus_create(SPI_FLASH_HOST, &bus_conf); if (NULL == spi_bus_handle) { ESP_LOGE(TAG, "Failed create spi bus"); return ESP_FAIL; } // -------------------------------------------------------------------------------------------- spi_device_config_t device_conf = { .cs_io_num = NULL_SPI_CS_PIN, .clock_speed_hz = SPI_FlashFrequency, .mode = 0, // 这个设置为 2 ,工作不稳 }; device_handle_at = spi_bus_device_create(spi_bus_handle, &device_conf); // 产生 at45db161 的应用句柄 if (NULL == device_handle_at) { ESP_LOGE(TAG, "Failed create spi device device_handle_at"); return ESP_FAIL; } printf( "rndevice_handle_at - **** spi_bus_add_device addr = %p ****rn", &device_handle_at); return ESP_OK; } 5. 移植自 esp-iot-solution-master 这个里面的相关程序 |
|
相关推荐
1个回答
|
|
ESP32-S3-WROOM-1模块具有两个SPI接口,分别是SPI2和SPI3。理论上,这两个SPI接口可以同时使用。但是,在实际应用中,需要注意以下几点:
1. 确保SPI接口的引脚不冲突。在您提供的代码中,SPI2的引脚定义如下: - GPIO_LCD_MOSI: 0 (23) - GPIO_LCD_MISO: -1 (未定义) - GPIO_LCD_SCLK: 与GPIO_LCD_SCK相同 2. 对于SPI3,您需要定义相应的引脚,例如: - #define GPIO_SPI3_MOSI 2 - #define GPIO_SPI3_MISO -1 - #define GPIO_SPI3_SCLK 3 3. 在程序中,确保正确初始化和配置两个SPI接口。例如,使用不同的SPI设备句柄分别初始化SPI2和SPI3。 4. 在多任务环境下,确保SPI接口的使用不会导致资源冲突。可以使用互斥锁或其他同步机制来避免同时访问同一个SPI接口。 5. 根据ESP32-S3的数据手册,检查SPI接口的共享资源,例如DMA通道等,以确保两个SPI接口可以同时工作。 综上所述,ESP32-S3-WROOM-1模块的SPI2和SPI3接口可以同时使用,但需要注意引脚定义、初始化配置和同步机制等方面。只要遵循这些注意事项,您应该可以实现两个SPI接口的同时使用。 |
|
|
|
只有小组成员才能发言,加入小组>>
486 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
443浏览 5评论
445浏览 4评论
415浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 21:13 , Processed in 0.549639 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号