0 前言
本次实验将使用板子上的I2C功能。瑞萨R7FA4E2B93CFM支持I3C和I2C,手头没有I3C的设备,但正好有一个I2C协议的光照传感器模块,型号为BH1750。
1 硬件部分
从开发板原理图中得知,I2C总线的上拉电阻由P206和P205控制,需要将P205和P206配置为高电平输出。
这次使用的BH1750模块如下图所示,其中ADDR引脚悬空代表其I2C地址为0x23,这个地址在后面软件配置中要用到。
模块在开发板上插接的位置如下图所示,注意让ADDR引脚悬空。
2 软件部分
2.1 新建工程
将先前创建的串口通信实验工程文件夹复制一份,并将文件夹重命名为04_SPI_TFT
。
在e2s里面,选择菜单栏的文件--导入--常规--现有项目到工作空间中--选择根目录"浏览"--完成。
2.2 配置工程
2.2.1 设置两个驱动上拉电阻的引脚
双击e2s界面左侧的项目资源管理器
当中的configuration.xml
文件,在中间选择Ports--P2--设置P205和P206引脚的Mode如下图所示
2.2.2 设置SCI-I2C
在Pins--peripherals--Connectivity:SCI--SCI0,将Operation Mode设置为Simple I2C,底下引脚选择P100和P101。
2.2.3 新建并设置模块属性
点击Stacks,New Stack--Connectivity--I2C Master(r_sci_i2c)。点击刚生成的模块-属性,我们只需要改动下图所示的地方。
2.2.4 生成代码
保存配置文件,并点击Generate Project Content让其自动为我们生成代码。
2.3 编写代码
2.3.1 修改hal_entry.c
在hal_entry函数之前,加入如下代码
volatile bool i2c_tx_complete = false;
volatile bool i2c_rx_complete = false;
void I2CWaitRX(void);
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);
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 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;
}
}
这段代码中I2CWaitRX
和I2CWaitTX
作为收/发等待函数,而sci_i2c_master_callback
是I2C回调函数,根据中断时调用的事件来修改标志位i2c_tx_complete
和i2c_rx_complete
。
在hal_entry函数开头加入以下内容:
Debug_UART9_Init();
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);
}
3 下载测试
将BH1750模块插在开发板上,编译项目、烧录程序。
打开电脑上的串口助手,如果一切正常的话,就能看到读取到的亮度数据了。
4 附件
*附件:04_I2C_BH1750.zip