ST意法半导体
直播中

张英

8年用户 1443经验值
私信 关注
[问答]

如何让stm32wb nucleo与st7789 lcd一起工作?

我一直试图让 STM32wb nucleo 与 st7789 lcd 一起工作,但只观察到奇怪的行为。我已经使用此处找到的代码成功地让它与 stm32f103c8t6 一起工作。当 stm32f103 上的 CPOL=0 时,屏幕不工作,但在 stm32wb 上,当 CPOL=0 时,屏幕将启动并且可以成功向其发送命令。但是,当我尝试发送帧时,什么也没有发生。我还检查了 DC 引脚是否正常工作。我对 CPOL=0 时观察到的奇怪行为感到困惑,除此之外,这是我在使用 stm32wb 时观察到的唯一事情。
这是两个项目之间唯一更改的代码:
原始GPIOInit代码(stm32f103):
  • void st7789_GPIOInit(void) {
  •         // Enable GPIOA and SPI1 clock
  •         RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_SPI1EN;
  •         // Enable DMA1 channel
  •         //RCC->AHBENR |= RCC_AHBENR_DMA1EN;
  •         // Enable SPI
  •         ST7789_SPI->SR = 0;
  •         // Reverse polarity?
  •         ST7789_SPI->CR1 =
  •                 SPI_CR1_SSM |
  •                 SPI_CR1_SSI |
  •                 SPI_CR1_MSTR |
  •                 SPI_CR1_CPOL |
  •                 SPI_CR1_BIDIMODE |
  •                 SPI_CR1_BIDIOE;
  •         ST7789_SPI->CR1 |= SPI_CR1_SPE;
  •         // DC and RST signals
  •         // Maximum output speed
  •         ST7789_DC_PORT->CRH |= GPIO_CRH_MODE8;
  •         ST7789_RST_PORT->CRH |= GPIO_CRH_MODE9;
  •         // Output push pull
  •         ST7789_DC_PORT->CRH &= ~(GPIO_CRH_CNF8);
  •         ST7789_RST_PORT->CRH &= ~(GPIO_CRH_CNF9);
  •         // SPI pins
  •         // Maximum output speed on PA5/PA7
  •         GPIOA->CRL |= GPIO_CRL_MODE5;
  •         GPIOA->CRL |= GPIO_CRL_MODE7;
  •         // Alternate mode on PA5/PA7
  •         GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_CNF5)) | (GPIO_CRL_CNF5_1);
  •         GPIOA->CRL = (GPIOA->CRL & ~(GPIO_CRL_CNF7)) | (GPIO_CRL_CNF7_1);
  • }
移植代码(stm32wb):
  • void st7789_GPIOInit(void) {
  •         //setup the clocks
  •         RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;
  •         RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
  •         //configure PA1 and PA7 as alternate function
  •         GPIOA->MODER &= ~(GPIO_MODER_MODE1 | GPIO_MODER_MODE7);
  •         GPIOA->MODER |= (GPIO_MODER_MODE1_1 | GPIO_MODER_MODE7_1);
  •         //configure PA1 and PA7 to spi mode
  •         GPIOA->AFR[0] &= ~(GPIO_AFRL_AFSEL1) | (GPIO_AFRL_AFSEL7);
  •         GPIOA->AFR[0] |= (5U << GPIO_AFRL_AFSEL1_Pos) | (5U << GPIO_AFRL_AFSEL7_Pos);
  •         //configure data/command pin as output
  •         ST7789_DC_PORT->MODER &= ~(GPIO_MODER_MODE8);
  •         ST7789_DC_PORT->MODER |= GPIO_MODER_MODE8_0;
  •         //configure reset pin as output
  •         ST7789_RST_PORT->MODER &= ~(GPIO_MODER_MODE9);
  •         ST7789_RST_PORT->MODER |= GPIO_MODER_MODE9_0;
  •         //configure spi
  •         SPI1->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE;
  •         //SPI1->CR1 |= SPI_CR1_CPOL;
  •         SPI1->CR1 |= SPI_CR1_SPE;
  • }
其他很酷的代码:
  • void st7789_StartCommand(void) {
  •         st7789_WaitNanosecs(10); //  D/CX setup time
  •         ST7789_DC_PORT->ODR &= ~ST7789_DC_PIN;
  • }
  • void st7789_StartData(void) {
  •         st7789_WaitNanosecs(10); //  D/CX setup time
  •         ST7789_DC_PORT->ODR |= ST7789_DC_PIN;
  • }
  • void st7789_WriteSpi(uint8_t data) {
  •         for (int32_t i = 0; i<10000; i++) {
  •                 if (ST7789_SPI->SR & SPI_SR_TXE) break;
  •         }
  •         ST7789_SPI->DR = data;
  •         while (ST7789_SPI->SR & SPI_SR_BSY);
  • }
两个 MCU 的时钟频率均为 64 MHz,我尝试了不同的 SPI 波特率但没有成功。为了在调试时更加简单,这两个项目都不使用 DMA。
请告诉我是否需要提供更多信息。
谢谢你。







回帖(1)

李红

2023-1-31 17:02:29
问题是它发送了 16 个时钟周期而不是 8 个:
ST7789_SPI- >DR = 数据
应该改为:
*(__IO uint8_t *)&SPI1->DR = 数据
举报

更多回帖

发帖
×
20
完善资料,
赚取积分