打印

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

[复制链接]
4536|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq2216691777|  楼主 | 2015-5-30 11:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
读取一个轴的加速度要3~4Ms这也太长了吧  你们的都多长时间啊?能不能指点我一下
这是我MPU6050的初始化代码
        i = MPU6050_ReadOneReg( WHO_AM_I );
        while( i != 0x68 )
        {
                printf("MPU6055 error !\r\n");
                i = MPU6050_ReadOneReg( WHO_AM_I );
        }
        printf("                      MPU6055 SUCESS! !\r\n");

        MPU6050_WriteOneData( PWR_MGMT_1, 0x00);               
        MPU6050_WriteOneData( SMPLRT_DIV, 0x07);
        MPU6050_WriteOneData( CONFIG, 0x06);
        MPU6050_WriteOneData( GYRO_CONFIG, 0x18 );               
        MPU6050_WriteOneData( ACCEL_CONFIG, 0x01 );               

相关帖子

来自 2楼
le062| | 2015-5-31 09:01 | 只看该作者
看下这种写法:
void I2C1_IRQHandler(void)
{
        if (i2c_ctrl[1].enable == 0)
                goto error;       
       
        if (I2C1->TOCTL & I2C_TOCTL_TOIF_Msk)
        {
                goto error;
        }
        else if (I2C1->CTL & I2C_CON_I2C_STS)
        {
                uint32_t status = I2C1->STATUS;

                if (i2c_ctrl[1].rw) // read phase
                {
                        if ((status == 0x08) || (status == 0x10))
                        {
                                I2C1->DAT = (i2c_ctrl[1].chip_addr << 1) + 1;
                                I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
                        }
                        else if (status == 0x40)
                        {
                                if (i2c_ctrl[1].read_len > 1)
                                {
                                        // host reply ack
                                        I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_ACK);
                                }
                                else if (i2c_ctrl[1].read_len == 1)
                                {
                                        // host reply nack
                                        I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
                                }
                                else
                                {
                                        goto error;
                                }
                        }
                        else if (status == 0x50)
                        {
                                if (i2c_ctrl[1].read_prt < i2c_ctrl[1].read_len)
                                        i2c_ctrl[1].read[i2c_ctrl[1].read_prt++] = I2C1->DAT;
                                if (i2c_ctrl[1].read_prt < i2c_ctrl[1].read_len - 1)
                                {
                                        // host reply ack
                                        I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_ACK);
                                }
                                else
                                {
                                        // host reply nack
                                        I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
                                }
                        }
                        else if (status == 0x58)
                        {
                                if (i2c_ctrl[1].read_prt < i2c_ctrl[1].read_len)
                                        i2c_ctrl[1].read[i2c_ctrl[1].read_prt++] = I2C1->DAT;
                               
                                i2c_ctrl[1].read = NULL;
                               
                                if (i2c_ctrl[1].write != NULL)
                                {
                                        i2c_ctrl[1].rw = 0;
                                        I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_START);
                                }
                                else
                                {
                                        I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_STOP);
                                        I2C1->TOCTL = 0;
                                        if (m45x_i2c_callback[1] != NULL &&
                                                i2c_ctrl[1].callback_enable)
                                        {
                                                i2c_ctrl[1].enable = 0;
                                                i2c_ctrl[1].callback_enable = 0;
                                                m45x_i2c_callback[1](m45x_i2c_param[1],
                                                                                                i2c_ctrl[1].read_prt,
                                                                                                i2c_ctrl[1].write_prt);
                                        }
                                }
                        }
                        else
                        {
                                goto error;
                        }       
                }
                else // write phase
                {
                        if ((status == 0x08) || (status == 0x10))        // start send finish
                        {
                                I2C1->DAT = i2c_ctrl[1].chip_addr << 1;
                                I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
                        }
                        else if ((status == 0x18) || (status == 0x28))        // addr/data send finish and ACK received
                        {
                                if (i2c_ctrl[1].write_prt < i2c_ctrl[1].write_len)
                                {
                                        I2C1->DAT = i2c_ctrl[1].write[i2c_ctrl[1].write_prt++];
                                        I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS);
                                }
                                else
                                {
                                        i2c_ctrl[1].write = NULL;
                                        if (i2c_ctrl[1].read != NULL)
                                        {
                                                i2c_ctrl[1].rw = 1;
                                                I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_START);
                                        }
                                        else
                                        {
                                                I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_STOP);
                                                I2C1->TOCTL = 0;
                                                if (m45x_i2c_callback[1] != NULL &&
                                                        i2c_ctrl[1].callback_enable)
                                                {
                                                        i2c_ctrl[1].enable = 0;
                                                        i2c_ctrl[1].callback_enable = 0;
                                                        m45x_i2c_callback[1](m45x_i2c_param[1],
                                                                                                        i2c_ctrl[1].read_prt,
                                                                                                        i2c_ctrl[1].write_prt);
                                                }
                                        }
                                }
                        }
                        else
                        {
                                goto error;
                        }                       
                }
        }
        return;

error:
        I2C1->TOCTL = I2C_TOCTL_TOIF_Msk;               
        I2C_SET_CONTROL_REG(I2C1, I2C_CON_I2C_STS | I2C_CON_STOP);
       
        i2c_ctrl[1].enable = 0;
        if (m45x_i2c_callback[1] != NULL && i2c_ctrl[1].callback_enable)
        {
                i2c_ctrl[1].callback_enable = 0;
                m45x_i2c_callback[1](m45x_i2c_param[1], -1, -1);
        }
}


类似linux的驱动,通过msg将单次需传输的信息全部交友驱动层,驱动通过中断不断访问IIC,直到操作完成,回调高层。
这是最高效的。

使用特权

评论回复
板凳
mmuuss586| | 2015-5-30 11:10 | 只看该作者
建议用示波器测试下,时间主要花在哪个环节;

使用特权

评论回复
地板
qq2216691777|  楼主 | 2015-5-30 11:11 | 只看该作者
mmuuss586 发表于 2015-5-30 11:10
建议用示波器测试下,时间主要花在哪个环节;

用示波器测什么?

使用特权

评论回复
5
mmuuss586| | 2015-5-30 11:13 | 只看该作者
本帖最后由 mmuuss586 于 2015-5-30 11:14 编辑

既然是通讯,就看哪个环节时间花的比较长;
另外没用过你说的这个芯片,3到4mS也还好吧;

使用特权

评论回复
6
qq2216691777|  楼主 | 2015-5-30 11:16 | 只看该作者
mmuuss586 发表于 2015-5-30 11:13
既然是通讯,就看哪个环节时间花的比较长;
另外没用过你说的这个芯片,3到4mS也还好吧;
...

网上的说他们1ms还觉得时间长。
示波器可以查看通信中的时间长短?怎么看?没这么用过

使用特权

评论回复
7
qq2216691777|  楼主 | 2015-5-31 20:23 | 只看该作者
le062 发表于 2015-5-31 09:01
看下这种写法:

多谢多谢  我研究一下

使用特权

评论回复
8
coody| | 2015-6-8 22:07 | 只看该作者
IO模拟的IIC,一般不超过50us就能读一个字节。

使用特权

评论回复
9
falle| | 2015-8-11 07:27 | 只看该作者
不知道为什么管理员删除我的回复,MPU6050就是可以连读多个轴,几百微秒读完6个轴,,,,,,

使用特权

评论回复
10
sum123456| | 2018-4-12 16:53 | 只看该作者

IO模拟的IIC,一般不超过50us就能读一个字节。

使用特权

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

本版积分规则

8

主题

37

帖子

3

粉丝