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.
我用的是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);
}