IIC作为一种常用的串行接口,广泛应用于传感器驱动等领域。本次项目利用IIC接口驱动一款Seeed品牌的小型OLED显示模块,该模块具备128x64像素的分辨率及0.96英寸的屏幕尺寸,属于单色显示范畴,并采用SSD1315作为驱动芯片(尽管SSD1306更常见)。OLED的发光原理与LCD截然不同,需经过初始化流程方可正常显示,此特性类似于IPS彩色液晶屏幕。SSD1315是一款集成CMOS OLED/PLED驱动控制芯片,能够从其内置的128x64像素GDDRAM中直接读取并显示数据。在硬件连接上,采用SSD1315作为控制核心的OLED显示屏存在两种配置方式:启用DC引脚与不启用DC引脚。鉴于目标模块接口限制(仅包含IIC通信的两根引脚及电源引脚),本项目采用非DC引脚方案,即通过在数据发送前预先传输界定比特的方式,实现对OLED显示屏的控制。
单色显示对于大多数单片机而言,控制上相对充裕,所需资源较少。虽然STM32WL55主攻低功耗,主频只有48M,不过对于驱动这个屏还没什么问题的。
本次设计采用硬件IIC接口,尽管个人倾向于使用IO口模拟方式控制,但硬件IIC的尝试更有意义,毕竟配置硬件IIC的时序控制更加标准,在STM32CubeMX中的配置过程极为简洁:
按照当前线序连接设备,启动IIC后,直接就可以,采用常规模式100K的速度,什么都不用配置,初始化也不用像定时器那样需要启动,我们直接用一下进行适配就OK了:
void OLED_WR_CMD(uint8_t cmd)
{
HAL_I2C_Mem_Write(&hi2c2 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);
}
void OLED_WR_DATA(uint8_t data)
{
HAL_I2C_Mem_Write(&hi2c2 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,0x100);
}
这里是接口的配置最为关键,其他就都是已经写好的驱动程序就可以了,中景园提供的官方例程对于初始化步骤具有非常好的指导意义。显示操作本身并不复杂,关键在于完成必要的初始化后,执行固定位置的显示指令。鉴于显示区域的局限性,采用英文内容展示能更有效地利用空间,同时保证显示的连贯性和可读性:
uint8_t CMD_Data[]={
0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40,0xA1, 0xC8, 0xDA,
0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6,0x8D, 0x14,
0xAF};
void OLED_Init(void)
{
HAL_Delay(200);
uint8_t i = 0;
for(i=0; i<23; i++)
{
OLED_WR_CMD(CMD_Data);
}
}
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"STM32WL55",12, 0);
请注意,初始化完成后的屏幕将呈现花屏状态,此现象表明显示功能正常。随后需执行清屏操作,将屏幕底色统一设置为单色,非黑即白。接下来进行字符串显示,具体展示内容为“ STM32WL55”,呈现效果如下:
我们展望一下,现在可以说基本的外设用这个M4核都是能完成的,当前的测试开发依然是使用的单核模式进行的,如果要进行无线开发调试就要用双核了,可是LoRa还不想蓝牙、wifi这样的比较常用,很多设备都配备,这就导致了一个尴尬的境地,只有一个板子是没法实现透传的,需要另外一个支持LoRa的板子进行透传测试,这里先留着一个悬念吧,后续我们要找一个透传板子才能进行进一步的测试,比如功率或者距离,这可能需要一段时间以后再进行了。
作者: 无言的朝圣, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-4014618.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论