本代码基于官方文件RA4M2_100PIN_example\RA4M2OLED中的代码。
首先将文件复制到我们的文件夹中,然后在RASC中重新生产项目,就会将文件自动添加到keil中。


由于手边有的OLED是12832分辨率,官方示例用的12864。所以需要做略微修改,CMD_Data需要填入我们的初始化参数。

由于我们的行数少一半,只有4行。例程中的代码有8行,所以我们需要将代码中的很多行数8改为4。

然后我们回到rasc中配置oled的任务,以及添加sci_iic的配置。重新生成代码。

在thread文件中添加
R_SCI_I2C_Open
OLED_Init
OLED_Clear
OLED_DrawBMP(0,0, 128,4, picture_tab);
在这里直接用代码中原始的picture_tab也是可以显示的,只会显示画面的上半部分。所以我们对这组数据修改一下
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,
0xE1,0xE1,0xFF,0x7F,0x3F,0x1F,0x1E,0x00,0x00,0xF0,0xF8,0xF8,0xFC,0x8C,0x8C,0x8C,
0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x04,0x00,0x00,0x00,0xFC,0xFC,0x1C,0x3C,0xF8,0xF8,
0xE0,0xC0,0x80,0x00,0x00,0x00,0xFC,0xFC,0x00,0x00,0x00,0xF0,0xF8,0xF8,0xFC,0x8C,
0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x04,0x00,0x00,0x30,0x78,0xFC,0xFC,0xFC,
0xCC,0xCC,0xCC,0x8C,0x8C,0x8C,0x0C,0x0C,0x04,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,
0xF8,0x7C,0x3C,0x1C,0x7C,0xFC,0xF8,0xE0,0xC0,0x00,0x00,0x00,0x30,0x78,0xFC,0xFC,
0xFC,0xCC,0xCC,0xCC,0x8C,0x8C,0x8C,0x0C,0x0C,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00,0x03,
0x07,0x0F,0x0F,0x1E,0x38,0x30,0x60,0x60,0xC0,0x8F,0x1F,0x1F,0x3F,0x38,0x30,0x30,
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x01,
0x03,0x07,0x0F,0x1F,0x3E,0x3C,0x3F,0x3F,0x00,0x00,0x00,0x07,0x1F,0x1F,0x3F,0x38,
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x20,0x30,0x30,0x30,0x30,
0x31,0x31,0x31,0x33,0x33,0x3F,0x3F,0x1F,0x1E,0x0C,0x20,0x38,0x3C,0x3F,0x1F,0x07,
0x01,0x00,0x30,0x30,0x30,0x31,0x33,0x3F,0x3F,0x3F,0x3C,0x38,0x30,0x30,0x30,0x30,
0x30,0x31,0x31,0x31,0x33,0x33,0x3F,0x3F,0x1F,0x1E,0x0E,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,0x01,0x01,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,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,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF
画面实际效果:

遇到问题:
按说此时应该吃鸡大吉,但是却出现了不知名的司机……

这里的路口司机翻车。加上log,先屏蔽掉。
嘿嘿一切似乎由工作正常了。老司机又上路了。
可是看到log中总是有err……十分难受
每次复位后第一个发送的cmd总是报错,之后的没有问题。
由于用的模组只有4个脚没有复位reset。
所以试了下单片机复位时把OLED断一下电。嘿嘿竟然没有err了
似乎主设备与从设备通信的第一次没有对上暗号。

按说这里的iic应该已经回复over。然后各回各家各找各妈,把线路都让出来上拉到1。但是似乎经常会出现scl为0,有点摸不着头脑。
由于没有示波器,不确定是ack信号异常还是scl异常。
只能试着打开sci_iic之前拉一下iic的信号线
const ioport_pin_cfg_t g_bsp_iic_cfg_data[] = {
{
.pin = BSP_IO_PORT_01_PIN_12,
.pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_HIGH)
},
{
.pin = BSP_IO_PORT_01_PIN_12,
.pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_MID | (uint32_t) IOPORT_CFG_NMOS_ENABLE | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)
},
};
R_IOPORT_PinCfg(&IOPORT_CFG_CTRL, g_bsp_iic_cfg_data[0].pin, g_bsp_iic_cfg_data[0].pin_cfg);
R_IOPORT_PinWrite(&g_ioport_ctrl, SDA_SCI2, BSP_IO_LEVEL_LOW);
vTaskDelay(10);
R_IOPORT_PinCfg(&IOPORT_CFG_CTRL, g_bsp_iic_cfg_data[1].pin, g_bsp_iic_cfg_data[1].pin_cfg);
验证能从小路走通。暂且就这样处理了,有机会看信号再去判断是主设备还是从设备问题,深入研究根源了。如果有专家了解是哪里的问题还请不吝赐教,万分感谢。