[国产单片机] 【东软载波ES32F369x开发板】硬件I2C测试

[复制链接]
1009|2
 楼主| WoodData 发表于 2021-1-28 22:36 | 显示全部楼层 |阅读模式
    本次测试的是I2C外设,测试使用了ROHM的传感器,光照度传感器RPR-0521RS,气压传感器BM1383AGLV,地磁传感器BM1422AGMV。这几个传感器都是I2C接口,可以一起接I2C测试。
如图:使用arduino接口插在开发板。I2C使用的是I2C0,对应管脚为PB8:SCL,PB9:SDA。





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

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

  1. void i2c_gpio_init( void )
  2. {
  3. #ifdef I2C_USE_GPIO

  4.        
  5. #else
  6.         gpio_init_t a;

  7.         /* Initialize scl pin */
  8.         a.mode = GPIO_MODE_OUTPUT;
  9.         a.odos = GPIO_OPEN_DRAIN;
  10.         a.pupd = GPIO_PUSH_UP;
  11.         a.nodrv = GPIO_OUT_DRIVE_6;
  12.         a.podrv = GPIO_OUT_DRIVE_6;
  13.         a.flt  = GPIO_FILTER_DISABLE;
  14.         a.type = GPIO_TYPE_TTL;
  15.         a.func = GPIO_FUNC_5;
  16.         ald_gpio_init(I2C_SCL_Port, I2C_SCL_PIN, &a);

  17.         /* Initialize sda pin */
  18.         a.mode = GPIO_MODE_OUTPUT;
  19.         a.odos = GPIO_OPEN_DRAIN;
  20.         a.pupd = GPIO_PUSH_UP;
  21.         a.nodrv = GPIO_OUT_DRIVE_6;
  22.         a.podrv = GPIO_OUT_DRIVE_6;
  23.         a.flt  = GPIO_FILTER_DISABLE;
  24.         a.type = GPIO_TYPE_TTL;
  25.         a.func = GPIO_FUNC_5;
  26.         ald_gpio_init(I2C_SDA_Port, I2C_SDA_PIN, &a);

  27.         /* Initialize I2C struct */
  28.         memset(&h_i2c, 0, sizeof(h_i2c));
  29.        
  30.         /* Enable i2c interrupt */
  31. //        ald_mcu_irq_config(I2C1_EV_IRQn, 3, 3, ENABLE);
  32. //        ald_mcu_irq_config(I2C1_ERR_IRQn, 3, 3, ENABLE);

  33.         /* Initialize I2C */
  34.         h_i2c.perh = I2C0;
  35.         h_i2c.init.clk_speed = 100000;
  36.         h_i2c.init.module    = I2C_MODULE_MASTER;
  37.         h_i2c.init.dual_addr = I2C_DUALADDR_ENABLE;
  38.         h_i2c.init.own_addr1 = 0xA0;
  39.         h_i2c.init.addr_mode = I2C_ADDR_7BIT;
  40.         h_i2c.init.general_call = I2C_GENERALCALL_ENABLE;
  41.         h_i2c.init.no_stretch = I2C_NOSTRETCH_ENABLE;

  42.         ald_i2c_reset(&h_i2c);
  43.         ald_i2c_init(&h_i2c);
  44. #endif
  45. }

  1. int main()
  2. {
  3.         uint32_t         ms,ledms;
  4.         uint32_t         key_val,key_old,key_xor;
  5.         uint8_t         utbuff[6];
  6.        
  7.         float press; float temp;
  8.         uint16_t ps; float als;       
  9.        
  10.         /* Initialize ALD */
  11.         ald_cmu_init();
  12.         /* Configure system clock */
  13.         ald_cmu_pll1_config(CMU_PLL1_INPUT_HOSC_3, CMU_PLL1_OUTPUT_96M);
  14.         ald_cmu_clock_config(CMU_CLOCK_PLL1, 96000000);
  15.         /* Enable peripheral clock */
  16.         ald_cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE);
  17.         ald_cmu_perh_clock_config(CMU_PERH_UART0, ENABLE);
  18.         ald_cmu_perh_clock_config(CMU_PERH_I2C0, ENABLE);
  19.        
  20.         uart_stdio_init();
  21.         memset(uart_buf, 0x0, 64);

  22.         light_init();
  23.         key_init();
  24.         lcd_gpio_init();
  25.         i2c_gpio_init();
  26.        

  27.         printf_e("System start...\n");
  28.         light_ctrl(LIGHT_IDX_2, LIGHT_CTRL_ON);
  29.         ald_delay_ms(1000);
  30.         light_ctrl(LIGHT_IDX_2, LIGHT_CTRL_OFF);
  31.         ald_delay_ms(1000);
  32.        
  33.         if(BM1422AGMV_Init() == 0)
  34.         {
  35.                 printf_e("BM1422AGMV_Init OK\r\n");
  36.         }
  37.         if(BM1383AGLV_Init() == 0)
  38.         {
  39.                 printf_e("BM1383AGLV_Init OK\r\n");
  40.         }
  41.         if(RPR0521RS_Init() == 0)
  42.         {
  43.                 printf_e("RPR0521RS_Init OK\r\n");
  44.         }
  45.        
  46.         ms = ald_get_tick()+10;
  47.         ledms = ald_get_tick()+1000;
  48.         key_old = 0;
  49.         while (1)
  50.         {
  51.                 //按键扫描
  52.                 if(ms < ald_get_tick())
  53.                 {
  54.                         ms = ald_get_tick()+10;
  55.                        
  56.                         key_val = 0;
  57.                         if(ald_gpio_read_pin(KEY_UP_PORT, KEY_UP_PIN) == 0)                        key_val |= 0x01;
  58.                         if(ald_gpio_read_pin(KEY_DOWN_PORT, KEY_DOWN_PIN) == 0)                key_val |= 0x02;
  59.                         if(ald_gpio_read_pin(KEY_LEFT_PORT, KEY_LEFT_PIN) == 0)                key_val |= 0x04;
  60.                         if(ald_gpio_read_pin(KEY_RIGHT_PORT, KEY_RIGHT_PIN) == 0)        key_val |= 0x08;
  61.                         if(ald_gpio_read_pin(KEY_CENTER_PORT, KEY_CENTER_PIN) == 0)        key_val |= 0x10;
  62.                        
  63.                         key_xor = key_old ^ key_val;
  64.                         if(key_xor & 0x01)
  65.                         {
  66.                                 if(key_val &0x01)
  67.                                 {
  68.                                         printf_e("key up press +\n");
  69.                                 }else
  70.                                 {
  71.                                         printf_e("key up relese-\n");
  72.                                 }
  73.                         }
  74.                        
  75.                         if(key_xor & 0x02)
  76.                         {
  77.                                 if(key_val &0x02)
  78.                                 {
  79.                                         printf_e("key down press +\n");
  80.                                 }else
  81.                                 {
  82.                                         printf_e("key down relese-\n");
  83.                                 }
  84.                         }
  85.                         if(key_xor & 0x04)
  86.                         {
  87.                                 if(key_val &0x04)
  88.                                 {
  89.                                         printf_e("key left press +\n");
  90.                                 }else
  91.                                 {
  92.                                         printf_e("key left relese-\n");
  93.                                 }
  94.                         }
  95.                         if(key_xor & 0x08)
  96.                         {
  97.                                 if(key_val &0x08)
  98.                                 {
  99.                                         printf_e("key right press +\n");
  100.                                 }else
  101.                                 {
  102.                                         printf_e("key right relese-\n");
  103.                                 }
  104.                         }
  105.                         if(key_xor & 0x10)
  106.                         {
  107.                                 if(key_val &0x10)
  108.                                 {
  109.                                         printf_e("key center press +\n");
  110.                                 }else
  111.                                 {
  112.                                         printf_e("key center relese-\n");
  113.                                 }
  114.                         }                       
  115.                         key_old = key_val;
  116.                 }
  117.                
  118.                 if(ledms < ald_get_tick())
  119.                 {
  120.                         ledms = ald_get_tick()+1000;
  121.                         light_ctrl(LIGHT_IDX_1, LIGHT_CTRL_TOGGLE);
  122.                         light_ctrl(LIGHT_IDX_2, LIGHT_CTRL_TOGGLE);
  123.                         printf_e("Count: %d\n", __cnt++);               
  124.                        
  125.                         BM1422AGMV_get_rawdata(utbuff);                  
  126.                         printf_e("BM1422AGMV:xx=%u\t\tyy=%u\t\tzz=%u\r\n",(uint16_t)(utbuff[1]<<8)|utbuff[0],
  127.                                                                                                 (uint16_t)(utbuff[3]<<8)|utbuff[2],
  128.                                                                                                 (uint16_t)(utbuff[5]<<8)|utbuff[4]);
  129.                         RPR0521RS_get_psalsval(&ps,&als);
  130.                         printf_e("RPR0521RS:Lx=%0.2f\t\tPs=%d\n",als,ps);
  131.                                
  132.                         BM1383AGLV_get_val(&press,&temp);
  133.                         printf_e("BM1383AGLV:P=%0.2f\t\tTem=%0.2f\n",press,temp);
  134.                 }
  135.         }
  136. }


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



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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
stb988 发表于 2021-2-1 13:18 | 显示全部楼层
正在测试iic,看看代码
windskygrow 发表于 2021-2-1 14:27 | 显示全部楼层
不错不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

4784

帖子

28

粉丝
快速回复 在线客服 返回列表 返回顶部