这个项目我们利用瑞萨的RA6M4的I2C控制功能实现光照传感器BH1750的光照测试,并进行屏幕显示。
为了方便进行光照强度的检测,所有的引脚我们用I2C接口进行引出来。如下图1所示

图1 I2C接口
另外,为了在调试过程的方便,我们引入串口UART9,为此需在RASC的Stack中加入I2C和UART,如下图2所示

图2 加入I2C和UART
相应的属性配置如下图3和图4所示,随后点击“Generate Project Content”以生成Keil工程。

图3 配置I2C

图4 配置UART
然后,回到KEIL中进行程序的设计。
此时,需在主程序的文件中添加以下内容:
volatile bool i2c_tx_complete = false;
volatile bool i2c_rx_complete = false;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
if(p_args->event==I2C_MASTER_EVENT_TX_COMPLETE)
{
i2c_tx_complete = true;
}
else if(p_args->event==I2C_MASTER_EVENT_RX_COMPLETE)
{
i2c_rx_complete = true;
}
}
void I2CWaitRX(void)
{
uint16_t t = 1000;
while(!i2c_rx_complete && t)
{
t--;
R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MICROSECONDS);
}
i2c_rx_complete = false;
}
void I2CWaitTX(void)
{
uint16_t t = 1000;
while(!i2c_tx_complete && t)
{
t--;
R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MICROSECONDS);
}
i2c_tx_complete = false;
}
测试光照强度检测的主程序为:
void hal_entry(void)
{
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
printf("I2C-BH1750\r\n");
R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
uint8_t cmd = 0x01;
R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
I2CWaitTX();
cmd = 0x10;
R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
I2CWaitTX();
uint8_t data[2]={0};
while(1)
{
R_SCI_I2C_Read(&g_i2c0_ctrl, &data[0], 2, false);
I2CWaitRX();
int temp=(data[0]<<8)+data[1];
double light=temp/1.2;
printf("light: %.1f lux\r\n",light);
R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);
}
}
经程序的编译和下载,其测试效果如图5所示,说明光照强度检测有效。

图5 串口测试结果
有了光照传感器测试成功的结果,接下来就可以添加OLED 屏幕的程序功能了。
由于I2C接口已被占用,可以模拟的方式来驱动OLED屏,为省去连线的麻烦,可直接利用接口J4来连接OLED屏,该接口见图6所示。

图6 J4接口
对所用引脚的配置见图7所示,并要重新生成Keil工程。

图7 引脚配置
打开新生成Keil工程,在主程序文件中加入相应的OLED屏驱动函数后,其显示的主程序为:
void hal_entry(void)
{
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
uint8_t cmd = 0x01;
R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
I2CWaitTX();
cmd = 0x10;
R_SCI_I2C_Write(&g_i2c0_ctrl, &cmd, 1, false);
I2CWaitTX();
uint8_t data[2]={0};
OLED_Initd();
OLED_Clear();
OLED_ShowString(0,0,"BH1750 ",16);
OLED_ShowString(0,2,"light= Lx",16);
while(1)
{
R_SCI_I2C_Read(&g_i2c0_ctrl, &data[0], 2, false);
I2CWaitRX();
int temp=(data[0]<<8)+data[1];
double light=temp/1.2;
OLED_ShowNum(50,2,light,4,16);
R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);
}
}
经程序的编译和下载,其测试效果如图9所示,说明显示功能正常。

图8 器件连接

图9 显示效果