以前都是用0.96寸的OLED屏,太小,入手一个1.3寸的SPIOLED屏,今天用模拟SPI驱动了,现在分享如下:
1、拷贝厂家提供的stm32f103的例程到工程中:
image.png
2、LCD屏的驱动,如果用模拟SPI那就需要用到SCK、MOSI这两个IO,还有就DC用来表示是数据还是命令,还有RST在屏初始化是需要拉低几百毫秒然后高电平。CS的话如果是单独享用这个SPI通道,那也可不用初始化,直接把屏的CS接地就行了。我这里先定义好这几个驱动的IO,用宏定义如下:
  1. //-----------------测试LED端口定义----------------

  2. #define OLED_PORT   GPIOA
  3. #define OLED_SCL_PIN  GPIO_Pin_5
  4. #define OLED_SDA_PIN  GPIO_Pin_7
  5. #define OLED_RES_PIN  GPIO_Pin_2
  6. #define OLED_DC_PIN   GPIO_Pin_3
  7. #define OLED_CS_PIN   GPIO_Pin_4
3、然后定义高低电平的宏定义,我这里直接用寄存器进行操作,代码如下:
#define OLED_SCL_Clr()   OLED_PORT->BRR = OLED_SCL_PIN  //SCL
#define OLED_SCL_Set()   OLED_PORT->BSRR = OLED_SCL_PIN   

#define OLED_SDA_Clr() OLED_PORT->BRR = OLED_SDA_PIN  //SDA
#define OLED_SDA_Set() OLED_PORT->BSRR = OLED_SDA_PIN

#define OLED_RES_Clr() OLED_PORT->BRR = OLED_RES_PIN  //RES
#define OLED_RES_Set() OLED_PORT->BSRR = OLED_RES_PIN

#define OLED_DC_Clr()  OLED_PORT->BRR = OLED_DC_PIN  //DC
#define OLED_DC_Set()  OLED_PORT->BSRR = OLED_DC_PIN

#define OLED_CS_Clr()  OLED_PORT->BRR = OLED_CS_PIN   //CS
#define OLED_CS_Set()  OLED_PORT->BSRR = OLED_CS_PIN
4、对使用的端口进行初始化,我直接把这几个IO配置为高速输模式,代码如下:

  1. GPIO_InitTypeDef  GPIO_InitStruct;

  2.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  3.                 GPIO_Init(OLED_PORT, &GPIO_InitStruct);
  4.           GPIO_InitStruct.GPIO_Pin       = OLED_SCL_PIN | OLED_SDA_PIN | OLED_RES_PIN | OLED_DC_PIN | OLED_CS_PIN ;
  5.                 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  6.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;

  7.     GPIO_Init(OLED_PORT, &GPIO_InitStruct);

5、修改发送一个字节的函数如下:
  1. void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
  2. {       
  3.         uint8_t i;                          
  4.         if(cmd)
  5.           OLED_DC_Set();
  6.         else
  7.           OLED_DC_Clr();
  8.         OLED_CS_Clr();
  9. for(i=0;i<8;i++)
  10.         {
  11.                 OLED_SCL_Clr();

  12.                 if(dat&0x80)
  13.                    OLED_SDA_Set();
  14.                 else
  15.                    OLED_SDA_Clr();
  16.                 delay_us();
  17.                 OLED_SCL_Set();
  18.                 delay_us();
  19.                 dat<<=1;  

  20.         }

  21.         OLED_CS_Set();
  22.         OLED_DC_Set();             
  23. }
这样就完成了对驱动的移植
最后在主程 序里添回测试代码:
  1. int main(void)
  2. {
  3.     PLATFORM_Init();
  4. OLED_Init();
  5.                 OLED_ColorTurn(0);//0正常显示,1 反色显示
  6.                 OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
  7.                 OLED_ShowPicture(0,0,128,64,BMP1,1);
  8.                 OLED_Refresh();
  9.     while (1)
  10.     {
  11.     }
  12. }
效果如下:
image.png
【提示】
昨天我用官方的驱动进行了移植,结果一直跑不起来,今天找到原因,因为没有添回合适的延时,导至SCK时钟太快与屏不匹配。今天才调整好,我的100M的逻辑分析仪都 没有抓出对的时序,这是因为本MCU时钟为180M,没有去研究时钟,所以不会配置GPIO的时钟分频,哪位懂的大佬带带我。