【GD32F310G-START】硬件SPI驱动ST7735
<p><a href="https://bbs.eeworld.com.cn/thread-1201841-1-1.html">【GD32F310G-START】HELLO WORLD - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)</a></p><p><a href="https://bbs.eeworld.com.cn/thread-1201927-1-1.html">【GD32F310G-START】OLED之HELLO EEWORLD——硬件I2C - GD32 MCU - 电子工程世界-论坛</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1202153-1-1.html">【新提醒】【GD32F310G-START】SPI驱动ST7735 - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)</a></p>
<p>调好模拟SPI驱动st7735后,花点时间驱动硬件spi。改动的地方就是加上spi的驱动:</p>
<p>1、GPIO 、SPI初始化</p>
<pre>
<code>#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
} </code></pre>
<p>2、数据发送的修改:</p>
<pre>
<code>
/******************************************************************************
函数说明: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();
}
</code></pre>
<p>最后与模拟对比了一下,感觉速度没有什么驱别。是不是还有哪里没有弄对。大佬、前辈们指点一下。</p>
<p></p>
<p>static void SPI_WriteData(uint8_t Data)<br />
{</p>
<p> while(RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE));//等待发送缓存为空<br />
spi_i2s_data_transmit(SPI0, Data); <br />
while(SET == spi_i2s_flag_get(SPI0, SPI_FLAG_TRANS));//等待数据发送完毕。SPI通信进行中标志位(TRANS)</p>
<p>}<br />
试试这样处理一下就可以不加延时了</p>
lising 发表于 2022-6-5 23:03
static void SPI_WriteData(uint8_t Data)
{
while(RESET == spi_i2s_flag_get(SPI0,SPI ...
<p>好的,非常感谢!抽空试试,因为这个问题,GD32F103跟CH32V307都没有搞定。</p>
lugl4313820 发表于 2022-6-6 05:54
好的,非常感谢!抽空试试,因为这个问题,GD32F103跟CH32V307都没有搞定。
<p>你好 你搞定CH32V307 点亮st7735s的屏了吗 我也是死活不显示</p>
varx 发表于 2023-3-18 00:47
你好 你搞定CH32V307 点亮st7735s的屏了吗 我也是死活不显示
<p>那个搞定了好久了的,我应该发了帖子吧。</p>
页:
[1]