[N32L43X评测] 5.硬件SPI驱动OLED
[复制链接]
前面[N32L43X评测] 2.模拟I2C驱动OLED [N32L43X评测] 3.硬件I2C驱动OLED [N32L43X评测] 4.模拟SPI驱动OLED介绍了模拟I2C、硬件I2C、模拟SPI来驱动OLED显示屏,
此篇介绍使用N32L43x硬件SPI2轮询模式来实现驱动OLED显示屏。
硬件连接
GND —— GND
VCC —— 3.3V
DO —— PB13
DI —— PB15
RES —— PC7
DC —— PC6
CS —— PB12
软件代码
SPI2配置参考官方例程:
配置时需注意驱动OLED,SPI模式需配置为模式3,
即空闲时SCK时钟高电平 SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
采样时刻为偶数边沿采样 SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
数据传输设置为MSB最高有效位先行 SPI_InitStructure.FirstBit = SPI_FB_MSB;
如果SPI SCK时钟频率过高或过低,可设置时钟频率 SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_256;(如果时钟频率仍过高,可设置APB2总线频率RCC_ConfigPclk2(RCC_HCLK_DIV4);)
- #ifdef HW_SPI
-
- void SPI_Initial(void)
- {
- SPI_InitType SPI_InitStructure;
- GPIO_InitType GPIO_InitStructure;
-
-
- RCC_ConfigPclk2(RCC_HCLK_DIV4);
-
- RCC_EnableAPB2PeriphClk(SPI_MASTER_GPIO_CLK | RCC_APB2_PERIPH_AFIO | RCC_SPI_CS, ENABLE);
-
- RCC_EnableAPB2PeriphClk(SPI_MASTER_CLK, ENABLE);
-
- GPIO_InitStruct(&GPIO_InitStructure);
-
- GPIO_InitStruct(&GPIO_InitStructure);
- GPIO_InitStructure.Pin = PIN_SPI_CS;
- GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;
- GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
- GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitPeripheral(PORT_SPI_CS, &GPIO_InitStructure);
- SPI_CS_DISABLE;
-
-
- GPIO_InitStructure.Pin = SPI_MASTER_PIN_SCK | SPI_MASTER_PIN_MOSI;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_SPI2;
- GPIO_InitPeripheral(SPI_MASTER_GPIO, &GPIO_InitStructure);
-
- GPIO_InitStructure.Pin = SPI_MASTER_PIN_MISO;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
- GPIO_InitPeripheral(SPI_MASTER_GPIO, &GPIO_InitStructure);
-
-
- SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
- SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
- SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS;
- SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
- SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
- SPI_InitStructure.NSS = SPI_NSS_SOFT;
- SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_256;
- SPI_InitStructure.FirstBit = SPI_FB_MSB;
- SPI_InitStructure.CRCPoly = 7;
- SPI_Init(SPI_MASTER, &SPI_InitStructure);
-
-
- SPI_Enable(SPI_MASTER, ENABLE);
-
- }
- #endif
OLED代码变更部分:
-
- static void OLED_Write_CMD(unsigned char cmd)
- {
- #ifdef SW_I2C
- I2C_Start();
- I2C_Send_Byte(0x78);
- I2C_Wait_Ack();
- I2C_Send_Byte(0x00);
- I2C_Wait_Ack();
- I2C_Send_Byte(cmd);
- I2C_Wait_Ack();
- I2C_Stop();
- #endif
- #ifdef HW_I2C
- unsigned char tx_buf[BUF_SIZE] = {0x00, cmd};
- i2c_master_send(tx_buf, BUF_SIZE);
- #endif
- #ifdef SW_SPI
- OLED_CS_LOW;
- OLED_DC_LOW;
- SPI_WriteByte(cmd);
- OLED_CS_HIGH;
- #endif
- #ifdef HW_SPI
- OLED_CS_LOW;
- OLED_DC_LOW;
- while (SPI_I2S_GetStatus(SPI_MASTER, SPI_I2S_TE_FLAG) == RESET);
- SPI_I2S_TransmitData(SPI_MASTER, cmd);
- while (SPI_I2S_GetStatus(SPI_MASTER, SPI_I2S_RNE_FLAG) == RESET);
- SPI_I2S_ReceiveData(SPI_MASTER);
- OLED_CS_HIGH;
- #endif
- }
-
-
- static void OLED_Write_Date(unsigned char date)
- {
- #ifdef SW_I2C
- I2C_Start();
- I2C_Send_Byte(0x78);
- I2C_Wait_Ack();
- I2C_Send_Byte(0x40);
- I2C_Wait_Ack();
- I2C_Send_Byte(date);
- I2C_Wait_Ack();
- I2C_Stop();
- #endif
- #ifdef HW_I2C
- unsigned char tx_buf[BUF_SIZE] = {0x40, date};
- i2c_master_send(tx_buf, BUF_SIZE);
- #endif
- #ifdef SW_SPI
- OLED_CS_LOW;
- OLED_DC_HIGH;
- SPI_WriteByte(date);
- OLED_CS_HIGH;
- #endif
- #ifdef HW_SPI
- OLED_CS_LOW;
- OLED_DC_HIGH;
- while (SPI_I2S_GetStatus(SPI_MASTER, SPI_I2S_TE_FLAG) == RESET);
- SPI_I2S_TransmitData(SPI_MASTER, date);
- while (SPI_I2S_GetStatus(SPI_MASTER, SPI_I2S_RNE_FLAG) == RESET);
- SPI_I2S_ReceiveData(SPI_MASTER);
- OLED_CS_HIGH;
- #endif
- }
运行测试
播放器加载失败: 未检测到Flash Player,请到 安装
HW_SPI_OLED
测试代码
N32L43x_HW_SPI_OLED.zip
(520.48 KB, 下载次数: 10)
|