打印
[活动专区]

【AT-START-F425测评】3、SPI(OLED)

[复制链接]
1244|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lisingch 于 2022-3-15 20:14 编辑

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

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





本次实验只是驱动OLED,SPI做为发送器。


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

        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
        crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);

        gpio_default_para_init(&gpio_init_struct);
        spi_default_para_init(&spi_init_struct);
            
//        gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);
//  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);
        // SPI1 SCK(PA5)
  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_pins = GPIO_PINS_5;
  gpio_init(GPIOA, &gpio_init_struct);

  // SPI1 MOSI(PA7)
  gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_pins = GPIO_PINS_7;
  gpio_init(GPIOA, &gpio_init_struct);
        
        // CS(PA2)\DC(PA4)\RST(PA6)
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  gpio_init_struct.gpio_pins = OLED_PORT_IS;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);
  
  spi_init_struct.transmission_mode = SPI_TRANSMIT_HALF_DUPLEX_TX;
  spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8;
  spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;//;
  spi_init_struct.clock_phase = SPI_CLOCK_PHASE_1EDGE;
  spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  spi_init(SPI1, &spi_init_struct);

  spi_enable(SPI1, TRUE);
        
#else
  gpio_init_type gpio_init_struct;

  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

  gpio_default_para_init(&gpio_init_struct);


  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  gpio_init_struct.gpio_pins = OLED_PORT_IS;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);
        
#endif
}
static void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{                          
        uint8_t i;        
        
        if(cmd)                OLED_DC_Set();
        else                        OLED_DC_Clr();
         
        OLED_CS_Clr();
        
#ifdef SPI_HARDWARE
        while(spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET);//等待发送缓存为空
        spi_i2s_data_transmit(SPI1, dat);
        while(spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET);//等待数据发送完毕。
#else
        for(i=0; i<8; i++)
        {
                OLED_SCL_Clr();
                if(dat & 0x80)
                   OLED_SDA_Set();
                else
                   OLED_SDA_Clr();
                OLED_SCL_Set();
                dat <<= 1;   
        }
        OLED_CS_Set();
        OLED_DC_Set();
#endif        
            
}


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



OLED_SPI.rar (311.06 KB)



使用特权

评论回复
沙发
七毛钱| | 2022-3-15 15:46 | 只看该作者
现在都流行白色开发板吗

使用特权

评论回复
板凳
kyzhd| | 2022-3-16 23:37 | 只看该作者
七毛钱 发表于 2022-3-15 15:46
现在都流行白色开发板吗

不是流行,是跟风

使用特权

评论回复
地板
liqingfeng123| | 2022-3-18 17:32 | 只看该作者
spi最快能达多快呢?

使用特权

评论回复
5
lisingch|  楼主 | 2022-3-18 22:41 | 只看该作者
liqingfeng123 发表于 2022-3-18 17:32
spi最快能达多快呢?

具体的刷新率没有测试过,只是相对于I2C驱动时左移速度要快很多。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

14990

帖子

17

粉丝