软件部分
1 新建工程
将先前创建的串口通信实验工程文件夹复制一份,并将文件夹重命名为04_SPI_TFT
。
在e2s里面,选择菜单栏的文件--导入--常规--现有项目到工作空间中--选择根目录"浏览"--完成。
2 配置工程
2.1 设置两个驱动上拉电阻的引脚
双击e2s界面左侧的项目资源管理器
当中的configuration.xml
文件,在中间选择Ports--P2--设置P205和P206引脚的Mode如下图所示
2.2 设置SCI-I2C
在Pins--peripherals--Connectivity:SCI--SCI0,将Operation Mode设置为Simple I2C,底下引脚选择P100和P101。
2.3 新建并设置模块属性
点击Stacks,New Stack--Connectivity--I2C Master(r_sci_i2c)。点击刚生成的模块-属性,我们只需要改动下图所示的地方。
2.4 生成代码
保存配置文件,并点击Generate Project Content让其自动为我们生成代码。
3 编写代码
3.1 修改hal_entry.c
在hal_entry函数之前,加入如下代码
c
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函数开头加入以下内容:
c
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);
}