本帖最后由 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)
|