4回答

1收藏

【GD32F450 试用】 A2.硬件SPI驱动OLED

GD32 GD32 8429 人阅读 | 4 人回复 | 2017-06-12

两周没更新了抱歉哈,已经收到管理大大的短信和邮件了。主要是最近确实比较忙还有刚好上周生病了,一直没缓过神来,今天抽空继续来研究研究。这次主要拿SPI来开刀,因为我的项目是需要SPI来通信的,所以想着驱动个OLED看看效果。因为有用STM32的经验所以想着应该稍微改动一下应该就没有什么问题了,没想到遇到了一个问题最后用了一个笨办法才解决,但是感觉治标不治本根本原因还是没有找到。
遇到了什么问题呢,请往下看。



如上图框选,是我的OLED发送完命令或者数据后把CS拉高。但是实际用逻辑分析仪看是下边这样的。完全看不懂CS这是什么鬼。


然后一点点调试,在main函数中发送一个0xaa命令试试。
  1. <font size="4">OLED_Write_SPI_Command(0xaa);</font>
复制代码


结果是上图这样的,感觉SPI传输和CS拉高是一块儿执行的。然后去看spi_i2s_data_transmit()函数发送就是写数据到SPI的数据寄存器。
  1. <font size="4">spi_i2s_data_transmit(SPI0, Cmd);
  2. oled_cs_set;   //disable cs</font>
复制代码

难道是还没发送完成就把CS拉高了??,,然后看到有这么一个标志位是检测发送buffer是不是空的,赶紧给加上试试。



如下图,然而好像并没有什么用。


实在没辙了,做个短延时吧,然后再把CS拉高。
  1. <font size="4">void Delay(uint32_t n)
  2. {
  3.         for (; n > 0; n--);
  4. }</font>
复制代码


终于正常了,可以正常显示了。


  1. /*!
  2.     \file  main.c
  3.     \brief led spark with systick
  4. */

  5. /*
  6.     Copyright (C) 2016 GigaDevice

  7.     2016-08-15, V1.0.0, firmware for GD32F4xx
  8. */

  9. #include "gd32f4xx.h"
  10. #include "systick.h"
  11. #include "oled.h"
  12. #include "gd32f4xx_eval.h"

  13. void rcu_config(void);
  14. void gpio_config(void);
  15. void spi_config(void);

  16. int main(void)
  17. {
  18.         gd_eval_led_init(LED1);
  19.         gd_eval_led_init(LED2);
  20.         gd_eval_led_init(LED3);
  21.   systick_config();
  22.        
  23.         /* peripheral clock enable */
  24.         rcu_config();
  25.         /* GPIO config */
  26.         gpio_config();
  27.         /* SPI config */
  28.         spi_config();
  29.         /* SPI enable */
  30.         spi_enable(SPI0);
  31.                
  32.         OLED_Init();
  33.   OLED_Clear();
  34.         delay_1ms(100);
  35.         OLED_Fill();
  36.         OLED_Clear();
  37.         while (1)
  38.         {
  39.                 OLED_ShowString(0,0,"what's wrong!!!",16);
  40. //                OLED_Write_SPI_Command(0xaa);
  41.                 delay_1ms(100);
  42.         }
  43. }

  44. void rcu_config(void)
  45. {
  46.         rcu_periph_clock_enable(RCU_GPIOA);
  47.         rcu_periph_clock_enable(RCU_GPIOB);
  48.         rcu_periph_clock_enable(RCU_SPI0);
  49. }

  50. void gpio_config(void)
  51. {
  52.     /* SPI0 GPIO config */
  53. //                SPI0 SCK  PIN(PA5)        SPI1 SCK  PIN(PB13).
  54. //                SPI0 MISO PIN(PA6)        SPI1 MISO PIN(PB14).
  55. //                SPI0 MOSI PIN(PA7)        SPI1 MOSI PIN(PB15).
  56.     gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
  57.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
  58.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
  59.        
  60.                 /* GPIO config */
  61.                 gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
  62.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
  63.                 gpio_bit_set(GPIOB,GPIO_PIN_10);
  64.                 gpio_bit_set(GPIOB,GPIO_PIN_14);
  65.                 gpio_bit_set(GPIOB,GPIO_PIN_15);
  66. }

  67. void spi_config(void)
  68. {
  69.     spi_parameter_struct  spi_init_struct;

  70.     /* SPI0 parameter config */
  71.     spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
  72.     spi_init_struct.device_mode          = SPI_MASTER;;
  73.     spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;;
  74.     spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
  75.     spi_init_struct.nss                  = SPI_NSS_SOFT;
  76.     spi_init_struct.prescale             = SPI_PSC_16 ;
  77.     spi_init_struct.endian               = SPI_ENDIAN_MSB;;
  78.     spi_init(SPI0, &spi_init_struct);
  79. }
复制代码
感觉这个问题的根本原因还是没有找到,不过这程序在STM32上运行是一点儿问题没有的。不知道是掉到了什么坑里边去了,有朋友遇到这样的问题吗,欢迎交流。不过总算是可以显示了,可能玩GD32时间太短有些地方还不是很了解,继续努力吧。

工程:
demo.zip (7.68 MB, 下载次数: 62)



关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 4 个

倒序浏览

沙发

toofree

发表于 2017-6-13 01:12:01 | 只看该作者

IO是流水处理的,先后顺序乱球的很。我用GPIO点OLED时,比你这严重多了。时钟、数据、DC乱飞,同样加延时解决。
板凳

limale

发表于 2017-6-13 10:13:10 | 只看该作者

toofree 发表于 2017-6-13 01:12
IO是流水处理的,先后顺序乱球的很。我用GPIO点OLED时,比你这严重多了。时钟、数据、DC乱飞,同样加延时解 ...

这样啊,这个还真不是很清楚,我还以为我操作的问题。都是套路啊。
地板

lcr12

发表于 2017-6-16 21:56:10 | 只看该作者

谢谢分享,我下载的文件少的内核文件总算全了
5#

qazxsw2345

发表于 2018-12-6 16:30:37 | 只看该作者

加延时不会影响其他信号么?
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条