IIC (Inter-Integrated Circuit) 即集成电路总线。它是一种串行通信总线,使用多主从架构,如图所示。
飞利浦 Philips 公司于二十世纪八十年代初设计,最初是为了让主板、嵌入式系统或手机用以连接低速周边设备。
自2006年10月1日起,使用 IIC 协议不需要支付专利费,但制造商仍然需要付费以获取 IIC 从属设备地址。
IIC 通信协议的功能特点如下
IIC 使用两根线进行通信:一根时钟线 SCL,一根数据线 SDA。
IIC将SCL处于高时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号;
传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。
7-bit 设备的数据传输
OLED (Organic Electroluminescence Display) 即有机发光二极管。
OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异特性,被认为是下一代的平面显示器新兴应用技术。
详见:oled i2c , SSD1306 Datasheet .
**打开 e² studio 软件,依次点击 **文件
- 新建
- 瑞萨 C/C++ 项目
- Renesas RA
**依次进行工程命名,路径设置,FSP版本,目标开发板选择,芯片型号选择 **R7FA2E1A72DFL
,工具链选择 GNU ARM Embedded
**选择 **Stacks
- New Stack
- Connectivity
- I2C Master (r_iic_master)
配置 IIC 引脚
**需要注意从机的地址,在 STM32 等程序中是 **0x78
,这里的地址位数是7,因此需要右移一位,为 0x3c
,
**配置完成后,点击 **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 软件,
打开目标图片,设置宽度为 128 像素,高度为 64 像素(若图片不规则,需先进行裁剪处理),输出数据类型可选择 BMP 图片,或直接生成 C 语言数组文件。
**下载并运行 **PCtoLCD2018 软件,
**打开目标 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
}
https://www.bilibili.com/video/BV1qkD5YMEUy/
更多回帖