注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
lugl4313820的个人空间 http://home.eeworld.com.cn/space-uid-1269709.html [收藏] [复制] [分享] [RSS]
日志

【GD32F310G-START】硬件SPI驱动ST7735

已有 78 次阅读2022-5-7 09:44

【GD32F310G-START】HELLO WORLD - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)

【GD32F310G-START】OLED之HELLO EEWORLD——硬件I2C - GD32 MCU - 电子工程世界-论坛

【新提醒】【GD32F310G-START】SPI驱动ST7735 - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)

调好模拟SPI驱动st7735后,花点时间驱动硬件spi。改动的地方就是加上spi的驱动:

1、GPIO 、SPI初始化

#define SOFTWARE_SPI_ENABLE 0  //条件编译:0为硬件SPI 1为模拟SPI

void LCD_GPIO_Init(void)
{
  spi_parameter_struct spi_init_struct;
	rcu_periph_clock_enable(RCU_GPIOA);
   rcu_periph_clock_enable(RCU_SPI0);
#if SOFTWARE_SPI_ENABLE		//如果是模拟
	gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |  GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_4);
  gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |  GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_4);
  gpio_bit_set(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |  GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_4);
  

#else  //如果是硬件
  gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 );
  gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 );
  gpio_bit_set(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 );
	/* SPI0 GPIO configuration: NSS/PA4 */
	  gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4 );
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
	
	/* configure SPI0 GPIO: SCK/PA5, MISO/PA6, MOSI/PA7 */
    gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
	
    

	  rcu_periph_clock_enable(RCU_SPI0);
    
    /* deinitilize SPI and the parameters */
    spi_i2s_deinit(SPI0);
    spi_struct_para_init(&spi_init_struct);

    /* configure SPI0 parameter */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_1EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_2;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);

	spi_enable(SPI0);
#endif

} 

2、数据发送的修改:


/******************************************************************************
      函数说明:LCD串行数据写入函数
      入口数据:dat  要写入的串行数据
      返回值:  无
******************************************************************************/
void LCD_Writ_Bus(uint8_t dat) 
{	
	uint8_t i;
	LCD_CS_Clr();
#if SOFTWARE_SPI_ENABLE	
	for(i=0;i<8;i++)
	{			  
		LCD_SCLK_Clr();
		if(dat&0x80)
		{
		   LCD_MOSI_Set();
		}
		else
		{
		   LCD_MOSI_Clr();
		}
		LCD_SCLK_Set();
		dat<<=1;
	}	
#else
 // while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
  spi_i2s_data_transmit(SPI0,dat);
  while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
  delay_1us(1);  //【特别注意这里要加上1微秒的延时,要不死活不显示】
  
#endif
  
  LCD_CS_Set();	
}

最后与模拟对比了一下,感觉速度没有什么驱别。是不是还有哪里没有弄对。大佬、前辈们指点一下。

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册