TA的每日心情 | 开心 2024-10-14 08:33 |
---|
签到天数: 2451 天 连续签到: 1 天 [LV.Master]伴坛终老
|
两周没更新了抱歉哈,已经收到管理大大的短信和邮件了。主要是最近确实比较忙还有刚好上周生病了,一直没缓过神来,今天抽空继续来研究研究。这次主要拿SPI来开刀,因为我的项目是需要SPI来通信的,所以想着驱动个OLED看看效果。因为有用STM32的经验所以想着应该稍微改动一下应该就没有什么问题了,没想到遇到了一个问题最后用了一个笨办法才解决,但是感觉治标不治本根本原因还是没有找到。
遇到了什么问题呢,请往下看。
如上图框选,是我的OLED发送完命令或者数据后把CS拉高。但是实际用逻辑分析仪看是下边这样的。完全看不懂CS这是什么鬼。
然后一点点调试,在main函数中发送一个0xaa命令试试。
- <font size="4">OLED_Write_SPI_Command(0xaa);</font>
复制代码
结果是上图这样的,感觉SPI传输和CS拉高是一块儿执行的。然后去看spi_i2s_data_transmit()函数发送就是写数据到SPI的数据寄存器。- <font size="4">spi_i2s_data_transmit(SPI0, Cmd);
- oled_cs_set; //disable cs</font>
复制代码
难道是还没发送完成就把CS拉高了??,,然后看到有这么一个标志位是检测发送buffer是不是空的,赶紧给加上试试。
如下图,然而好像并没有什么用。
实在没辙了,做个短延时吧,然后再把CS拉高。
- <font size="4">void Delay(uint32_t n)
- {
- for (; n > 0; n--);
- }</font>
复制代码
终于正常了,可以正常显示了。
- /*!
- \file main.c
- \brief led spark with systick
- */
- /*
- Copyright (C) 2016 GigaDevice
- 2016-08-15, V1.0.0, firmware for GD32F4xx
- */
- #include "gd32f4xx.h"
- #include "systick.h"
- #include "oled.h"
- #include "gd32f4xx_eval.h"
- void rcu_config(void);
- void gpio_config(void);
- void spi_config(void);
- int main(void)
- {
- gd_eval_led_init(LED1);
- gd_eval_led_init(LED2);
- gd_eval_led_init(LED3);
- systick_config();
-
- /* peripheral clock enable */
- rcu_config();
- /* GPIO config */
- gpio_config();
- /* SPI config */
- spi_config();
- /* SPI enable */
- spi_enable(SPI0);
-
- OLED_Init();
- OLED_Clear();
- delay_1ms(100);
- OLED_Fill();
- OLED_Clear();
- while (1)
- {
- OLED_ShowString(0,0,"what's wrong!!!",16);
- // OLED_Write_SPI_Command(0xaa);
- delay_1ms(100);
- }
- }
- void rcu_config(void)
- {
- rcu_periph_clock_enable(RCU_GPIOA);
- rcu_periph_clock_enable(RCU_GPIOB);
- rcu_periph_clock_enable(RCU_SPI0);
- }
- void gpio_config(void)
- {
- /* SPI0 GPIO config */
- // SPI0 SCK PIN(PA5) SPI1 SCK PIN(PB13).
- // SPI0 MISO PIN(PA6) SPI1 MISO PIN(PB14).
- // SPI0 MOSI PIN(PA7) SPI1 MOSI PIN(PB15).
- gpio_af_set(GPIOA, GPIO_AF_5, 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);
-
- /* GPIO config */
- gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
- gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
- gpio_bit_set(GPIOB,GPIO_PIN_10);
- gpio_bit_set(GPIOB,GPIO_PIN_14);
- gpio_bit_set(GPIOB,GPIO_PIN_15);
- }
- void spi_config(void)
- {
- spi_parameter_struct spi_init_struct;
- /* SPI0 parameter config */
- 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_LOW_PH_1EDGE;
- spi_init_struct.nss = SPI_NSS_SOFT;
- spi_init_struct.prescale = SPI_PSC_16 ;
- spi_init_struct.endian = SPI_ENDIAN_MSB;;
- spi_init(SPI0, &spi_init_struct);
- }
复制代码 感觉这个问题的根本原因还是没有找到,不过这程序在STM32上运行是一点儿问题没有的。不知道是掉到了什么坑里边去了,有朋友遇到这样的问题吗,欢迎交流。不过总算是可以显示了,可能玩GD32时间太短有些地方还不是很了解,继续努力吧。
工程:
demo.zip
(7.68 MB, 下载次数: 60)
|
|