[N32L43X评测] 4.模拟SPI驱动OLED
[复制链接]
前两篇[N32L43X评测] 2.模拟I2C驱动OLED [N32L43X评测] 3.硬件I2C驱动OLED介绍了I2C总线驱动OLED显示屏,此篇介绍SPI串行总线驱动OLED显示屏。
SPI是一种高速、全双工、同步串行总线,SPI与I2C对比:
SPI是全双工,I2C是半双工
SPI只能有一个主机,I2C支持多主机多从机
I2C占用更少的GPIO,更节省资源
SPI的数据位宽更灵活,可以根据需要选择多位数数据宽度
SPI协议没有响应机制,主机无法得知从机是否接收到所发的数据,需采用一些方法来防止数据丢帧
SPI协议可以做到非常高的速率,每一个SCLK都可以进行数据的传输,通过引入CRC等校验方法,可以即高速传输数据,又能保持数据的准确度
I2C通过器件地址来选择从机,从机数量的增加不会导致GPIO的增加,而SPI通过CS片选信号选择从机,每增加一个从机就要多占用一个GPIO;也可以通过加入译码器来实现多从机控制
SPI、I2C都应用于板内器件短距离通讯
SPI总线详解可参考:
SPI Block Guide V04.01.pdf
(428.89 KB, 下载次数: 1)
此篇主要介绍GPIO软件模拟实现SPI来驱动0.96寸OLED显示屏
硬件连接
GND —— GND
VCC —— 3.3V
DO —— PB13
DI —— PB15
RES —— PC7
DC —— PC6
CS —— PB12
软件代码
SPI代码:
-
- void SPI_Initial(void)
- {
- GPIO_InitType GPIO_InitStructure;
-
-
- RCC_EnableAPB2PeriphClk( RCC_SPI_CS | RCC_SPI_SCK | RCC_SPI_MOSI | RCC_SPI_MISO, ENABLE);
-
-
- 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);
-
- GPIO_InitStruct(&GPIO_InitStructure);
- GPIO_InitStructure.Pin = PIN_SPI_SCK;
- 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_SCK, &GPIO_InitStructure);
-
- GPIO_InitStruct(&GPIO_InitStructure);
- GPIO_InitStructure.Pin = PIN_SPI_MISO;
- 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_Input;
- GPIO_InitPeripheral(PORT_SPI_MISO, &GPIO_InitStructure);
-
- GPIO_InitStruct(&GPIO_InitStructure);
- GPIO_InitStructure.Pin = PIN_SPI_MOSI;
- 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_MOSI, &GPIO_InitStructure);
-
- SPI_CS_DISABLE;
- SPI_SCK_HIGH;
- SPI_MOSI_HIGH;
-
- }
-
-
-
- void SPI_WriteByte(unsigned char TxData)
- {
- unsigned char cnt;
-
- for(cnt = 0; cnt < 8; cnt++)
- {
- SPI_SCK_LOW;
- Delay_Us(1);
-
- if(TxData & 0x80)
- SPI_MOSI_HIGH;
- else
- SPI_MOSI_LOW;
-
- TxData <<= 1;
-
- Delay_Us(1);
- SPI_SCK_HIGH;
- Delay_Us(1);
- }
- }
-
-
-
- unsigned char SPI_ReadByte(void)
- {
- unsigned char cnt;
- unsigned char RxData = 0;
-
- for(cnt = 0; cnt < 8; cnt++)
- {
- SPI_SCK_LOW;
- Delay_Us(1);
-
- RxData <<= 1;
-
- if(SPI_MISO_READ)
- {
- RxData |= 0x01;
- }
-
- SPI_SCK_HIGH;
- Delay_Us(1);
- }
-
- return RxData;
- }
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
- }
-
-
- 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
- }
-
-
- void OLED_Init(void)
- {
- #ifdef SW_I2C
- I2C_Initial();
- #endif
- #ifdef SW_SPI
- SPI_Initial();
- OLED_SPI_GPIO_Init();
- #endif
- Delay_Ms(200);
- OLED_Write_CMD(0xAE);
- OLED_Write_CMD(0x00);
- OLED_Write_CMD(0x10);
- OLED_Write_CMD(0x40);
- OLED_Write_CMD(0xB0);
- OLED_Write_CMD(0x81);
- OLED_Write_CMD(0xFF);
- OLED_Write_CMD(0xA1);
- OLED_Write_CMD(0xA6);
- OLED_Write_CMD(0xA8);
- OLED_Write_CMD(0x3F);
- OLED_Write_CMD(0xC8);
- OLED_Write_CMD(0xD3);
- OLED_Write_CMD(0x00);
- OLED_Write_CMD(0xD5);
- OLED_Write_CMD(0x80);
- OLED_Write_CMD(0xD8);
- OLED_Write_CMD(0x05);
- OLED_Write_CMD(0xD9);
- OLED_Write_CMD(0xF1);
- OLED_Write_CMD(0xDA);
- OLED_Write_CMD(0x12);
- OLED_Write_CMD(0xDB);
- OLED_Write_CMD(0x30);
- OLED_Write_CMD(0x8D);
- OLED_Write_CMD(0x14);
- OLED_Write_CMD(0xAF);
- }
运行测试
播放器加载失败: 未检测到Flash Player,请到 安装
SW_SPI_OLED
测试代码
N32L43x_SW_SPI_OLED.zip
(518.73 KB, 下载次数: 6)
|