1 准备
(1)0.96寸OLED屏幕 128x64分辨率 控制IC为SSD1306 I2C通信协议,如下图所示

(2)将上一次实验创建的模板工程复制一份,重命名为01_I2C_OLED
2 E2S 配置I2C


修改从机地址为0X3C以及中断优先级

3 软件部分
3.1 编写I2C回调及等待函数
在src目录下新建文件夹i2c,并继续新建i2c.c和i2c.h
i2c.c代码
#include "hal_data.h"
#include "i2c.h"
volatile bool i2c_rx_complete = false;
volatile bool i2c_tx_complete = false;
uint16_t timeout = 0;
void iic_callback(i2c_master_callback_args_t *p_args)
{
if (p_args->event == I2C_MASTER_EVENT_RX_COMPLETE)
{
i2c_rx_complete = true;
}
else if (p_args->event == I2C_MASTER_EVENT_TX_COMPLETE)
{
i2c_tx_complete = true;
}
}
void i2c_wait_tx()
{
timeout = 1000;
while (!i2c_tx_complete && timeout > 0)
{
timeout--;
}
i2c_tx_complete = false;
}
void i2c_wait_rx()
{
timeout = 1000;
while (!i2c_rx_complete && timeout > 0)
{
timeout--;
}
i2c_rx_complete = false;
}
i2c.h代码
#ifndef I2C_H_
#define I2C_H_
extern volatile bool i2c_rx_complete;
extern volatile bool i2c_tx_complete;
void i2c_wait_rx();
void i2c_wait_tx();
#endif
3.2 编写oled屏幕驱动代码
在src目录下新建文件夹oled,并继续新建oled.c、oled.h和oled_font.h文件
oled.c代码
oled.h代码
#ifndef OLED_H_
#define OLED_H_
#include "hal_data.h"
#define OLED_CMD 0
#define OLED_DATA 1
void OLED_ClearPoint(uint8_t x, uint8_t y);
void OLED_ColorTurn(uint8_t i);
void OLED_DisplayTurn(uint8_t i);
void OLED_WR_Byte(uint8_t dat, uint8_t mode);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(uint8_t x, uint8_t y, uint8_t t);
void OLED_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t mode);
void OLED_DrawCircle(uint8_t x, uint8_t y, uint8_t r);
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t size1);
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *chr, uint8_t size1);
void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size1);
void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t num, uint8_t size1);
void OLED_ScrollDisplay(uint8_t num, uint8_t space);
void OLED_ShowPicture(uint8_t x, uint8_t y, uint8_t sizex, uint8_t sizey, uint8_t BMP[], uint8_t mode);
void OLED_Init(void);
#endif
oled_font.h代码太长了,放不下,请见工程附件
3.3 hal_entry.c
在头文件部分新增一行
#include "oled/oled.h"
hal_entry函数如下
void hal_entry(void)
{
UART_Init();
R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
OLED_Init();
printf("Hello RA4M2-SENSOR开发板!\r\n");
while(1){
OLED_ShowString(24, 0, "hello world", 16);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
4 成果展示
烧录程序,连接好OLED屏幕,查看效果。屏幕显示"hello world"
