lisingch 发表于 2022-3-15 12:55

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

本帖最后由 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驱动速度要快得多,画面也更加流畅。







七毛钱 发表于 2022-3-15 15:46

现在都流行白色开发板吗

kyzhd 发表于 2022-3-16 23:37

七毛钱 发表于 2022-3-15 15:46
现在都流行白色开发板吗

不是流行,是跟风{:lol:}

liqingfeng123 发表于 2022-3-18 17:32

spi最快能达多快呢?

lisingch 发表于 2022-3-18 22:41

liqingfeng123 发表于 2022-3-18 17:32
spi最快能达多快呢?

具体的刷新率没有测试过,只是相对于I2C驱动时左移速度要快很多。
页: [1]
查看完整版本: 【AT-START-F425测评】3、SPI(OLED)