lugl4313820 发表于 2022-5-7 09:44

【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&mdash;&mdash;硬件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(&amp;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, &amp;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&lt;8;i++)
        {                          
                LCD_SCLK_Clr();
                if(dat&amp;0x80)
                {
                   LCD_MOSI_Set();
                }
                else
                {
                   LCD_MOSI_Clr();
                }
                LCD_SCLK_Set();
                dat&lt;&lt;=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>

lising 发表于 2022-6-5 23:03

<p>static void SPI_WriteData(uint8_t Data)<br />
{</p>

<p>&nbsp; &nbsp; while(RESET == spi_i2s_flag_get(SPI0,SPI_FLAG_TBE));//等待发送缓存为空<br />
&nbsp;&nbsp; &nbsp;spi_i2s_data_transmit(SPI0, Data);&nbsp;<br />
&nbsp;&nbsp; &nbsp;while(SET == spi_i2s_flag_get(SPI0, SPI_FLAG_TRANS));//等待数据发送完毕。SPI通信进行中标志位(TRANS)</p>

<p>}<br />
试试这样处理一下就可以不加延时了</p>

lugl4313820 发表于 2022-6-6 05:54

lising 发表于 2022-6-5 23:03
static void SPI_WriteData(uint8_t Data)
{

&nbsp; &nbsp; while(RESET == spi_i2s_flag_get(SPI0,SPI ...

<p>好的,非常感谢!抽空试试,因为这个问题,GD32F103跟CH32V307都没有搞定。</p>

varx 发表于 2023-3-18 00:47

lugl4313820 发表于 2022-6-6 05:54
好的,非常感谢!抽空试试,因为这个问题,GD32F103跟CH32V307都没有搞定。

<p>你好 你搞定CH32V307 点亮st7735s的屏了吗&nbsp; 我也是死活不显示</p>

lugl4313820 发表于 2023-3-18 08:42

varx 发表于 2023-3-18 00:47
你好 你搞定CH32V307 点亮st7735s的屏了吗&nbsp; 我也是死活不显示

<p>那个搞定了好久了的,我应该发了帖子吧。</p>
页: [1]
查看完整版本: 【GD32F310G-START】硬件SPI驱动ST7735