[活动专区] 【AT-START-F425测评】3、SPI(OLED)

[复制链接]
1601|4
 楼主| lisingch 发表于 2022-3-15 12:55 | 显示全部楼层 |阅读模式
本帖最后由 lisingch 于 2022-3-15 20:14 编辑

      本次实验使用使用SPI1接口驱动1.3寸单色OLED。

一、知识准备
      AT32F425R8T7T片上集成了三组SPI(I2S)接口,支持主、从模式;在全双工及半双工状态下最高速率可达36Mbit/s,可配置成8位或16位数据格式。
2022-03-15_104621.bmp
2022-03-15_104721.bmp
2022-03-15_104810.bmp
2022-03-15_104837.bmp

本次实验只是驱动OLED,SPI做为发送器。
2022-03-15_105128.bmp

二、程序实现
      程序依然使用官方例程进行修改,OLED驱动还是移植于“中景园”,程序中包含有软件模拟SPI及硬件SPI。 2022-03-15_110328.bmp
  1. static void spi_config(void)
  2. {
  3. #ifdef SPI_HARDWARE
  4.         gpio_init_type gpio_init_struct;
  5.         spi_init_type spi_init_struct;

  6.         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  7.         crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);

  8.         gpio_default_para_init(&gpio_init_struct);
  9.         spi_default_para_init(&spi_init_struct);
  10.             
  11. //        gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);
  12. //  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);
  13.         // SPI1 SCK(PA5)
  14.   gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  15.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  16.   gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;
  17.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  18.   gpio_init_struct.gpio_pins = GPIO_PINS_5;
  19.   gpio_init(GPIOA, &gpio_init_struct);

  20.   // SPI1 MOSI(PA7)
  21.   gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  22.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  23.   gpio_init_struct.gpio_pins = GPIO_PINS_7;
  24.   gpio_init(GPIOA, &gpio_init_struct);
  25.         
  26.         // CS(PA2)\DC(PA4)\RST(PA6)
  27.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  28.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  29.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  30.   gpio_init_struct.gpio_pins = OLED_PORT_IS;
  31.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  32.   gpio_init(GPIOA, &gpio_init_struct);
  33.   
  34.   spi_init_struct.transmission_mode = SPI_TRANSMIT_HALF_DUPLEX_TX;
  35.   spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  36.   spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8;
  37.   spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  38.   spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  39.   spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;//;
  40.   spi_init_struct.clock_phase = SPI_CLOCK_PHASE_1EDGE;
  41.   spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  42.   spi_init(SPI1, &spi_init_struct);

  43.   spi_enable(SPI1, TRUE);
  44.         
  45. #else
  46.   gpio_init_type gpio_init_struct;

  47.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

  48.   gpio_default_para_init(&gpio_init_struct);


  49.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  50.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  51.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  52.   gpio_init_struct.gpio_pins = OLED_PORT_IS;
  53.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  54.   gpio_init(GPIOA, &gpio_init_struct);
  55.         
  56. #endif
  57. }
  1. static void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
  2. {                          
  3.         uint8_t i;        
  4.         
  5.         if(cmd)                OLED_DC_Set();
  6.         else                        OLED_DC_Clr();
  7.          
  8.         OLED_CS_Clr();
  9.         
  10. #ifdef SPI_HARDWARE
  11.         while(spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET);//等待发送缓存为空
  12.         spi_i2s_data_transmit(SPI1, dat);
  13.         while(spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET);//等待数据发送完毕。
  14. #else
  15.         for(i=0; i<8; i++)
  16.         {
  17.                 OLED_SCL_Clr();
  18.                 if(dat & 0x80)
  19.                    OLED_SDA_Set();
  20.                 else
  21.                    OLED_SDA_Clr();
  22.                 OLED_SCL_Set();
  23.                 dat <<= 1;   
  24.         }
  25.         OLED_CS_Set();
  26.         OLED_DC_Set();
  27. #endif        
  28.             
  29. }


三、实验结果
      使用的OLED模块与上次I2C实验所用了OLED模块使用了同种规格的屏,做成了两种不同的接口。实验中可以明显感觉到,SPI驱动比I2C驱动速度要快得多,画面也更加流畅。
微信图片_20220315102957.jpg
微信图片_20220315103004.jpg

OLED_SPI.rar (311.06 KB, 下载次数: 19)



七毛钱 发表于 2022-3-15 15:46 来自手机 | 显示全部楼层
现在都流行白色开发板吗
kyzhd 发表于 2022-3-16 23:37 | 显示全部楼层
七毛钱 发表于 2022-3-15 15:46
现在都流行白色开发板吗

不是流行,是跟风
liqingfeng123 发表于 2022-3-18 17:32 | 显示全部楼层
spi最快能达多快呢?
 楼主| lisingch 发表于 2022-3-18 22:41 | 显示全部楼层
liqingfeng123 发表于 2022-3-18 17:32
spi最快能达多快呢?

具体的刷新率没有测试过,只是相对于I2C驱动时左移速度要快很多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15005

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部