|
板子是H743VIT6核心板,ST7789接在SPI1,copy的H7 TOOL的驱动与H7 TOOL的区别:
1.无电源控制引脚
2.使用IO控制,直接点亮
3.无片选引脚,默认拉低
4.使用SPI1
5.时钟配置使用CUBEMX自动生成
问题:逻辑分析仪抓到的报文都是FF,DMA发送完成回调能正常触发。
另外:H7 TOOL调用了 HAL_SPI_INIT 并没有取回调 HAL_SPI_MspInit 这个地方已经处理过了。
驱动代码如下:
- void ST7789_InitHard(void)
- {
- ST7789_ConfigGPIO();
- ST7789_initial();
- }
- static void ST7789_ConfigGPIO(void)
- {
- //完成 RS 和 RESET 两个脚的的初始化
- /* 配置GPIO */
- {
- GPIO_InitTypeDef gpio_init;
- /* 打开GPIO时钟 */
- ALL_LCD_GPIO_CLK_ENABLE();
- //LCD_SCK_1();
- gpio_init.Mode = GPIO_MODE_OUTPUT_PP; /* 设置推挽输出 */
- gpio_init.Pull = GPIO_NOPULL; /* 上下拉电阻不使能 */
- gpio_init.Speed = GPIO_SPEED_FREQ_HIGH; /* GPIO速度等级 */
- gpio_init.Pin = GPIO_PIN_5; //命令控制脚LCD_RS_PIN
- HAL_GPIO_Init(GPIOC, &gpio_init);
- gpio_init.Pin = GPIO_PIN_4;//复位引脚
- HAL_GPIO_Init(GPIOC, &gpio_init);
- }
- bsp_InitSPI1_Fast();
- }
- void bsp_InitSPI1_Fast(void)
- {
- //完成SPI的引脚配置
- GPIO_InitTypeDef GPIO_InitStruct;
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_SPI1_CLK_ENABLE();
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP; /* 上拉 GPIO_PULLUP*/
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
- GPIO_InitStruct.Pin = GPIO_PIN_5;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_7;
- GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- bsp_InitSPI1ParamFast();
- }
- void bsp_InitSPI1ParamFast(void)
- {
- hspi1.Instance = SPI1;
- hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
- hspi1.Init.Direction = SPI_DIRECTION_2LINES;
- hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
- hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
- hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
- hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
- hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
- hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
- hspi1.Init.CRCPolynomial = 7;
- hspi1.Init.CRCLength = SPI_CRC_LENGTH_8BIT;
- hspi1.Init.NSS = SPI_NSS_SOFT;
- hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
- hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; /* Recommanded setting to avoid glitches */
- hspi1.Init.Mode = SPI_MODE_MASTER;
- hspi1.Init.IOSwap = SPI_IO_SWAP_ENABLE;
- hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
- HAL_SPI_Init(&hspi1);
- __HAL_RCC_DMA1_CLK_ENABLE();
- __HAL_RCC_DMA2_CLK_ENABLE();
- hdma_tx.Instance = DMA1_Stream3;
- hdma_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
- hdma_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
- hdma_tx.Init.MemBurst = DMA_MBURST_SINGLE;
- hdma_tx.Init.PeriphBurst = DMA_PBURST_SINGLE;
- hdma_tx.Init.Request = DMA_REQUEST_SPI1_TX;
- hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
- hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE;
- hdma_tx.Init.MemInc = DMA_MINC_ENABLE;
- hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
- hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
- hdma_tx.Init.Mode = DMA_NORMAL;
- hdma_tx.Init.Priority = DMA_PRIORITY_LOW;
- HAL_DMA_Init(&hdma_tx);
- __HAL_LINKDMA(&hspi1, hdmatx, hdma_tx);
- HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 1, 1);
- HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn);
- HAL_NVIC_SetPriority(SPI1_IRQn, 1, 0);
- HAL_NVIC_EnableIRQ(SPI1_IRQn);
- }
- static void ST7789_initial(void)
- {
- rt_thread_delay(10);
- LCD_RESET_0(); /* 低电平:复位, 只需要大于10us */
-
- rt_hw_us_delay(20);/* 延迟 20us */
-
- LCD_RESET_1(); /* 高电平:复位结束 */
- //bsp_DelayUS(10 * 1000); /* 复位之后,要求等待至少5ms, 此处等待10ms */
- rt_thread_delay(10);
-
- Lcd_WriteIndex(0x36); /* 扫描方向 */
- Lcd_WriteData(0x00);
- /*省略*/
- }
- void Lcd_WriteIndex(uint8_t data1)
- {
- LCD_RS_0();
- ST7789_SendByteQuick(data1);
- }
- static void ST7789_SendByteQuick(uint8_t data)
- {
- SPI1->CFG1 = SPI_BAUDRATEPRESCALER_8 | 7; //设置单个SPI传输的数据帧的位数是8位
- SPI1->CR1 = SPI_CR1_SSI;//当 SSM 位置 1 时,此位才有效。此位的值将作用到外设 SS 输入上,并忽略 SS 引脚的 I/O 值
- SPI1->CR2 = 1;
- SPI1->CR1 = SPI_CR1_SPE | SPI_CR1_SSI;
- SPI1->CR1 = SPI_CR1_SPE | SPI_CR1_SSI | SPI_CR1_CSTART;
- while ((SPI1->SR & SPI_FLAG_TXE) == 0);
- *((__IO uint8_t *)&SPI1->TXDR) = data;
- while ((SPI1->SR & SPI_SR_TXC) == 0);
- SPI1->IFCR = SPI_IFCR_EOTC | SPI_IFCR_TXTFC;
- SPI1->CR1 &= ~(SPI_CR1_SPE);
- }
复制代码
|
|