VID_20250902_182411
使用 SCI 下的 I2C 来驱动 OLED
首先配置 SCI_I2C0

参数保持默认就行

底层驱动
volatile int i2c_send_complete_flag = 0;
volatile uint16_t timeout;
void sci_i2c_master_callback(i2c_master_callback_args_t * p_args)
{
switch (p_args->event)
{
case I2C_MASTER_EVENT_TX_COMPLETE:
{
i2c_send_complete_flag = 1;
break;
}
default:
break;
}
}
void OLED_WriteCommand(uint8_t Command)
{
uint8_t send_buffer[2];
send_buffer[0] = 0x00;
send_buffer[1] = Command;
timeout = 0xffff;
fsp_err_t err = R_SCI_I2C_Write(&g_i2c0_ctrl,send_buffer,2,false);
assert(err == 0);
while(!i2c_send_complete_flag && timeout)
{
timeout--;
}
i2c_send_complete_flag = 0;
}
void OLED_WriteData(uint8_t *Data, uint8_t Count)
{
uint8_t send_buffer[1+Count];
send_buffer[0] = 0x40;
for(uint8_t i = 0;i < Count;i++)
{
send_buffer[1+i] = Data[i];
}
timeout = 0xffff;
fsp_err_t err = R_SCI_I2C_Write(&g_i2c0_ctrl,send_buffer,1 + Count,false);
assert(err == 0);
while(!i2c_send_complete_flag && timeout)
{
timeout--;
}
i2c_send_complete_flag = 0;
}
测试
void hal_entry(void)
{
assert(UART_Init() == 0);
assert(SysTick_Init() == 0);
OLED_Init();
while(1)
{
for(uint16_t x=0;x<256;x++)
{
OLED_Clear();
OLED_ShowString(x,25,"RA4M2 I2C TEST",8);
OLED_ShowString(x - 128,25,"RA4M2 I2C TEST",8);
Delay_ms(10);
OLED_Update();
}
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
|