社区导航

 

搜索
查看: 1698|回复: 0

[设计过程分享] 【MAX32630FTHR】--IIC之BMI160&OLED

[复制链接]

39

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-9-26 22:46 | 显示全部楼层 |阅读模式
本帖最后由 df_flying 于 2017-9-26 22:46 编辑

    由原理图可以看到MAX32630FTHR板载了一颗BMI160,和MAX14960同时接在了IIC2上,同时将IIC1引脚通过排针接了出来,这里正好可以接一个OLED显示。      根据所给的demo程序,其实IIC2的初始化在MAX14960初始化的时候就已经完成了,有一点不太清楚就是对应的IIC引脚并没有通过GPIO_Config()经行初始化。但为了保险这里OLED对应的IIC1的GPIO做了下简单的初始化。
      利用板载的BMI160可以方便的判断下IIC的读程序是否存在问题,也验证下IIC是否连通,代码如下
      I2CM_Read(MXC_I2CM2,BMI160_ADD,&add,1,&rec,1);
      LOG("BMI160: ID is %d\r\n",rec);
        if(rec != 209)
        {
          return -1;
        }
      后来通过BMI160的0x7e写命令后,一开始在0x0C位一直读不到数据,单步调试好像也没有发现问题,甚至可以读到160的时间戳,仔细看了下官方提供的I2CM_Write函数后,不知道是理解错了,还是...这里的函数竟然将所要写的地址作为第一个date,接上后面的数据同时写入,才是正确的,如下,不清楚封装中的cmd_data有啥用。
        data[0] = 0x7E;//地址
        data[1] = 0x11;//CMD
        I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
     BMI初始化程序如下:      

  1. int bmi160_Init(void)
  2. {
  3.         uint8_t add = 0x00,cmd= 0x00;
  4.         uint8_t rec;
  5.         uint8_t data[2];

  6.   I2CM_Read(MXC_I2CM2,BMI160_ADD,&add,1,&rec,1);
  7.   LOG("BMI160: ID is %d\r\n",rec);
  8.         if(rec != 209)
  9.         {
  10.           return -1;
  11.         }
  12.         //acc mode
  13. //        cmd = 0x11; //00 suspend  01normal  10 low power
  14.         data[0] = 0x7E;
  15.         data[1] = 0x11;
  16.         I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  17.   HAL_Delay(100);        
  18.         //gyr mode
  19.         data[0] = 0x7E;
  20.         data[1] = 0x15; //00 suspend 01 normal 10reserved 11 fast
  21.         I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  22.   HAL_Delay(100);        
  23.         //0x41  4g
  24.         data[0] = 0x41;
  25.         data[1] = 0x05;
  26.         I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  27.   HAL_Delay(100);        
  28.         //0x40
  29.         data[0] = 0x40;
  30.         data[1] = 0x29;
  31.         I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  32.   HAL_Delay(100);        
  33.         //0x42  
  34.         data[0] = 0x42;
  35.         data[1] = 0x29;
  36.         I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  37.   HAL_Delay(100);        
  38.   //0x43         
  39.         data[0] = 0x43;
  40.         data[1] = 0x03;
  41.         I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  42.   HAL_Delay(100);        
  43.         //0X7A
  44. //        data[0] = 0x7A;
  45. //        data[1] = 0x15;
  46. //        I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  47. //  HAL_Delay(100);               
  48. //        //0X7B
  49. //        data[0] = 0x7B;
  50. //        data[1] = 0x0b;
  51. //        I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  52. //  HAL_Delay(100);        
  53.         //0X41
  54.         data[0] = 0x41;
  55.         data[1] = 0x05;
  56.         I2CM_Write(MXC_I2CM2,BMI160_ADD,NULL,0,data,2);
  57.   HAL_Delay(100);        
  58.   return 0;
  59. }
复制代码

    BMI测试程序如下:
  1. void bmi160_Test(void)
  2. {
  3.   uint8_t add1 = 0x0c;
  4.         uint8_t data[15];
  5.         int16_t accx,accy,accz,gyrx,gyry,gyrz;
  6.         
  7.   I2CM_Read(MXC_I2CM2,BMI160_ADD,&add1,1,data,15);
  8.         
  9.         gyrx = (data[1]<<8) |data[0];//  /13120
  10.         gyry = (data[3]<<8) |data[2];
  11.         gyrz = (data[5]<<8) |data[4];
  12.         accx = (data[7]<<8) |data[6]; // /16384*2
  13.         accy = (data[9]<<8) |data[8];
  14.         accz = (data[11]<<8) |data[10];
  15.         
  16.         acc_x = (float) accx / 16384*2;
  17.         acc_y = (float) accy / 16384*2;
  18.         acc_z = (float) accz / 16384*2;
  19.         
  20.         gyr_x = (float) gyrx / 1312*10;
  21.   gyr_y = (float) gyry / 1312*10;
  22.         gyr_z = (float) gyrz / 1312*10;
  23.         
  24.         LOG("BMI160: accx=%.4f  accy=%.4f  accz=%.4f  gyrx=%.4f  gyry=%.4f  gyrz=%.4f\r\n",acc_x,acc_y,acc_z,gyr_x,gyr_y,gyr_z);
  25. //  LOG("REC = %d",rec);
  26.         
  27. //        uint8_t step[2];
  28. //        add1=0x78;
  29. //        I2CM_Read(MXC_I2CM2,BMI160_ADD,&add1,1,step,2);
  30. //        LOG("step is %d\r\n",(step[0]<<8)|step[1]);

  31. }
复制代码


      代码中含有对BMI160step的使用,试了下好像不是很准,可能是设置的还有些问题。测试结果如下:

0001.png
    OLED模块也带了不少的参考资源,这里主要是自己设置下底层函数,以及IIC1的初始化,模块上已有IIC的上啦电阻了,所以模块的两个NC上拉并不需要再焊接了。
    OLED相关底层函数以及初始化
  1. int oled_I2cWriteCmd(uint8_t cmd)
  2. {
  3.         uint8_t data[2];
  4.         data[0] = OLED_CMDADD;
  5.         data[1] = cmd;
  6.     if (I2CM_Write(OLED_I2CM,OLED_ADD,NULL,0,data,2) != 2) {
  7.         return E_COMM_ERR;
  8.     }        
  9.         return 0;

  10. }
  11. /*
  12. *
  13. */
  14. int oled_I2cWriteData(uint8_t data)
  15. {
  16.         uint8_t wdata[2];
  17.         wdata[0] = OLED_DATAADD;
  18.         wdata[1] = data;
  19.         if (I2CM_Write(OLED_I2CM,OLED_ADD,NULL,0,wdata,2) != 2) {
  20.         return E_COMM_ERR;
  21.     }               
  22.         return 0;

  23. }
复制代码
  1. const sys_cfg_i2cm_t oled_sys_cfg = {
  2.         .clk_scale = CLKMAN_SCALE_DIV_1,
  3.         .io_cfg = IOMAN_I2CM1(IOMAN_MAP_A, 1)
  4. };
  5. const gpio_cfg_t oled_iic = {PORT_3,(PIN_4 | PIN_5),GPIO_FUNC_GPIO,GPIO_PAD_OPEN_DRAIN };
  6. /*
  7. *
  8. */
  9. void oled_Init(void)
  10. {
  11. //        int err=0;
  12.                         GPIO_Config(&oled_iic);
  13.                 if((I2CM_Init(OLED_I2CM, &oled_sys_cfg, I2CM_SPEED_400KHZ))!= E_NO_ERROR)
  14.                 {
  15.                         printf("I2C1 err \r\n");
  16.                 }
  17.   HAL_Delay(200);
复制代码

  测试结果如图:
QQ截图20170926204139.bmp
      直接上代码了,也方便以后自己查找,见附件
来源:EEWorld MAX32630FTHR设计大赛专区板块,转载请附上链接

IIC-BMI160 OLED.zip

1.6 MB, 下载次数: 4



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-22 23:03 , Processed in 0.076295 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表