瑞萨单片机论坛
直播中

meiyaolei

12年用户 412经验值
擅长:控制/MCU
私信 关注
[经验]

【RA4M2设计挑战赛】IIC+OLED

开发平台:MDK5和rasc
开发板RA4M2
芯片:R7FA4M2AD3CFP

RA4开发板上刚好有一个IIC接口其实可以直接接上OLED屏,可惜我的屏电源和地脚刚好相反,不能直接接在上面。
下面我来IIC来驱动OLED屏显示。

功能如下:

  • IIC驱动在RASC上配置;
  • OLED驱动程序编写;
  • 驱动OLED字符。

硬件连接:
image.png
框图:

image.png

配置:
image.png
配置属性

image.pngimage.png

核心代码,代码抄的。
显示字条:
OLED_ShowString(12, 0, (const uint8_t*)"R7FA4M2AD3CFP", 16, 1);
OLED_ShowString(24, 25, (const uint8_t*)"--IIC OLED--", 16, 1);
OLED_ShowString(54, 45, (const uint8_t*)"--YAO--", 16, 1);

IIC回调内家:
i2c_event = I2C_MASTER_EVENT_ABORTED;

if (NULL != p_args)
{
    /* capture callback event for validating the i2c transfer event*/
    i2c_event = p_args->event;
}

IIC初始:
err = R_SCI_I2C_Open(&g_sci3_i2c_ctrl, &g_sci3_i2c_cfg);
assert(FSP_SUCCESS == err);

OLED初始:
OLED_WrCmd(0xAE); //关闭显示
OLED_WrCmd(0xD5); //设置时钟分频因子,震荡频率
OLED_WrCmd(80); //[3:0],分频因子;[7:4],震荡频率
OLED_WrCmd(0xA8); //设置驱动路数
OLED_WrCmd(0X3F); //默认0X3F(1/64)
OLED_WrCmd(0xD3); //设置显示偏移
OLED_WrCmd(0X00); //默认为0

OLED_WrCmd(0x40); //设置显示开始行 [5:0],行数.

OLED_WrCmd(0x8D); //电荷泵设置
OLED_WrCmd(0x14); //bit2,开启/关闭
OLED_WrCmd(0x20); //设置内存地址模式
OLED_WrCmd(0x02); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
OLED_WrCmd(0xA1); //段重定义设置,bit0:0,0->0;1,0->127;
OLED_WrCmd(0xC0); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
OLED_WrCmd(0xDA); //设置COM硬件引脚配置
OLED_WrCmd(0x12); //[5:4]配置

OLED_WrCmd(0x81); //对比度设置
OLED_WrCmd(0xEF); //1~255;默认0X7F (亮度设置,越大越亮)
OLED_WrCmd(0xD9); //设置预充电周期
OLED_WrCmd(0xf1); //[3:0],PHASE 1;[7:4],PHASE 2;
OLED_WrCmd(0xDB); //设置VCOMH 电压倍率
OLED_WrCmd(0x30); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

OLED_WrCmd(0xA4); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
OLED_WrCmd(0xA6); //设置显示方式;bit0:1,反相显示;0,正常显示
OLED_WrCmd(0xAF); //开启显示

OLED_Clear();

写:
fsp_err_t err;
uint32_t timeout_ms = 100;
uint8_t i2c_transmitter[2]={0x40, IIC_Data};

err = R_SCI_I2C_Write(&g_sci3_i2c_ctrl, i2c_transmitter, 0x02, true);
    assert(FSP_SUCCESS == err);
    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;

显示效果:
f78c6b70b8ed0ad1e35dfd2e85c582a.jpg

更多回帖

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