打印
[开发资料]

CW32L031 移植OLED驱动

[复制链接]
2069|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2023-9-25 20:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

OLED为常用的外设,主要用于显示功能,常用接口为I2C、SPI。而I2C只需要2线就可以实现,更为常见。I2C可以用软件模拟I2C以及硬件的I2C驱动。软件I2C可以灵活选择GPIO来实现,在不同的单片机中移方便,但是速度相比硬件i2c慢,占用资源多。而硬件I2C速度快,占用资源小,但是硬件I2C需要指的IO,而且在有些单片机硬件i2c的兼容性不是很好,移植性差。
IO的选取,这次移植为硬件i2c驱动OLED屏。开饭盒派的开发板上面有I2C的插座,接的IO为SCK-PB6,SDA-PB7。

I2C的初始化
void OLED_I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
I2C_InitTypeDef I2C_InitStruct = {0};
CW_SYSCTRL->AHBEN_f.GPIOB  = 1;  //打开GPIOB的时钟
CW_SYSCTRL->APBEN1_f.I2C1 = 1U;    //打开I2c1的时钟
//端口复用
PB06_AFx_I2C1SCL();
PB07_AFx_I2C1SDA();
//配置IO输出
GPIO_InitStructure.Pins = I2C1_SCL_GPIO_PIN | I2C1_SDA_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_Init(I2C1_SCL_GPIO_PORT, &GPIO_InitStructure);
//配置I2C1
I2C_InitStruct.I2C_Baud = 0x1; // 48000 000/(8*(1+11) = 500k
I2C_InitStruct.I2C_BaudEn = ENABLE;
  I2C_InitStruct.I2C_FLT = DISABLE;
  I2C_InitStruct.I2C_AA =  DISABLE;
I2C1_DeInit();
  I2C_Master_Init(CW_I2C1,&I2C_InitStruct);//初始化I2C为主机模式
I2C_Cmd(CW_OLED_I2C, ENABLE);
}
发送一个byte的函数:
//向OLED寄存器地址写一个byte的数据
int I2C_WriteByte(uint8_t addr,uint8_t data)
{
uint8_t u8i = 0, u8State;
  uint16_t timeout = 0xffff;
I2C_GenerateSTART(CW_OLED_I2C, ENABLE);
//获取状态
while(1)
{
while((0 == I2C_GetIrq(CW_OLED_I2C)) && timeout--);
if(timeout == 0) return 1;
u8State = I2C_GetState(CW_OLED_I2C);
switch(u8State)
{
case 0x08:  //发送完START信号
I2C_GenerateSTART(CW_OLED_I2C, DISABLE);
I2C_Send7bitAddress(CW_OLED_I2C, OLED_ADDR, 0x00);
break;
case 0x18:  //发送完SLA+W信号,ACK已收到
I2C_SendData(CW_OLED_I2C, addr);
break;
case 0x28:
I2C_SendData(CW_OLED_I2C, data);
u8i ++;
break;
case 0x20: //发送完SLA+W后从机返回NACK
break;
case 0x38: //主机在发送 SLA+W 阶段或者发送数据阶段丢失仲载  或者  主机在发送 SLA+R 阶段或者回应 NACK 阶段丢失仲裁
I2C_GenerateSTART(CW_OLED_I2C, ENABLE);
        break;
case 0x30:
I2C_GenerateSTOP(CW_OLED_I2C, ENABLE);
break;
default:
break;
}
if(u8i>1)
{
I2C_GenerateSTOP(CW_OLED_I2C, ENABLE);
I2C_ClearIrq(CW_OLED_I2C);
break;
}
I2C_ClearIrq(CW_OLED_I2C);
}
return 0;
}
函数中主要编程思想为轮询查询I2C的状态寄存器,根据不同的状态来确定下一个状态。
在写好发送一个byte的函数上,根据OLED的数据手册,定义好发送数据与命令函数如下:
//写指令
void WriteCmd(unsigned char I2C_Command)
{
I2C_WriteByte(0x00,I2C_Command);
}
//写数据
void WriteData(unsigned char I2C_Data)
{
I2C_WriteByte(0x40,I2C_Data);
}
至此,最基本的代码已经移植完毕代码与字库我附在后面。
在主函数里面调用OLED的初始化,然后清屏,显示效果如下:

oled.zip (6.04 KB)

使用特权

评论回复
沙发
sesefadou| | 2023-10-5 13:15 | 只看该作者
可能需要配置CW32L031的系统时钟以满足驱动的时序要求。

使用特权

评论回复
评论
lulugl 2023-10-5 19:29 回复TA
采用硬件I2c,对时钟主频没有要求。但对数所传输有一定的影响。 
板凳
wilhelmina2| | 2023-10-5 13:37 | 只看该作者
OLED显示器的刷新率通常由MCU的系统时钟决定。

使用特权

评论回复
地板
benjaminka| | 2023-10-5 13:48 | 只看该作者
在移植OLED驱动时,还需要考虑功耗问题。

使用特权

评论回复
5
burgessmaggie| | 2023-10-5 14:00 | 只看该作者
OLED显示屏的数据手册和通信协议,编写适当的程序代码。可能需要配置OLED显示屏的寄存器、设置显示模式等。

使用特权

评论回复
6
pmp| | 2023-10-6 20:56 | 只看该作者
可以使用CW32L031的低功耗模式来降低功耗,或者在不需要显示时关闭OLED屏幕等。

使用特权

评论回复
7
hilahope| | 2023-10-6 21:04 | 只看该作者
配置OLED驱动程序中的引脚定义,包括CS、DC、SCK、MOSI等。

使用特权

评论回复
8
wangdezhi| | 2023-10-6 21:20 | 只看该作者
需要考虑OLED显示屏的闪烁问题,可以通过调整OLED显示屏的刷新率来避免闪烁现象。

使用特权

评论回复
9
xiaoyaodz| | 2023-10-6 21:50 | 只看该作者
OLED显示屏和微控制器的时钟频率要求,配置微控制器的时钟分频或时钟源

使用特权

评论回复
10
51xlf| | 2023-10-6 22:01 | 只看该作者
建议仔细阅读OLED模块和CW32L031的相关文档,并参考相关的示例代码和驱动库。

使用特权

评论回复
11
qiufengsd| | 2023-10-6 22:22 | 只看该作者
OLED显示器通常需要专用的驱动程序来控制其显示内容。

使用特权

评论回复
12
backlugin| | 2023-10-6 22:38 | 只看该作者
如果OLED显示屏需要显示大量图像或文本,需要考虑内存管理。

使用特权

评论回复
评论
lulugl 2023-10-7 09:06 回复TA
现在还不知道如何用字库。 
13
wwppd| | 2023-10-8 12:34 | 只看该作者
可以根据CW32L031的硬件架构和外设接口,寻找与之兼容的OLED驱动库。确保使用的驱动库提供了CW32L031所需的功能和API接口。

使用特权

评论回复
14
jonas222| | 2023-10-8 12:42 | 只看该作者
在使用OLED显示器时,需要确保有足够的内存空间来建立显示缓冲区。

使用特权

评论回复
15
timfordlare| | 2023-10-8 12:50 | 只看该作者
OLED驱动通常需要一个稳定的时钟信号来驱动OLED显示屏,而CW32L031芯片也具有自己的时钟系统。因此需要确保OLED驱动与CW32L031芯片的时钟频率兼容,否则可能会导致OLED显示屏无法正常工作。

使用特权

评论回复
16
iyoum| | 2023-10-8 12:57 | 只看该作者
CW32L031是一款低功耗、高性能的微控制器,其内部集成了ARM Cortex-M3内核、16KB Flash、4KB SRAM等丰富的资源。

使用特权

评论回复
17
robincotton| | 2023-10-8 13:09 | 只看该作者
在移植 OLED 驱动时,需要关注功耗优化。

使用特权

评论回复
18
mikewalpole| | 2023-10-8 13:29 | 只看该作者
根据OLED驱动库的API文档,了解和使用正确的函数和方法来初始化和控制OLED显示屏

使用特权

评论回复
19
jimmhu| | 2023-10-8 13:41 | 只看该作者
编写OLED驱动程序,包括初始化、清屏、设置显示区域、写入像素数据等。

使用特权

评论回复
20
sanfuzi| | 2023-10-8 13:48 | 只看该作者
OLED驱动通常需要连接到多个引脚,如数据线、地址线、时钟线等。需要确保OLED驱动的引脚与CW32L031芯片的引脚配置正确,否则可能会导致OLED显示屏无法正常工作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

713

帖子

9

粉丝