打印
[国产单片机]

【东软载波ES32F369x开发板】硬件I2C测试

[复制链接]
664|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
    本次测试的是I2C外设,测试使用了ROHM的传感器,光照度传感器RPR-0521RS,气压传感器BM1383AGLV,地磁传感器BM1422AGMV。这几个传感器都是I2C接口,可以一起接I2C测试。
如图:使用arduino接口插在开发板。I2C使用的是I2C0,对应管脚为PB8:SCL,PB9:SDA。





这几个传感器前面都用过,直接拿以前的代码过来用,只是把I2C接口的初始化对应上,再就是I2C的读写函数。

开始粗心了,初始化没有把I2C0的时钟使能,就一直I2C没反应。后面加上就好了,测试很顺利。

void i2c_gpio_init( void )
{
#ifdef I2C_USE_GPIO

       
#else
        gpio_init_t a;

        /* Initialize scl pin */
        a.mode = GPIO_MODE_OUTPUT;
        a.odos = GPIO_OPEN_DRAIN;
        a.pupd = GPIO_PUSH_UP;
        a.nodrv = GPIO_OUT_DRIVE_6;
        a.podrv = GPIO_OUT_DRIVE_6;
        a.flt  = GPIO_FILTER_DISABLE;
        a.type = GPIO_TYPE_TTL;
        a.func = GPIO_FUNC_5;
        ald_gpio_init(I2C_SCL_Port, I2C_SCL_PIN, &a);

        /* Initialize sda pin */
        a.mode = GPIO_MODE_OUTPUT;
        a.odos = GPIO_OPEN_DRAIN;
        a.pupd = GPIO_PUSH_UP;
        a.nodrv = GPIO_OUT_DRIVE_6;
        a.podrv = GPIO_OUT_DRIVE_6;
        a.flt  = GPIO_FILTER_DISABLE;
        a.type = GPIO_TYPE_TTL;
        a.func = GPIO_FUNC_5;
        ald_gpio_init(I2C_SDA_Port, I2C_SDA_PIN, &a);

        /* Initialize I2C struct */
        memset(&h_i2c, 0, sizeof(h_i2c));
       
        /* Enable i2c interrupt */
//        ald_mcu_irq_config(I2C1_EV_IRQn, 3, 3, ENABLE);
//        ald_mcu_irq_config(I2C1_ERR_IRQn, 3, 3, ENABLE);

        /* Initialize I2C */
        h_i2c.perh = I2C0;
        h_i2c.init.clk_speed = 100000;
        h_i2c.init.module    = I2C_MODULE_MASTER;
        h_i2c.init.dual_addr = I2C_DUALADDR_ENABLE;
        h_i2c.init.own_addr1 = 0xA0;
        h_i2c.init.addr_mode = I2C_ADDR_7BIT;
        h_i2c.init.general_call = I2C_GENERALCALL_ENABLE;
        h_i2c.init.no_stretch = I2C_NOSTRETCH_ENABLE;

        ald_i2c_reset(&h_i2c);
        ald_i2c_init(&h_i2c);
#endif
}

int main()
{
        uint32_t         ms,ledms;
        uint32_t         key_val,key_old,key_xor;
        uint8_t         utbuff[6];
       
        float press; float temp;
        uint16_t ps; float als;       
       
        /* Initialize ALD */
        ald_cmu_init();
        /* Configure system clock */
        ald_cmu_pll1_config(CMU_PLL1_INPUT_HOSC_3, CMU_PLL1_OUTPUT_96M);
        ald_cmu_clock_config(CMU_CLOCK_PLL1, 96000000);
        /* Enable peripheral clock */
        ald_cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE);
        ald_cmu_perh_clock_config(CMU_PERH_UART0, ENABLE);
        ald_cmu_perh_clock_config(CMU_PERH_I2C0, ENABLE);
       
        uart_stdio_init();
        memset(uart_buf, 0x0, 64);

        light_init();
        key_init();
        lcd_gpio_init();
        i2c_gpio_init();
       

        printf_e("System start...\n");
        light_ctrl(LIGHT_IDX_2, LIGHT_CTRL_ON);
        ald_delay_ms(1000);
        light_ctrl(LIGHT_IDX_2, LIGHT_CTRL_OFF);
        ald_delay_ms(1000);
       
        if(BM1422AGMV_Init() == 0)
        {
                printf_e("BM1422AGMV_Init OK\r\n");
        }
        if(BM1383AGLV_Init() == 0)
        {
                printf_e("BM1383AGLV_Init OK\r\n");
        }
        if(RPR0521RS_Init() == 0)
        {
                printf_e("RPR0521RS_Init OK\r\n");
        }
       
        ms = ald_get_tick()+10;
        ledms = ald_get_tick()+1000;
        key_old = 0;
        while (1)
        {
                //按键扫描
                if(ms < ald_get_tick())
                {
                        ms = ald_get_tick()+10;
                       
                        key_val = 0;
                        if(ald_gpio_read_pin(KEY_UP_PORT, KEY_UP_PIN) == 0)                        key_val |= 0x01;
                        if(ald_gpio_read_pin(KEY_DOWN_PORT, KEY_DOWN_PIN) == 0)                key_val |= 0x02;
                        if(ald_gpio_read_pin(KEY_LEFT_PORT, KEY_LEFT_PIN) == 0)                key_val |= 0x04;
                        if(ald_gpio_read_pin(KEY_RIGHT_PORT, KEY_RIGHT_PIN) == 0)        key_val |= 0x08;
                        if(ald_gpio_read_pin(KEY_CENTER_PORT, KEY_CENTER_PIN) == 0)        key_val |= 0x10;
                       
                        key_xor = key_old ^ key_val;
                        if(key_xor & 0x01)
                        {
                                if(key_val &0x01)
                                {
                                        printf_e("key up press +\n");
                                }else
                                {
                                        printf_e("key up relese-\n");
                                }
                        }
                       
                        if(key_xor & 0x02)
                        {
                                if(key_val &0x02)
                                {
                                        printf_e("key down press +\n");
                                }else
                                {
                                        printf_e("key down relese-\n");
                                }
                        }
                        if(key_xor & 0x04)
                        {
                                if(key_val &0x04)
                                {
                                        printf_e("key left press +\n");
                                }else
                                {
                                        printf_e("key left relese-\n");
                                }
                        }
                        if(key_xor & 0x08)
                        {
                                if(key_val &0x08)
                                {
                                        printf_e("key right press +\n");
                                }else
                                {
                                        printf_e("key right relese-\n");
                                }
                        }
                        if(key_xor & 0x10)
                        {
                                if(key_val &0x10)
                                {
                                        printf_e("key center press +\n");
                                }else
                                {
                                        printf_e("key center relese-\n");
                                }
                        }                       
                        key_old = key_val;
                }
               
                if(ledms < ald_get_tick())
                {
                        ledms = ald_get_tick()+1000;
                        light_ctrl(LIGHT_IDX_1, LIGHT_CTRL_TOGGLE);
                        light_ctrl(LIGHT_IDX_2, LIGHT_CTRL_TOGGLE);
                        printf_e("Count: %d\n", __cnt++);               
                       
                        BM1422AGMV_get_rawdata(utbuff);                  
                        printf_e("BM1422AGMV:xx=%u\t\tyy=%u\t\tzz=%u\r\n",(uint16_t)(utbuff[1]<<8)|utbuff[0],
                                                                                                (uint16_t)(utbuff[3]<<8)|utbuff[2],
                                                                                                (uint16_t)(utbuff[5]<<8)|utbuff[4]);
                        RPR0521RS_get_psalsval(&ps,&als);
                        printf_e("RPR0521RS:Lx=%0.2f\t\tPs=%d\n",als,ps);
                               
                        BM1383AGLV_get_val(&press,&temp);
                        printf_e("BM1383AGLV:P=%0.2f\t\tTem=%0.2f\n",press,temp);
                }
        }
}


下面就是读取的数据,3个传感器的数值在串口上显示如下。



主要代码如下:
游客,如果您要查看本帖隐藏内容请回复




使用特权

评论回复

相关帖子

沙发
stb988| | 2021-2-1 13:18 | 只看该作者
正在测试iic,看看代码

使用特权

评论回复
板凳
windskygrow| | 2021-2-1 14:27 | 只看该作者
不错不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

4391

帖子

25

粉丝