模拟IIC 连接MPU6050 没反应

lanchengkai 2015-11-22 02:16:44
模拟IIC 连接MPU6050 连WHO AM I 都读不出来 应该是我的I2C哪里写错了
大家帮我看看 问题出在哪里


#ifndef _I2C_H
#define _I2C_H
#include <stm32f10x.h>
#include <delay.h>


/*SCL-----PB10 SDA-------PB11*/
#define PORT GPIOB
#define SCL GPIO_Pin_10
#define SDA GPIO_Pin_11
#define I2C_SCL_H() GPIO_SetBits(PORT,SCL)
#define I2C_SCL_L() GPIO_ResetBits(PORT,SCL)
#define I2C_SDA_H() GPIO_SetBits(PORT,SCL)
#define I2C_SDA_L() GPIO_ResetBits(PORT,SCL)
#define I2C_READ_SDA() GPIO_ReadInputDataBit(PORT,SDA)
#define I2C_READ_SCL() GPIO_ReadInputDataBit(PORT,SCL)

#define I2C_READY 0
#define I2C_BUSY 1
#define I2C_ERROR 2

#define I2C1_SlAVE_ADDRRESS7 0xa0

void SI2C_Config(void );
uint8_t I2C_FRAM_BuffWrite(uint8_t addr,uint8_t reg,uint8_t data);
uint8_t I2C_FRAM_BuffRead(uint8_t addr,uint8_t reg,uint8_t *data);

#endif



#include <i2c.h>
uint8_t FRAM_ADDRESS;
/*-------------------------------------------------------*/
//Function
/*
I2C 专用延时
*/
static void I2C_delay(void ){
uint8_t t=7;
while(t--);
}
void SI2C_Config(){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = SDA | SCL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_Init(PORT,&GPIO_InitStructure);

I2C_SDA_H();
I2C_SCL_H();
}

uint8_t I2C_START(){
I2C_SDA_H();I2C_SCL_H();
I2C_delay();
if(!I2C_READ_SDA()){
return ERROR;
}
I2C_SDA_L();I2C_delay();
if(I2C_READ_SDA()){
return ERROR;
}
I2C_SDA_L();I2C_delay();
return SUCCESS;
}

void I2C_STOP(){
I2C_SCL_L();I2C_delay();
I2C_SDA_L();I2C_delay();
I2C_SCL_H();I2C_delay();
I2C_SDA_H();I2C_delay();
}

void I2C_ACK(){
I2C_SCL_L();I2C_delay();
I2C_SDA_L();I2C_delay();
I2C_SCL_H();I2C_delay();
I2C_SCL_L();I2C_delay();
}

void I2C_NoACK(){
I2C_SCL_L();I2C_delay();
I2C_SDA_H();I2C_delay();
I2C_SCL_H();I2C_delay();
I2C_SCL_L();I2C_delay();
}

uint8_t I2C_WaitACK(){
I2C_SCL_L();I2C_delay();
I2C_SDA_H();I2C_delay();
I2C_SCL_H();I2C_delay();
if(I2C_READ_SDA()){
I2C_SCL_L();
return ERROR;
}
I2C_SCL_L();
return SUCCESS;
}

void I2C_SendByte(uint8_t Byte){
uint8_t i=8;
while(i--){
I2C_SCL_L();I2C_delay();
if(Byte&0x80){
I2C_SDA_H();
}else{
I2C_SDA_L();
}
Byte <<=1;I2C_delay();
I2C_SCL_H();I2C_delay();
//I2C_SCL_L();I2C_delay();
}
I2C_SCL_L();
}

uint8_t I2C_ReceiveByte(){
uint8_t i=8,Byte=0;
I2C_SDA_H();
while(i--){
Byte<<=1;
I2C_SCL_L();I2C_delay();
I2C_SCL_H();I2C_delay();
if(I2C_READ_SDA()){
Byte|=0x01;
}
}
I2C_SCL_L();
return Byte;
}

uint8_t I2C_FRAM_BuffWrite(uint8_t addr,uint8_t reg,uint8_t data){
if(!I2C_START()){
return ERROR;
}
I2C_SendByte(addr<< 1 | 1);
if(!I2C_WaitACK()){
I2C_STOP();
return ERROR;
}
I2C_SendByte(reg);
I2C_WaitACK();
I2C_SendByte(data);
if(!I2C_WaitACK()){
I2C_STOP();
return ERROR;
}
I2C_STOP();
return SUCCESS;
}

uint8_t I2C_FRAM_BuffRead(uint8_t addr,uint8_t reg,uint8_t *data){
if(I2C_START()){
return ERROR;
}
I2C_SendByte(addr<<1 | 1);
//I2C_SendByte(addr);
if(!I2C_WaitACK()){
I2C_STOP();
return ERROR;
}
I2C_SendByte(reg);
I2C_WaitACK();
I2C_START();
I2C_SendByte(addr<<1 |0);
I2C_WaitACK();
*data = I2C_ReceiveByte();
//I2C_WaitACK();
I2C_NoACK();
I2C_STOP();
return SUCCESS;
}




#ifndef _I2CMPU6050_H
#define _I2CMPU6050_H
#include <stm32f10x.h>
#include <math.h>
#include <led.h>

#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
#define mpuCONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)
#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)
#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)
#define SlaveAddress 0xD0 //IIC写入时的地址字节数据

void I2C_Mode_Config(void);
void I2C_MPU6050_Init(void);
int16_t GetData(uint8_t REG_Address);
#endif



#include <i2cmpu6050.h>
#include <i2c.h>
#include <usart.h>
/*总线模式配置*/
void I2C_Mode_Config(){
SI2C_Config();
}

void I2C_MPU6050_Init(void){
uint8_t i;
I2C_FRAM_BuffWrite(SlaveAddress,PWR_MGMT_1,0);
I2C_FRAM_BuffWrite(SlaveAddress,SMPLRT_DIV,0x07);
I2C_FRAM_BuffWrite(SlaveAddress,mpuCONFIG,0x06);
I2C_FRAM_BuffWrite(SlaveAddress,GYRO_CONFIG,0x18);
I2C_FRAM_BuffWrite(SlaveAddress,ACCEL_CONFIG,0x01);

I2C_FRAM_BuffRead(SlaveAddress,WHO_AM_I,&i);
printf("%d\r\n",i);
}
int16_t GetData(uint8_t REG_Address)
{
uint8_t H,L;
I2C_FRAM_BuffRead(SlaveAddress,REG_Address,&H);
I2C_FRAM_BuffRead(SlaveAddress,REG_Address+1,&L);
return (H<<8)+L; //合成数据
}
...全文
480 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mark_md 2015-11-23
  • 打赏
  • 举报
回复
遇到这种总线通讯问题,首先不要看代码,表笔连总线上看示波器或逻辑分析仪。iic总线的协议就那么点,对照下就知道自己哪里错了。记得,总线问题别贴代码,烦,看一眼示波器就啥都知道了

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧