MPU6050使用模拟IIC,读取寄存器数据的时候时间花费很长怎么办

[复制链接]
5205|10
 楼主| qq2216691777 发表于 2015-5-30 11:09 | 显示全部楼层 |阅读模式
读取一个轴的加速度要3~4Ms这也太长了吧  你们的都多长时间啊?能不能指点我一下
这是我MPU6050的初始化代码
  1.         i = MPU6050_ReadOneReg( WHO_AM_I );
  2.         while( i != 0x68 )
  3.         {
  4.                 printf("MPU6055 error !\r\n");
  5.                 i = MPU6050_ReadOneReg( WHO_AM_I );
  6.         }
  7.         printf("                      MPU6055 SUCESS! !\r\n");

  8.         MPU6050_WriteOneData( PWR_MGMT_1, 0x00);               
  9.         MPU6050_WriteOneData( SMPLRT_DIV, 0x07);
  10.         MPU6050_WriteOneData( CONFIG, 0x06);
  11.         MPU6050_WriteOneData( GYRO_CONFIG, 0x18 );               
  12.         MPU6050_WriteOneData( ACCEL_CONFIG, 0x01 );               
le062 发表于 2015-5-31 09:01 | 显示全部楼层
看下这种写法:
  1. void I2C1_IRQHandler(void)
  2. {
  3.         if (i2c_ctrl[1].enable == 0)
  4.                 goto error;       
  5.        
  6.         if (I2C1->TOCTL & I2C_TOCTL_TOIF_Msk)
  7.         {
  8.                 goto error;
  9.         }
  10.         else if (I2C1->CTL & I2C_CON_I2C_STS)
  11.         {
  12.                 uint32_t status = I2C1->STATUS;

  13.                 if (i2c_ctrl[1].rw) // read phase
  14.                 {
  15.                         if ((status == 0x08) || (status == 0x10))
  16.                         {
  17.                                 I2C1->DAT = (i2c_ctrl[1].chip_addr << 1) + 1;
  18.                                 I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
  19.                         }
  20.                         else if (status == 0x40)
  21.                         {
  22.                                 if (i2c_ctrl[1].read_len > 1)
  23.                                 {
  24.                                         // host reply ack
  25.                                         I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_ACK);
  26.                                 }
  27.                                 else if (i2c_ctrl[1].read_len == 1)
  28.                                 {
  29.                                         // host reply nack
  30.                                         I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
  31.                                 }
  32.                                 else
  33.                                 {
  34.                                         goto error;
  35.                                 }
  36.                         }
  37.                         else if (status == 0x50)
  38.                         {
  39.                                 if (i2c_ctrl[1].read_prt < i2c_ctrl[1].read_len)
  40.                                         i2c_ctrl[1].read[i2c_ctrl[1].read_prt++] = I2C1->DAT;
  41.                                 if (i2c_ctrl[1].read_prt < i2c_ctrl[1].read_len - 1)
  42.                                 {
  43.                                         // host reply ack
  44.                                         I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_ACK);
  45.                                 }
  46.                                 else
  47.                                 {
  48.                                         // host reply nack
  49.                                         I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
  50.                                 }
  51.                         }
  52.                         else if (status == 0x58)
  53.                         {
  54.                                 if (i2c_ctrl[1].read_prt < i2c_ctrl[1].read_len)
  55.                                         i2c_ctrl[1].read[i2c_ctrl[1].read_prt++] = I2C1->DAT;
  56.                                
  57.                                 i2c_ctrl[1].read = NULL;
  58.                                
  59.                                 if (i2c_ctrl[1].write != NULL)
  60.                                 {
  61.                                         i2c_ctrl[1].rw = 0;
  62.                                         I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_START);
  63.                                 }
  64.                                 else
  65.                                 {
  66.                                         I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_STOP);
  67.                                         I2C1->TOCTL = 0;
  68.                                         if (m45x_i2c_callback[1] != NULL &&
  69.                                                 i2c_ctrl[1].callback_enable)
  70.                                         {
  71.                                                 i2c_ctrl[1].enable = 0;
  72.                                                 i2c_ctrl[1].callback_enable = 0;
  73.                                                 m45x_i2c_callback[1](m45x_i2c_param[1],
  74.                                                                                                 i2c_ctrl[1].read_prt,
  75.                                                                                                 i2c_ctrl[1].write_prt);
  76.                                         }
  77.                                 }
  78.                         }
  79.                         else
  80.                         {
  81.                                 goto error;
  82.                         }       
  83.                 }
  84.                 else // write phase
  85.                 {
  86.                         if ((status == 0x08) || (status == 0x10))        // start send finish
  87.                         {
  88.                                 I2C1->DAT = i2c_ctrl[1].chip_addr << 1;
  89.                                 I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
  90.                         }
  91.                         else if ((status == 0x18) || (status == 0x28))        // addr/data send finish and ACK received
  92.                         {
  93.                                 if (i2c_ctrl[1].write_prt < i2c_ctrl[1].write_len)
  94.                                 {
  95.                                         I2C1->DAT = i2c_ctrl[1].write[i2c_ctrl[1].write_prt++];
  96.                                         I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
  97.                                 }
  98.                                 else
  99.                                 {
  100.                                         i2c_ctrl[1].write = NULL;
  101.                                         if (i2c_ctrl[1].read != NULL)
  102.                                         {
  103.                                                 i2c_ctrl[1].rw = 1;
  104.                                                 I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_START);
  105.                                         }
  106.                                         else
  107.                                         {
  108.                                                 I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_STOP);
  109.                                                 I2C1->TOCTL = 0;
  110.                                                 if (m45x_i2c_callback[1] != NULL &&
  111.                                                         i2c_ctrl[1].callback_enable)
  112.                                                 {
  113.                                                         i2c_ctrl[1].enable = 0;
  114.                                                         i2c_ctrl[1].callback_enable = 0;
  115.                                                         m45x_i2c_callback[1](m45x_i2c_param[1],
  116.                                                                                                         i2c_ctrl[1].read_prt,
  117.                                                                                                         i2c_ctrl[1].write_prt);
  118.                                                 }
  119.                                         }
  120.                                 }
  121.                         }
  122.                         else
  123.                         {
  124.                                 goto error;
  125.                         }                       
  126.                 }
  127.         }
  128.         return;

  129. error:
  130.         I2C1->TOCTL = I2C_TOCTL_TOIF_Msk;               
  131.         I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_STOP);
  132.        
  133.         i2c_ctrl[1].enable = 0;
  134.         if (m45x_i2c_callback[1] != NULL && i2c_ctrl[1].callback_enable)
  135.         {
  136.                 i2c_ctrl[1].callback_enable = 0;
  137.                 m45x_i2c_callback[1](m45x_i2c_param[1], -1, -1);
  138.         }
  139. }


类似linux的驱动,通过msg将单次需传输的信息全部交友驱动层,驱动通过中断不断访问IIC,直到操作完成,回调高层。
这是最高效的。
mmuuss586 发表于 2015-5-30 11:10 | 显示全部楼层
建议用示波器测试下,时间主要花在哪个环节;
 楼主| qq2216691777 发表于 2015-5-30 11:11 | 显示全部楼层
mmuuss586 发表于 2015-5-30 11:10
建议用示波器测试下,时间主要花在哪个环节;

用示波器测什么?
mmuuss586 发表于 2015-5-30 11:13 | 显示全部楼层
本帖最后由 mmuuss586 于 2015-5-30 11:14 编辑

既然是通讯,就看哪个环节时间花的比较长;
另外没用过你说的这个芯片,3到4mS也还好吧;
 楼主| qq2216691777 发表于 2015-5-30 11:16 | 显示全部楼层
mmuuss586 发表于 2015-5-30 11:13
既然是通讯,就看哪个环节时间花的比较长;
另外没用过你说的这个芯片,3到4mS也还好吧;
...

网上的说他们1ms还觉得时间长。
示波器可以查看通信中的时间长短?怎么看?没这么用过
 楼主| qq2216691777 发表于 2015-5-31 20:23 | 显示全部楼层
le062 发表于 2015-5-31 09:01
看下这种写法:

多谢多谢  我研究一下
coody 发表于 2015-6-8 22:07 | 显示全部楼层
IO模拟的IIC,一般不超过50us就能读一个字节。
falle 发表于 2015-8-11 07:27 | 显示全部楼层
不知道为什么管理员删除我的回复,MPU6050就是可以连读多个轴,几百微秒读完6个轴,,,,,,
sum123456 发表于 2018-4-12 16:53 | 显示全部楼层

IO模拟的IIC,一般不超过50us就能读一个字节。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

37

帖子

3

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