Skip to content

软件部分

1 新建工程

将先前创建的串口通信实验工程文件夹复制一份,并将文件夹重命名为04_SPI_TFT

在e2s里面,选择菜单栏的文件--导入--常规--现有项目到工作空间中--选择根目录"浏览"--完成。

2 配置工程

2.1 设置两个驱动上拉电阻的引脚

双击e2s界面左侧的项目资源管理器当中的configuration.xml文件,在中间选择Ports--P2--设置P205和P206引脚的Mode如下图所示

alt text

2.2 设置SCI-I2C

在Pins--peripherals--Connectivity:SCI--SCI0,将Operation Mode设置为Simple I2C,底下引脚选择P100和P101。

alt text

2.3 新建并设置模块属性

点击Stacks,New Stack--Connectivity--I2C Master(r_sci_i2c)。点击刚生成的模块-属性,我们只需要改动下图所示的地方。

alt text

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;
    }
}

这段代码中I2CWaitRXI2CWaitTX作为收/发等待函数,而sci_i2c_master_callback是I2C回调函数,根据中断时调用的事件来修改标志位i2c_tx_completei2c_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);
}