前言本次实验将使用板子上的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(); // SCI9 UART 调试串口初始化
printf("I2C-BH1750光照传感器实验\r\n");
R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
uint8_t cmd = 0x01; //启动BH1750命令
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]; //2个字节合成数据
double light=temp/1.2;//计算光照度
printf("light: %.1f lux\r\n",light);
R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);
} 3 下载测试将BH1750模块插在开发板上,编译项目、烧录程序。 打开电脑上的串口助手,如果一切正常的话,就能看到读取到的亮度数据了。
4 附件
|