本帖最后由 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, 下载次数: 19)
|