打印

求助啊!I2C和MPU6050一直出不来结果

[复制链接]
3780|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bush0104|  楼主 | 2016-7-28 00:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这下面是我的程序    求帮我看看啊



void i2cinit()
{
        SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
  GPIOPinConfigure(GPIO_PB2_I2C0SCL);
  GPIOPinConfigure(GPIO_PB3_I2C0SDA);
        GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);
  GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
        GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU);
  GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_3,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_OD);
        I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false);
        I2CMasterEnable(I2C0_BASE);
}
void write(uint8_t DevAddr,uint8_t RegAddr,uint8_t writedata)
{
        I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, false);
        I2CMasterDataPut(I2C0_BASE,RegAddr);
        while(I2CMasterBusy(I2C0_BASE)){}
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
        while(I2CMasterBusy(I2C0_BASE)){}
  I2CMasterDataPut(I2C0_BASE, writedata);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
  while(I2CMasterBusy(I2C0_BASE)){}
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
        i2cinit();
}
uint8_t read(uint8_t DevAddr,uint8_t RegAddr)
{
int data;
        I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, false);
        I2CMasterDataPut(I2C0_BASE,RegAddr);
        while(I2CMasterBusy(I2C0_BASE)){}
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
        while(I2CMasterBusy(I2C0_BASE)){}
        I2CMasterSlaveAddrSet(I2C0_BASE, DevAddr, true);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
  while(I2CMasterBusy(I2C0_BASE)){}
        data= I2CMasterDataGet(I2C0_BASE);
        I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
        i2cinit();
        return data;
}
void mpuinit()
{
        SysCtlDelay(100* (SysCtlClockGet() / 3000));
        write(0x50,PWR_MGMT_1, 0x80);
        SysCtlDelay(100* (SysCtlClockGet() / 3000));
        write(0x50,PWR_MGMT_1, 0x01);
        write(0x50,SMPLRT_DIV, 0x07);
        write(0x50,CONFIG, 0x06);
        write(0x50,GYRO_CONFIG, 0x18);
        write(0x50,ACCEL_CONFIG, 0x00);
}
int
main(void)
{
        init();
        i2cinit();
        InitConsole();
        mpuinit();
        while(1){
        UARTprintf("%o\n",read(0x50,0x68));
  delay(500);}}

相关帖子

沙发
dirtwillfly| | 2016-7-28 08:07 | 只看该作者
什么mcu?

使用特权

评论回复
板凳
bush0104|  楼主 | 2016-7-28 09:55 | 只看该作者

TM4C,是写入读取的部分有错应该是

使用特权

评论回复
地板
bush0104|  楼主 | 2016-7-28 10:01 | 只看该作者

我用示波器能够看到时钟信号和数据信号都有波形,但是我用MPU6050调试的时候,返回值一直都是255

使用特权

评论回复
5
dirtwillfly| | 2016-7-28 10:02 | 只看该作者
TivaWare_C_Series里有iic的例程,你可以参考下

使用特权

评论回复
6
dirtwillfly| | 2016-7-28 10:02 | 只看该作者
我记得TivaWare里有MPU6050的例程代码

使用特权

评论回复
7
bush0104|  楼主 | 2016-7-28 10:05 | 只看该作者
dirtwillfly 发表于 2016-7-28 10:02
我记得TivaWare里有MPU6050的例程代码

编译有错,时钟和数据都有波形,i2c的程序是不是应该没错了就,是6050配置问题?

使用特权

评论回复
8
火山LF| | 2016-7-28 10:09 | 只看该作者
表示没用过,我精神支持你解决问题呐

使用特权

评论回复
9
bush0104|  楼主 | 2016-7-28 10:12 | 只看该作者
火山LF 发表于 2016-7-28 10:09
表示没用过,我精神支持你解决问题呐

快炸了,参加电赛的,学校弄得1314到现在都没来,想先用6050试一下i2c通信,一直出不来

使用特权

评论回复
10
火山LF| | 2016-7-28 10:12 | 只看该作者
有个疑问,你i的编译有错,那怎么会得出结果?

使用特权

评论回复
11
bush0104|  楼主 | 2016-7-28 10:14 | 只看该作者
火山LF 发表于 2016-7-28 10:12
有个疑问,你i的编译有错,那怎么会得出结果?

官方历程编译有错,我的就是出不来结果 ,是不是我地址设置的问题

使用特权

评论回复
12
火山LF| | 2016-7-28 10:20 | 只看该作者
bush0104 发表于 2016-7-28 10:14
官方历程编译有错,我的就是出不来结果 ,是不是我地址设置的问题

网上找有没I2C的例程?看看能不能跑通

使用特权

评论回复
13
1223657347| | 2016-7-28 10:45 | 只看该作者
/**
  ******************************************************************************
  * [url=home.php?mod=space&uid=288409]@file[/url]    MyI2C.c
  * [url=home.php?mod=space&uid=187600]@author[/url]  KEN
  * [url=home.php?mod=space&uid=895143]@version[/url] V1.0
  * [url=home.php?mod=space&uid=212281]@date[/url]    2015年6月21日
  * @brief         My Inter-Integrated Circuit, IIC相关函数的实现
  ******************************************************************************
  * @attention
  *
  * 本固件仅供参考,为客户提供产品的编码信息,以便节省客户时间。由该固件的使用而
  * 造成产品上的损失的,Ks'P概不承担直接或间接的责任。
  *
  * <h2><center>&copy; COPYRIGHT 2015 Ks'P</center></h2>
  ******************************************************************************
  */
#include "stdint.h"
#include "stdbool.h"
#include "stdio.h"

#include "MyI2C.h"

#include "sysctl.h"
#include "gpio.h"
#include "i2c.h"
#include "pin_map.h"
#include "bit_band.h"

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  等待目标从机准备完毕(wait target device stand by until ACK)
  * @param  DeviceAddr:从机地址
  * @retval 无
  */
void MyI2C_WaitDeviceForStandBy(uint8_t DeviceAddr)
{
        I2CMasterSlaveAddrSet(I2C1_BASE, DeviceAddr >> 1, false);
       
        do
        {
                I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START | (~BIT0)); //no data
               
                while(I2CMasterBusy(I2C1_BASE))
                        ;
        }
        while(I2CMasterErr(I2C1_BASE) & BIT2);
}

/**
  * @brief  向目标从机内部寄存器写入数据
  * @param  DeviceAddr:从机地址
                        RegAddr:寄存器地址
                        wbuff:要写入的数据
                        LenOfReg:寄存器大小(按字节)(count by Byte)(必须小于等于4)
                        LenOfBuff:写入数据的长度(按字节)(count by Byte)
  * @retval 无
  */
void MyI2C_WriteReg(uint8_t DeviceAddr, uint32_t RegAddr, uint8_t *wbuff, uint32_t LenOfReg, uint32_t LenOfBuff)
{
        uint32_t i = 0;
       
        I2CMasterSlaveAddrSet(I2C1_BASE, DeviceAddr >> 1, false);
       
        while(LenOfReg--)
        {
                I2CMasterDataPut(I2C1_BASE, *((uint8_t *)(&RegAddr) + LenOfReg));
               
                if(i ==0 )
                {
                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
                }
                else
                {
                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
                }
               
                while(I2CMasterBusy(I2C1_BASE))
                        ;
               
                i++;
        }
       
        i = 0;
       
        while(LenOfBuff--)
        {
                I2CMasterDataPut(I2C1_BASE, *(wbuff + i));
               
                if(LenOfBuff != 0)
                {
                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
                }
                else
                {
                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
                }
               
                while(I2CMasterBusy(I2C1_BASE))
                        ;
               
                i++;
        }
}

/**
  * @brief  从目标从机内部寄存器读出数据
  * @param  DeviceAddr:从机地址
                        RegAddr:寄存器地址
                        wbuff:要读出的数据缓冲区
                        LenOfReg:寄存器大小(按字节)(count by Byte)(必须小于等于4)
                        LenOfBuff:读出数据的缓冲区长度(按字节)(count by Byte)
  * @retval 无
  */
void MyI2C_ReadReg(uint8_t DeviceAddr, uint32_t RegAddr, uint8_t *rbuff, uint32_t LenOfReg, uint32_t LenOfBuff)
{
        uint32_t i = 0;
       
        I2CMasterSlaveAddrSet(I2C1_BASE, DeviceAddr >> 1, false);
       
        while(LenOfReg--)
        {
                I2CMasterDataPut(I2C1_BASE, *((uint8_t *)(&RegAddr) + LenOfReg));
               
                if(i == 0)
                {
                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
                }
                else
                {
                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
                }
               
                while(I2CMasterBusy(I2C1_BASE))
                        ;

                i++;
        }
       
        I2CMasterSlaveAddrSet(I2C1_BASE, DeviceAddr >> 1, true);
       
        i = 0;
       
        while(LenOfBuff--)
        {       
                if((LenOfBuff == 0)&&(i==0))
                {
                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE); //NACK               
                }
                else
                {
                        if(i == 0)
                        {
                                I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START); //ACK               
                        }
                        else
                        {
                                if(LenOfBuff != 0)
                                {
                                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT); //ACK               
                                }
                                else
                                {
                                        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH); //NACK
                                }
                        }
                }
               
                while(I2CMasterBusy(I2C1_BASE))
                        ;

                *(rbuff + i) = (uint8_t)I2CMasterDataGet(I2C1_BASE);
               
                i++;
        }
}

楼主可以参考我调通过的I2C的代码(TM4C123GH6PM)

使用特权

评论回复
评分
参与人数 1威望 +5 收起 理由
dirtwillfly + 5 很给力!
14
1223657347| | 2016-7-28 11:49 | 只看该作者
本帖最后由 1223657347 于 2016-7-28 13:19 编辑
bush0104 发表于 2016-7-28 11:44
My i2c的头文件有吗大哥
/**
  ******************************************************************************
  * [url=home.php?mod=space&uid=288409]@file[/url]    MyI2C.h
  * [url=home.php?mod=space&uid=187600]@author[/url]  KEN
  * [url=home.php?mod=space&uid=895143]@version[/url] V1.0
  * [url=home.php?mod=space&uid=212281]@date[/url]    2015年6月21日
  * [url=home.php?mod=space&uid=247401]@brief[/url]         My Inter-Integrated Circuit, IIC相关函数的接口
  ******************************************************************************
  * @attention
  *
  * 本固件仅供参考,为客户提供产品的编码信息,以便节省客户时间。由该固件的使用而
  * 造成产品上的损失的,Ks'P概不承担直接或间接的责任。
  *
  * <h2><center>&copy; COPYRIGHT 2015 Ks'P</center></h2>
  ******************************************************************************
  */
#ifndef __MYI2C_H
#define __MYI2C_H

/********I2C Pin***********
*        PA6                ->        I2C1_SCL
*        PA7                ->        I2C1_SDA
*************************
*/

#define EEPROM_Addr                        0xA0

void MyI2C_WaitDeviceForStandBy(uint8_t DeviceAddr);

void MyI2C_WriteReg(uint8_t DeviceAddr, uint32_t RegAddr, uint8_t *wbuff, uint32_t LenOfReg, uint32_t LenOfBuff);
void MyI2C_ReadReg(uint8_t DeviceAddr, uint32_t RegAddr, uint8_t *rbuff, uint32_t LenOfReg, uint32_t LenOfBuff);

#endif

使用特权

评论回复
15
bush0104|  楼主 | 2016-7-28 12:00 | 只看该作者

读取出来的数据是放在哪里的,大哥

使用特权

评论回复
16
1223657347| | 2016-7-28 12:11 | 只看该作者
本帖最后由 1223657347 于 2016-7-28 12:18 编辑
#define MPU6050_ADDR                                                0xD0
#define MPU6050_O_PWR_MGMT_1                                0x6B // Power management 1 register
#define MPU6050_PWR_MGMT_1_DEVICE_RESET                0x80 // Device reset

#define MPU6050_O_ACCEL_XOUT_H                                0x3B // X-axis acceleration data MSB register

uint8_t reg_temp;
uint8_t raw_data[14];

reg_temp = MPU6050_PWR_MGMT_1_DEVICE_RESET;
MyI2C_WriteReg(MPU6050_ADDR, MPU6050_O_PWR_MGMT_1, &reg_temp, 1, 1); //设备复位

MyI2C_ReadReg(MPU6050_ADDR, MPU6050_O_ACCEL_XOUT_H, raw_data, 1, 14); //读原始数据


随手写了几行,再不会用我就实在没办法了

使用特权

评论回复
17
bush0104|  楼主 | 2016-7-28 12:19 | 只看该作者

能不能传一个你读取写入的例子我看一下,谢谢了,我这学完51就用这个,才三四天自己学,确实搞不明白啊。。。

使用特权

评论回复
18
bush0104|  楼主 | 2016-7-28 12:19 | 只看该作者
1223657347 发表于 2016-7-28 12:11
随手写了几行,再不会用我就实在没办法了

111111,谢谢

使用特权

评论回复
19
bush0104|  楼主 | 2016-7-28 13:05 | 只看该作者
1223657347 发表于 2016-7-28 12:11
随手写了几行,再不会用我就实在没办法了

谢谢大哥,还是和我之前的代码一样只只有255,哎,心塞塞

使用特权

评论回复
20
bush0104|  楼主 | 2016-7-28 13:33 | 只看该作者

调出来了,我要请你吃水饺!!!

使用特权

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

本版积分规则

2

主题

18

帖子

0

粉丝