RA MCU众测宝典 | IIC之【RA2E1】IIC通信的OLED显示

晟盈英才 2026-01-04 68人围观

RA MCU众测宝典IIC专题上线啦!这次,瑞萨嵌入式小百科将和大家一起聚焦【瑞萨RA2E1】开发板,一步步玩转IIC通信OLED显示。从IIC协议的核心原理、FSP中I2C Master的配置,到OLED驱动函数编写、图像文字取模与显示,一起感受仅用SDA和SCL两条线,就能实现设备间数据交互与可视化的便捷魅力。

开启宝典

简介

IIC通信协议

IIC(Inter-Integrated Circuit)即集成电路总线。它是一种串行通信总线,使用多主从架构,如图所示。

32b67148-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

飞利浦Philips公司于二十世纪八十年代初设计,最初是为了让主板、嵌入式系统手机用以连接低速周边设备。

自2006年10月1日起,使用IIC协议不需要支付专利费,但制造商仍然需要付费以获取IIC从属设备地址。

IIC通信协议的功能特点如下:

只需要两条总线线路;

没有严格的波特率要求,例如使用RS232,主站生成总线时钟;

所有组件之间存在简单的主/从关系连接到总线的每个设备都可通过唯一地址进行软件寻址;

IIC是真正的多主总线,提供仲裁和冲突检测。

IIC使用两根线进行通信:一根时钟线SCL,一根数据线SDA。

IIC将SCL处于高时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号;

传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。

7-bit设备的数据传输

OLED显示原理

OLED(Organic Electroluminescence Display)即有机发光二极管

32e50a76-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异特性,被认为是下一代的平面显示器新兴应用技术。

0.96英寸OLED基本参数

工作电压:3.3~5V(内置3.3V LDO,I2C通信接口电平是3.3V的);

像素点阵规模:128x64(128列,64行,共8192颗LED);

驱动IC:SSD1306。

OLED模块电路

点击可查看大图

SSD1306驱动电路

3331ee04-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

详见:oled I2c , SSD1306 Datasheet.

工程建立

新建工程

打开e² studio软件,依次点击:文件-新建-瑞萨 C/C++项目-Renesas RA

335cbe4a-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

依次进行工程命名,路径设置,FSP版本,目标开发板选择,芯片型号选择:R7FA2E1A72DFL,工具链选择GNU ARM Embedded

336ad246-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

工程配置

配置FSP。

33823f9e-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

配置IIC引脚。

3393705c-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

配置IIC参数。

注解

需要注意从机的地址,在STM32等程序中是0x78,这里的地址位数是7,因此需要右移一位,为0x3c。

33a18f66-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

配置完成后,点击Generate Project Content生成工程,主要代码位于src文件夹。

代码完善

这里首先介绍部分重要函数的构成。

关键函数

向设备写控制命令:OLED_WR_CMD()

左右滑动查看完整内容

//向设备写控制命令 voidOLED_WR_CMD(uint8_t cmd){ uint8_t ii[2]={0x00,0x00};

ii[1]=cmd; err =R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii,0x02,true); assert(FSP_SUCCESS== err); /* Since there is nothing else to do, block until Callback triggers*/ //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms) while((I2C_MASTER_EVENT_TX_COMPLETE!= i2c_event) && timeout_ms>0) { R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MICROSECONDS); timeout_ms--; } if(I2C_MASTER_EVENT_ABORTED== i2c_event) { __BKPT(0); } /* Read data back from the I2C slave */ i2c_event =I2C_MASTER_EVENT_ABORTED; timeout_ms =100; }

向设备写数据:OLED_WR_DATA()

左右滑动查看完整内容

//向设备写数据 voidOLED_WR_DATA(uint8_t data){ uint8_t ii[2]={0x40,0x00};

ii[1]=data; err =R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii,0x02,true); assert(FSP_SUCCESS== err); /* Since there is nothing else to do, block until Callback triggers*/ while((I2C_MASTER_EVENT_TX_COMPLETE!= i2c_event) && timeout_ms>0) { R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MICROSECONDS); timeout_ms--; } if(I2C_MASTER_EVENT_ABORTED== i2c_event) { __BKPT(0); } /* Read data back from the I2C slave */ i2c_event =I2C_MASTER_EVENT_ABORTED; timeout_ms =100; }

需要向:src文件夹添加4个文件,其中oled.c是函数驱动文件,oled.h是头文件,oledfont.h为文字字模文件,bmp.h为图片字模文件。

图像取模

步骤:

1.图像预处理,将其尺寸裁剪为宽高比2:1,推荐使用:FastStone Image Viewer软件;

2.使用Image2Lcd软件生成BMP格式;

3.使用PCtoLCD软件生成字模。

Image2Lcd

下载并运行Image2Lcd软件。

33bfce90-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

打开目标图片,设置宽度为128像素,高度为64像素(若图片不规则,需先进行裁剪处理),输出数据类型可选择BMP图片,或直接生成C语言数组文件。

PCtoLCD2018

下载并运行PCtoLCD2018软件。

33cfcdae-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

打开目标BMP格式图片,点击齿轮图标进入字模选项界面,参数设置完成后点击确定,回到主界面,点击生成字模,选择并复制生成的字模至bmp.h文件。

左右滑动查看完整内容

#ifndefBMP_H_#defineBMP_H_constunsignedchar BMP1[] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};#endif

文字取模采用类似方案,字模放置代码如下。

左右滑动查看完整内容

constunsignedchar Hzk[][32]={{0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00},{0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00},/*"年",0*/{0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00},{0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00},/*"月",1*/{0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00},/*"日",2*/};#endif/* OLEDFONT_H_ */

代码。

左右滑动查看完整内容

#include"hal_data.h"#include"oled.h"#include"bmp.h"

FSP_CPP_HEADERvoidR_BSP_WarmStart(bsp_warm_start_event_tevent);FSP_CPP_FOOTER

i2c_master_event_ti2c_event = I2C_MASTER_EVENT_ABORTED;voidIIC_master_callback(i2c_master_callback_args_t*p_args){ i2c_event = I2C_MASTER_EVENT_ABORTED; if(NULL!= p_args) { /* capture callback event for validating the i2c transfer event*/ i2c_event = p_args->event; }}fsp_err_terr = FSP_SUCCESS;int timeout_ms =100;

voidhal_entry(void){ /*TODO:add your own code here */ /* IIC initicalized*/ err =R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg); assert(FSP_SUCCESS == err); WriteCmd();// initialized while(1){ /*---------- Picture ------------*/ OLED_Clear();// clear screen OLED_DrawBMP(0,0,128,8,BMP1); R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); /*----------- Text ------------*/ OLED_Clear();// clear screen OLED_ShowString(0,0,"RA",16); OLED_ShowCHinese(16,0,0);//生 OLED_ShowCHinese(32,0,1);//态 OLED_ShowCHinese(48,0,2);//工 OLED_ShowCHinese(64,0,3);//作 OLED_ShowCHinese(80,0,4);//室 OLED_ShowString(0,2,"2024.11.06",16); OLED_ShowString(0,4,"Renesas RA2E1",16); R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); }

#ifBSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter();#endif}

33e31abc-e6b6-11f0-8ce9-92fbcf53809c.png

点击可查看大图

效果展示

IIC专题的精彩才刚刚开始!下一期我们会继续深挖IIC通信的更多实用场景。关注瑞萨嵌入式小百科,一起解锁更多IIC通信的实战玩法,让嵌入式设备协同更高效!

瑞萨样品/开发板申请入口如下,可扫描二维码或复制链接到浏览器获得

申请入口

瑞萨样品/开发板申请入口:

https://jsj.top/f/AgUyYV

34044c32-e6b6-11f0-8ce9-92fbcf53809c.png

需要技术支持?

如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。

34199d62-e6b6-11f0-8ce9-92fbcf53809c.png

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/

不容错过
Powered By Z-BlogPHP