“RA MCU众测宝典”IIC专题上线啦!这次,瑞萨嵌入式小百科将和大家一起聚焦【瑞萨RA2E1】开发板,一步步玩转IIC通信的OLED显示。从IIC协议的核心原理、FSP中I2C Master的配置,到OLED驱动函数编写、图像文字取模与显示,一起感受仅用SDA和SCL两条线,就能实现设备间数据交互与可视化的便捷魅力。
开启宝典
简介
IIC通信协议
IIC(Inter-Integrated Circuit)即集成电路总线。它是一种串行通信总线,使用多主从架构,如图所示。

点击可查看大图
飞利浦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)即有机发光二极管。

点击可查看大图
OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异特性,被认为是下一代的平面显示器新兴应用技术。
0.96英寸OLED基本参数
工作电压:3.3~5V(内置3.3V LDO,I2C通信接口电平是3.3V的);
像素点阵规模:128x64(128列,64行,共8192颗LED);
驱动IC:SSD1306。
OLED模块电路

点击可查看大图
SSD1306驱动电路

点击可查看大图
详见:oled I2c , SSD1306 Datasheet.
工程建立
新建工程
打开e² studio软件,依次点击:文件-新建-瑞萨 C/C++项目-Renesas RA

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

点击可查看大图
工程配置
配置FSP。

点击可查看大图
配置IIC引脚。

点击可查看大图
配置IIC参数。
注解
需要注意从机的地址,在STM32等程序中是0x78,这里的地址位数是7,因此需要右移一位,为0x3c。

点击可查看大图
配置完成后,点击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软件。

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

点击可查看大图
打开目标BMP格式图片,点击齿轮图标进入字模选项界面,参数设置完成后点击确定,回到主界面,点击生成字模,选择并复制生成的字模至bmp.h文件。
左右滑动查看完整内容
#ifndef BMP_H_#define BMP_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_t event);FSP_CPP_FOOTER
i2c_master_event_t i2c_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_t err = 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); }
#if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter();#endif}

点击可查看大图
效果展示
IIC专题的精彩才刚刚开始!下一期我们会继续深挖IIC通信的更多实用场景。关注瑞萨嵌入式小百科,一起解锁更多IIC通信的实战玩法,让嵌入式设备协同更高效!
瑞萨样品/开发板申请入口如下,可扫描二维码或复制链接到浏览器获得
申请入口
瑞萨样品/开发板申请入口:
https://jsj.top/f/AgUyYV

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

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
全部0条评论
快来发表一下你的评论吧 !