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

描述

 

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


 

开启宝典

 

简介

 

IIC通信协议

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


 

mcu

点击可查看大图


 

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

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


 

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

只需要两条总线线路;

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

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

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


 

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


 

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


 

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


 

mcu

7-bit设备的数据传输


 

OLED显示原理


 

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


 

mcu

点击可查看大图


 

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

 

0.96英寸OLED基本参数

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

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

驱动IC:SSD1306。

 

OLED模块电路


 

mcu

点击可查看大图

 

SSD1306驱动电路


 

mcu

点击可查看大图


 

详见:oled I2c , SSD1306 Datasheet.

工程建立

 

新建工程

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


 

mcu

点击可查看大图


 

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


 

mcu

点击可查看大图

 

工程配置

配置FSP。


 

mcu

点击可查看大图


 

配置IIC引脚。


 

mcu

点击可查看大图


 

配置IIC参数。


 

注解

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


 

mcu

点击可查看大图


 

配置完成后,点击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软件。


 

mcu

点击可查看大图


 

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


 

PCtoLCD2018

下载并运行PCtoLCD2018软件。


 

mcu

点击可查看大图


 

打开目标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}


 

mcu

点击可查看大图


 

效果展示


 

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

 


 

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

申请入口

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

https://jsj.top/f/AgUyYV

mcu


 

 

需要技术支持?

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

mcu

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

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分