买了两块OLED只是为了学习协议。建议大家用这种OLED来学IIC和SPI协议。
网上资料多。我是软件模拟IIC调通了后,调的硬件协议。
驱动芯片一样,只是通讯接口不同 IIC
- //硬件接口,底层,更换单片机或引脚只需要改这两个----这个是IIC
- void OLED_WR_Byte(uint8_t dat,uint8_t isCMD)
- {
- if(isCMD == 1)
- {
- HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,0x40,I2C_MEMADD_SIZE_8BIT,&dat,1,100);
- }
- else
- {
- HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,0x00,I2C_MEMADD_SIZE_8BIT,&dat,1,100);
- }
- }
- //初始化SSD1306
- void OLED_Init(void)
- {
- // OLED_RST(0); //SPI这里打开
- // HAL_Delay(100);
- // OLED_RST(1);
SPI ,要多一根线来控制数据或命令的写入。而且RST也是需要的。引脚多,但明显刷新速度快。
- //////////////////////////////////////////////////////////////////////////////////
- //硬件接口,底层,更换单片机或引脚只需要改这两个
- void OLED_WR_Byte(u8 dat,u8 isCMD)
- {
- /* if(isCMD)
- OLED_DC(1); //是命令DC高电平
- else
- OLED_DC(0); //是命令DC高电平
- */
- isCMD? OLED_DC(1):OLED_DC(0); //是命令DC高电平
-
- HAL_SPI_Transmit(&hspi1,&dat, 1, 100);
- }
- //初始化SSD1306
- void OLED_Init(void)
- {
- OLED_RST(0);
- HAL_Delay(100);
- OLED_RST(1);
总结一下:
- IIC通过先写 0x40 0x00 来区分是命令还是数据。
- SPI 通过D/C 引脚来区分命令还是数据。
- STM32的硬件IIC是可以的,网上有反驳说它不行的文章,试了,真的可以。
- 3.3V驱动没问题,同时两块都没问题。