瑞萨单片机论坛
直播中

jf_07365693

未满1年用户 66经验值
擅长:嵌入式技术 控制/MCU
私信 关注
[经验]

【RA-Eco-RA2E1-48PIN-V1.0开发板试用】IIC 通信的 OLED 显示

OLED_bmp_text

【RA-Eco-RA2E1-48PIN-V1.0开发板试用】IIC 通信的 OLED 显示

简介

IIC 通信协议

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

IIC_topology.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 设备的数据传输

IIC.png

OLED 显示原理

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

OLED_group.jpg

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

0.96英寸OLED基本参数

  • 工作电压:3.3~5V(内置3.3V LDO,I2C通信接口电平是3.3V的)
  • 像素点阵规模:128x64(128列,64行,共8192颗LED)
  • 驱动IC:SSD1306

OLED 模块电路

OLED_electric_path.png

SSD1306 驱动电路

SS1306_OLED.png

详见:oled i2c , SSD1306 Datasheet .

工程建立

新建工程

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

new_project.png

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

Device_Toolchains2.png

工程配置

配置 FSP

**选择 **Stacks - New Stack - Connectivity - I2C Master (r_iic_master)

IIC_OLED_Stacks.png

配置 IIC 引脚

IIC_Pins_Config.png

配置 IIC 参数

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

IIC_config.png

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

代码完善

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

关键函数

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

//向设备写控制命令
    void OLED_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()

//向设备写数据
    void OLED_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 软件,

Image2Lcd_setting.png

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

PCtoLCD2018

**下载并运行 **PCtoLCD2018 软件,

PCtoLCD_setting.png

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

#ifndef BMP_H_
#define BMP_H_
const unsigned char 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

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

const unsigned char 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_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
​
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void IIC_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;
​
void hal_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
}

OLED_text_display.png

OLED_bmp_display.png

效果展示

​https://www.bilibili.com/video/BV1qkD5YMEUy/

Renesas logo official download

OLED_text

更多回帖

发帖
×
20
完善资料,
赚取积分