This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教一个硬件IIC读取6050的问题。

Other Parts Discussed in Thread: TM4C123GH6PM

我用的是tm4c123gh6pm 那款芯片,用的是硬件IIC,我觉得是我的IIC配置的有问题,读出来的数据都是0xff,程序贴上了希望大家给看看,有人可以提供个源码就更感激不尽了。

IIC的

/*
 * myiic.c
 *
 *  Created on: 2014-8-15
 *      Author: asus
 */

#include "head.h"

void IIC_Init(void)
{
    //IIC0->SCL B2                IIC0->SDA B3
    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);            //使能IIC时钟
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);        //使能B口

    // 将PB2的功能选择为I2C0模块的时钟信号,将PB3选择为数据信号
    GPIOPinConfigure(GPIO_PB2_I2C0SCL);
    GPIOPinConfigure(GPIO_PB3_I2C0SDA);
    // 对PB2和PB3两个引脚做有关I2C功能的配置
    GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);

    /*这里配置了IIC为回送模式 Datasheet p1003*/
    // 寄存器操作:将I2C0模块配置为运行于LOOPBACK模式。
    // 在LOOPBACK模式下,I2C0模块在内部连接了主、从模块的信号线。
    // 因此既可以作为主模块发送数据,也可以作为从模块接收数据
    HWREG(I2C0_BASE + I2C_O_MCR) |= 0x01;


    // 使能并初始化I2C0的主模块,对于I2C0模块使用系统时钟。
    // 语句的最后一个参数是用来设定数据传输速率的。
    // false表示传输速率是100kbps,true则意味着传输速率是400kbps。
    //此处使用的是400kbps的传输速率
    I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), true);
    I2CMasterEnable(I2C0_BASE);

//    // 使能I2C0从模块。注:只是为了测试使用。
    I2CSlaveEnable(I2C0_BASE);
//
//    // 设置从模块的地址
//    I2CSlaveInit(I2C0_BASE, SLAVE_ADDRESS);
//
//
//    // 设置I2C0主模块将要放在总线上的从模块地址
//    // false代表主模块发送,从模块接收
//    I2CMasterSlaveAddrSet(I2C0_BASE, SLAVE_ADDRESS, false);



}


int IIC_Write(u8 slave_addr,u8 reg_addr,u8 data)
{
    //设置I2C0主模块将要放在总线上的从模块地址
    //false代表主模块发送,从模块接收

    I2CMasterSlaveAddrSet(I2C0_BASE, slave_addr, false);            //写入从机地址
    I2CMasterDataPut(I2C0_BASE, reg_addr);                            //从机寄存器地址
    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
    while(I2CMasterBusy(I2C0_BASE))
    {
    }
    // 主模块开始发送寄存器地址
    I2CMasterDataPut(I2C0_BASE, data);
    // 主模块开始发送数据
    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
    while(I2CMasterBusy(I2C0_BASE))
    {
    }
    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_STOP);
    while(I2CMasterBusy(I2C0_BASE))
    {
    }
    return 1;
}

u8 IIC_Read(u8 slave_addr,u8 reg_addr)
{
    u8  data;
    I2CMasterSlaveAddrSet(I2C0_BASE, slave_addr, false);            //发送从机地址,写模式
    I2CMasterDataPut(I2C0_BASE, reg_addr);                            //写入要读的寄存器的地址
    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);   //开始写
    while(I2CMasterBusy(I2C0_BASE))
    {
    }
    I2CMasterSlaveAddrSet(I2C0_BASE, slave_addr, true);                //发送从机地址,读模式
    I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);        //开始读
    while(I2CMasterBusy(I2C0_BASE))                                    //等待读完成
    {
    }
    data= I2CMasterDataGet(I2C0_BASE);
    return data;
}

6050的

/*
 * mpu6050.c
 *
 *  Created on: 2014-8-15
 *      Author: asus
 */
#include "head.h"
#include "IIC.h"

u8 BUF[15]={0};
double T_X,T_Y,T_Z,A_X,A_Y,A_Z,T_T;
void delay5ms(void)
{
   u16 i=5000;
   while(i)
   {
     i--;
   }
}

void MPU6050_Init(void)
{
//    i2c_write(MPU6050_Addr,PWR_MGMT_1, 1,0x80);
//    delay5ms();
//    i2c_write(MPU6050_Addr,PWR_MGMT_1,1, 0x00);
//    delay5ms();    //解除休眠状态
//    i2c_write(MPU6050_Addr,SMPLRT_DIV,1, 0x07);
//    delay5ms();//采样速率为
//    i2c_write(MPU6050_Addr,CONFIG, 1,0x06);
//    delay5ms();
//    i2c_write(MPU6050_Addr,GYRO_CONFIG, 1,0x08);
//    delay5ms(); //陀螺仪检测范围500度/秒
//    i2c_write(MPU6050_Addr,ACCEL_CONFIG, 0x08);
//    delay5ms();  //加速器检测范围4G
    IIC_Write(MPU6050_Addr,PWR_MGMT_1, 0x80);
    delay5ms();
    IIC_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);
    delay5ms();    //解除休眠状态
    IIC_Write(MPU6050_Addr,SMPLRT_DIV, 0x07);
    delay5ms();//采样速率为
    IIC_Write(MPU6050_Addr,CONFIG, 0x06);
    delay5ms();
    IIC_Write(MPU6050_Addr,GYRO_CONFIG, 0x08);
    delay5ms(); //陀螺仪检测范围500度/秒
    IIC_Write(MPU6050_Addr,ACCEL_CONFIG, 0x08);
    delay5ms();  //加速器检测范围4G
}


void MPU6050_Read(void)
{
       BUF[0]=IIC_Read(MPU6050_Addr,GYRO_XOUT_L);
       BUF[1]=IIC_Read(MPU6050_Addr,GYRO_XOUT_H);
       T_X=    (BUF[1]<<8)|BUF[0];
       T_X/=16.4;                            //读取计算X轴角速度

       BUF[2]=IIC_Read(MPU6050_Addr,GYRO_YOUT_L);
       BUF[3]=IIC_Read(MPU6050_Addr,GYRO_YOUT_H);
       T_Y=    (BUF[3]<<8)|BUF[2];
       T_Y/=16.4;                            //读取计算Y轴角速度
       BUF[4]=IIC_Read(MPU6050_Addr,GYRO_ZOUT_L);
       BUF[5]=IIC_Read(MPU6050_Addr,GYRO_ZOUT_H);
       T_Z=    (BUF[5]<<8)|BUF[4];
       T_Z/=16.4;                            //读取计算Z轴角速度

       BUF[6]=IIC_Read(MPU6050_Addr,ACCEL_XOUT_L);
       BUF[7]=IIC_Read(MPU6050_Addr,ACCEL_XOUT_H);
       A_X=    (BUF[7]<<8)|BUF[6];
       A_X/=8192.0;                            //读取计算X轴加速度

       BUF[8]=IIC_Read(MPU6050_Addr,ACCEL_YOUT_L);
       BUF[9]=IIC_Read(MPU6050_Addr,ACCEL_YOUT_H);
       A_Y=    (BUF[9]<<8)|BUF[8];
       A_Y/=8192.0;                            //读取计算Y轴加速度

       BUF[10]=IIC_Read(MPU6050_Addr,ACCEL_ZOUT_L);
       BUF[11]=IIC_Read(MPU6050_Addr,ACCEL_ZOUT_H);
       A_Z=    (BUF[11]<<8)|BUF[10];
       A_Z/=8192.0;                            //读取计算Z轴加速度

       BUF[12]=IIC_Read(MPU6050_Addr,TEMP_OUT_L);
       BUF[13]=IIC_Read(MPU6050_Addr,TEMP_OUT_H);
       T_T=(BUF[13]<<8)|BUF[12];
       T_T = 35+ ((double) (T_T + 13200)) / 280;// 读取计算出温度

       BUF[14]=IIC_Read(MPU6050_Addr,WHO_AM_I);
}