查看: 7090|回复: 4

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

[复制链接]
  • TA的每日心情
    开心
    2024-10-14 08:33
  • 签到天数: 2451 天

    连续签到: 1 天

    [LV.Master]伴坛终老

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

    QQ截图20170612211333.png

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

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

    结果是上图这样的,感觉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是不是空的,赶紧给加上试试。
    QQ截图20170612213139.png
    QQ截图20170612213159.png

    如下图,然而好像并没有什么用。
    QQ截图20170612213450.png

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

    终于正常了,可以正常显示了。
    QQ截图20170612213909.png
    QQ截图20170612214025.png
    QQ截图20170612214228.png
    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, 下载次数: 60)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 3935 天

    连续签到: 6 天

    [LV.Master]伴坛终老

    发表于 2017-6-13 01:12:01 | 显示全部楼层
    IO是流水处理的,先后顺序乱球的很。我用GPIO点OLED时,比你这严重多了。时钟、数据、DC乱飞,同样加延时解决。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-10-14 08:33
  • 签到天数: 2451 天

    连续签到: 1 天

    [LV.Master]伴坛终老

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

    这样啊,这个还真不是很清楚,我还以为我操作的问题。都是套路啊。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-3-29 09:22
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-6-16 21:56:10 | 显示全部楼层
    谢谢分享,我下载的文件少的内核文件总算全了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-12-6 16:13
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2018-12-6 16:30:37 | 显示全部楼层
    加延时不会影响其他信号么?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 08:08 , Processed in 0.160581 second(s), 27 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.