mpu6050 写mpu9250寄存器手册地址收到否应答

MPU6050器件地址问题
&& |&& 浏览量
在调MPU6050,AD0悬空或者接地都可以读出器件地址为0x68,但是将AD0接高电平,应该读出的地址为0x69,但是我读到的是0xFF。u8 MPU_Init(void)
MPU_IIC_Init();//初始化IIC总线
delay_ms(1);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050
delay_ms(100);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒MPU6050
MPU_Set_Gyro_Fsr(3);
//陀螺仪传感器,±2000dps
MPU_Set_Accel_Fsr(0);
//加速度传感器,±2g
MPU_Set_Rate(50);
//设置采样率50Hz
MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭
MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFO
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
if(res==MPU_ADDR)//器件ID正确
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作
MPU_Set_Rate(50);
//设置采样率为50Hz
}else return 1;
#define MPU_SELF_TESTX_REG
0X0D //自检寄存器X
#define MPU_SELF_TESTY_REG
0X0E //自检寄存器Y
#define MPU_SELF_TESTZ_REG
0X0F //自检寄存器Z
#define MPU_SELF_TESTA_REG
0X10 //自检寄存器A
#define MPU_SAMPLE_RATE_REG
0X19 //采样频率分频器
#define MPU_CFG_REG
0X1A //配置寄存器
#define MPU_GYRO_CFG_REG
0X1B //陀螺仪配置寄存器
#define MPU_ACCEL_CFG_REG
0X1C //加速度计配置寄存器
#define MPU_MOTION_DET_REG
0X1F //运动检测阀值设置寄存器
#define MPU_FIFO_EN_REG
0X23 //FIFO使能寄存器
#define MPU_I2CMST_CTRL_REG
0X24 //IIC主机控制寄存器
#define MPU_I2CSLV0_ADDR_REG 0X25 //IIC从机0器件地址寄存器
#define MPU_I2CSLV0_REG
0X26 //IIC从机0数据地址寄存器
#define MPU_I2CSLV0_CTRL_REG 0X27 //IIC从机0控制寄存器
#define MPU_I2CSLV1_ADDR_REG 0X28 //IIC从机1器件地址寄存器
#define MPU_I2CSLV1_REG
0X29 //IIC从机1数据地址寄存器
#define MPU_I2CSLV1_CTRL_REG 0X2A //IIC从机1控制寄存器
#define MPU_I2CSLV2_ADDR_REG 0X2B //IIC从机2器件地址寄存器
#define MPU_I2CSLV2_REG
0X2C //IIC从机2数据地址寄存器
#define MPU_I2CSLV2_CTRL_REG 0X2D //IIC从机2控制寄存器
#define MPU_I2CSLV3_ADDR_REG 0X2E //IIC从机3器件地址寄存器
#define MPU_I2CSLV3_REG
0X2F //IIC从机3数据地址寄存器
#define MPU_I2CSLV3_CTRL_REG 0X30 //IIC从机3控制寄存器
#define MPU_I2CSLV4_ADDR_REG 0X31 //IIC从机4器件地址寄存器
#define MPU_I2CSLV4_REG
0X32 //IIC从机4数据地址寄存器
#define MPU_I2CSLV4_DO_REG
0X33 //IIC从机4写数据寄存器
#define MPU_I2CSLV4_CTRL_REG 0X34 //IIC从机4控制寄存器
#define MPU_I2CSLV4_DI_REG
0X35 //IIC从机4读数据寄存器
#define MPU_I2CMST_STA_REG
0X36 //IIC主机状态寄存器
#define MPU_INTBP_CFG_REG
0X37 //中断/旁路设置寄存器
#define MPU_INT_EN_REG
0X38 //中断使能寄存器
#define MPU_INT_STA_REG
0X3A //中断状态寄存器
#define MPU_ACCEL_XOUTH_REG
0X3B //加速度值,X轴高8位寄存器
#define MPU_ACCEL_XOUTL_REG
0X3C //加速度值,X轴低8位寄存器
#define MPU_ACCEL_YOUTH_REG
0X3D //加速度值,Y轴高8位寄存器
#define MPU_ACCEL_YOUTL_REG
0X3E //加速度值,Y轴低8位寄存器
#define MPU_ACCEL_ZOUTH_REG
0X3F //加速度值,Z轴高8位寄存器
#define MPU_ACCEL_ZOUTL_REG
0X40 //加速度值,Z轴低8位寄存器
#define MPU_TEMP_OUTH_REG
0X41 //温度值高八位寄存器
#define MPU_TEMP_OUTL_REG
0X42 //温度值低8位寄存器
#define MPU_GYRO_XOUTH_REG
0X43 //陀螺仪值,X轴高8位寄存器
#define MPU_GYRO_XOUTL_REG
0X44 //陀螺仪值,X轴低8位寄存器
#define MPU_GYRO_YOUTH_REG
0X45 //陀螺仪值,Y轴高8位寄存器
#define MPU_GYRO_YOUTL_REG
0X46 //陀螺仪值,Y轴低8位寄存器
#define MPU_GYRO_ZOUTH_REG
0X47 //陀螺仪值,Z轴高8位寄存器
#define MPU_GYRO_ZOUTL_REG
0X48 //陀螺仪值,Z轴低8位寄存器
#define MPU_I2CSLV0_DO_REG
0X63 //IIC从机0数据寄存器
#define MPU_I2CSLV1_DO_REG
0X64 //IIC从机1数据寄存器
#define MPU_I2CSLV2_DO_REG
0X65 //IIC从机2数据寄存器
#define MPU_I2CSLV3_DO_REG
0X66 //IIC从机3数据寄存器
#define MPU_I2CMST_DELAY_REG 0X67 //IIC主机延时管理寄存器
#define MPU_SIGPATH_RST_REG
0X68 //信号通道复位寄存器
#define MPU_MDETECT_CTRL_REG 0X69 //运动检测控制寄存器
#define MPU_USER_CTRL_REG
0X6A //用户控制寄存器
#define MPU_PWR_MGMT1_REG
0X6B //电源管理寄存器1
#define MPU_PWR_MGMT2_REG
0X6C //电源管理寄存器2
#define MPU_FIFO_CNTH_REG
0X72 //FIFO计数寄存器高八位
#define MPU_FIFO_CNTL_REG
0X73 //FIFO计数寄存器低八位
#define MPU_FIFO_RW_REG
0X74 //FIFO读写寄存器
#define MPU_DEVICE_ID_REG
0X75 //器件ID寄存器
//如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位).
//如果接V3.3,则IIC地址为0X69(不包含最低位).
#define MPU_ADDR
向有经验的人请教下!
分享
MPU_IIC_Init();//初始化IIC总线
delay_ms(100); //改成100ms看看
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050如上,不過依照您問題來看接線品質佔問題90%(訊號不穩定),加多初始化延遲試看看囉(10%)
回答点赞:&&
回复了&MOP:明天找点好的线再试试。
如果是模塊的MPU6050,加上您說AD0未接3.3時候可以讀到ID,那麼最大可能是杜邦線或者接線太長,請盡量縮短之前我在SWD接線時候遇過,可能是線長太長造成干擾或者衰減,換短線長的就OK了,您試看看
回答点赞:&&
gtrjolin1986
回复了&MOP:尝试了仍然不成功,但是非常感谢您的回答。
IIC 总线我估计出来问题时序没有调好,你要先调好IIC总线。一般时序没有问题,就不会出现你那个问题。你那个是没有读到信息。
回答点赞:&&
gtrjolin1986
回复了&冰山一角:谢谢。用地址0x68可以比较好的读出MPU6050数据,I2C有问题概率不大吧。
你这个好多,看得眼花,呵呵,帮你顶一下好了
回答点赞:&&
回复了&zhangsf_chongzai:谢谢!
其他未解决问题
ALTERA AX301 FPGA开发板
产品总数:3个&&申请人数:35人
电子世界,其乐无穷。
热门单片机
在学习FPGA的道路上 我们一起成长吧!
在路上的Linuxer
Linux 系统
STM32讨论区
PCB技术/设计/定制
用愛和熱忱寫好每一行Code
Linux 系统
热门单片机
Linux系统 、热门开发板
Linux 系统
内容质量差:内容太水、伸手党
垃圾广告信息:广告、招聘、推广、测试内容等
偏离问答主题:与技术无关、讨论类
与社区已有内容重复:
违规内容:色情、暴力、血腥、敏感信息等
不友善内容:人事攻击、挑衅辱骂、恶意行为
以上选项都不是:
恭喜你,成功获得一张 “
(总共获得 “
” 张字卡)
恭喜你,成功获得一张 “ 万能卡 ”
(万能卡可替代所有卡片中的任何一张)
哎呀,拆礼物的姿势不对!
双旦卡又飞走啦
恭喜你,成功集齐5张字卡
获得一次兑奖机会MPU6050寄存器中文-常用文档-电子产品世界
|||||||||||
& MPU6050寄存器中文
MPU6050寄存器中文
MPU6050寄存器中文……
分享给小伙伴们:
MPU6050寄存器中文
该用户资料分享
微信公众号二
微信公众号一查看: 7144|回复: 27
K60硬件IIC读写MPU6050程序
#ifndef& &&&__MK60_MPU6050_H__
#define& &&&__MK60_MPU6050_H__
//定义IIC的端口和波特率
//****************************************
#define& &I2C_n& &I2C0
#define& &baud_n& & 400 * 1000
extern uint8
// 定义MPU6050内部地址
//****************************************
#define& & & & SMPLRT_DIV& & & & & & & & 0x19& & & & //陀螺仪采样率,典型值:0x07(125Hz)
#define& & & & CONFIG& & & & & & & & & & & & 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 PWR_MGMT_2& && && && &&&0x6C
#define& & & & WHO_AM_I& & & & & & & & 0x75& & & & //IIC地址寄存器(默认数值0x68,只读)
#define& & & & SlaveAddress& & & && && && &0x68& & & & //IIC写入时的地址字节数据,+1为读取& &0xD0&&
//模拟IIC用0xD0作为地址
//硬件IIC用0x68作为地址
//实际上&&0x68 是 0xD0 的高7位
extern uint8 mpu6050_init(void);
extern int16 mpu6050_ACCEL_X_data();
extern int16 mpu6050_ACCEL_Y_data();
extern int16 mpu6050_ACCEL_Z_data();
extern int16 mpu6050_GYRO_X_data();
extern int16 mpu6050_GYRO_Y_data();
extern int16 mpu6050_GYRO_Z_data();
extern int16 mpu6050_TEMP_OUT_data();
#endif&&//__MK60_MPU6050_H__
#include &common.h&
#include &MK60_i2c.h&
#include &MK60_MPU6050.h&
uint8 DATA_H,DATA_L;
//*********mpu6050初始化*************************
uint8 mpu6050_init()& && && && && && && && && && && &&&//mpu6050初始化
&&i2c_init(I2C_n, baud_n);
&&i2c_write_reg(I2C_n,SlaveAddress,PWR_MGMT_1,0x00);& &&&//解除休眠状态
&&i2c_write_reg(I2C_n,SlaveAddress,SMPLRT_DIV,0x07);
&&i2c_write_reg(I2C_n,SlaveAddress,CONFIG,0x06);
&&//下面两个寄存器可以设置转换后数据的精度& &0x08 最大值为 )
&&i2c_write_reg(I2C_n,SlaveAddress,GYRO_CONFIG,0x18);& & //
&&i2c_write_reg(I2C0,SlaveAddress,ACCEL_CONFIG,0x01);& &//
&&data = i2c_read_reg(I2C_n,SlaveAddress,WHO_AM_I);
&&if(data == 0x68)
& & return 1;
& & return 0;
//*********读 加速度计X轴 数据*******************
int16 mpu6050_ACCEL_X_data()& && && && && && && && && && && && &
&&DATA_H = i2c_read_reg(I2C_n,SlaveAddress,ACCEL_XOUT_H);
&&DATA_L = i2c_read_reg(I2C_n,SlaveAddress,ACCEL_XOUT_L);
&&return (DATA_H&&8)+DATA_L;
//*********读 加速度计Y轴 数据*******************
int16 mpu6050_ACCEL_Y_data()& && && && && && && && && && && && &
&&DATA_H = i2c_read_reg(I2C_n,SlaveAddress,ACCEL_YOUT_H);
&&DATA_L = i2c_read_reg(I2C_n,SlaveAddress,ACCEL_YOUT_L);
&&return (DATA_H&&8)+DATA_L;
//*********读 加速度计X轴 数据*******************
int16 mpu6050_ACCEL_Z_data()& && && && && && && && && && && && &
&&DATA_H = i2c_read_reg(I2C_n,SlaveAddress,ACCEL_ZOUT_H);
&&DATA_L = i2c_read_reg(I2C_n,SlaveAddress,ACCEL_ZOUT_L);
&&return (DATA_H&&8)+DATA_L;
//*********读 陀螺仪计X轴 数据*******************
int16 mpu6050_GYRO_X_data()& && && && && && && && && && && && &
&&DATA_H = i2c_read_reg(I2C_n,SlaveAddress,GYRO_XOUT_H);
&&DATA_L = i2c_read_reg(I2C_n,SlaveAddress,GYRO_XOUT_L);
&&return (DATA_H&&8)+DATA_L;
//*********读 陀螺仪计Y轴 数据*******************
int16 mpu6050_GYRO_Y_data()& && && && && && && && && && && && &
&&DATA_H = i2c_read_reg(I2C_n,SlaveAddress,GYRO_YOUT_H);
&&DATA_L = i2c_read_reg(I2C_n,SlaveAddress,GYRO_YOUT_L);
&&return (DATA_H&&8)+DATA_L;
//*********读 陀螺仪计Z轴 数据*******************
int16 mpu6050_GYRO_Z_data()& && && && && && && && && && && && &
&&DATA_H = i2c_read_reg(I2C_n,SlaveAddress,GYRO_ZOUT_H);
&&DATA_L = i2c_read_reg(I2C_n,SlaveAddress,GYRO_ZOUT_L);
&&return (DATA_H&&8)+DATA_L;
//*********读 温度 数据*******************
int16 mpu6050_TEMP_OUT_data()& && && && && && && && && && && && &
&&DATA_H = i2c_read_reg(I2C_n,SlaveAddress,TEMP_OUT_H);
&&DATA_L = i2c_read_reg(I2C_n,SlaveAddress,TEMP_OUT_L);
&&return (DATA_H&&8)+DATA_L;
仅仅能用而已,程序写的渣,大家见笑了
最近也在搞IIC,可是我用的是旧的库,里面的IIC和你说的不一样,LZ能分享一下你的IIC程序吗?
if(data == 0x68)
& & return 1;
WHO_AM_I&&的地址是 0x75,他是只读寄存器,若配置成功,他的值是0x68,所以用这个值判断是否初始化成功
论坛上也有人分享过,不过k60的硬件i2c,真心觉得渣渣的,老是不稳定。
赞一下楼主的分享
羊恬美 发表于
论坛上也有人分享过,不过k60的硬件i2c,真心觉得渣渣的,老是不稳定。一直在用啊,没有不稳定,只是IIC的通道1不好用,通道0没啥问题的
一直在用啊,没有不稳定,只是IIC的通道1不好用,通道0没啥问题的
能分享一下你的IIC程序吗?谢谢!
uint8 mpu6050_init()&&里面的return 返回值1和0各代表什么情况啊,还有 寄存器 WHO_AM_I不是0x75&&吗,还是他的默认值0x68?
if(data == 0x68)
& & return 1;
& & return 0;
为啥判断data==ox68?
surviver 发表于
最近也在搞IIC,可是我用的是旧的库,里面的IIC和你说的不一样,LZ能分享一下你的IIC程序吗?我用的是硬件IIC,新老版底层不一样,不能直接添加文件吧
小树 发表于
uint8 mpu6050_init()&&里面的return 返回值1和0各代表什么情况啊,还有 寄存器 WHO_AM_I不是0x75&&吗,还是他的默认值0x68?WHO_AM_I&&的地址是 0x75,他是只读寄存器,若配置成功,他的值是0x68,所以用这个值判断是否初始化成功
能分享一下你的IIC程序吗?谢谢!
这是我的5.3版本底层里的硬件IIC
*& &&&COPYRIGHT NOTICE
*& &&&Copyright (c) 2013,山外科技
*& &&&All rights reserved.
*& &&&技术讨论:山外论坛
*& &&&除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
*& &&&修改内容时必须保留山外科技的版权声明。
* @file& && & MK60_i2c.h
* @brief& && &i2c驱动头文件
* @author& &&&山外科技
* @version& & v5.0
* @date& && &
* @note& && & 目前仅实现主机读写寄存器功能,其他功能待实现
#ifndef& &&&__MK60_I2C_H__
#define& &&&__MK60_I2C_H__
*&&@brief I2C模块编号
typedef enum
& & I2C0&&= 0,
& & I2C1&&= 1
*&&@brief 主机读写模式选择
typedef enum MSmode
& & MWSR =& &0x00,&&/* 主机写模式&&*/
& & MRSW =& &0x01& &/* 主机读模式&&*/
//目前代码仅支持 I2C主机模式
extern uint32&&i2c_init(I2Cn_e i2cn, uint32 baud);& && && && && && && && && && & //初始化I2C
extern void& & i2c_write_reg(I2Cn_e, uint8 SlaveID, uint8 reg, uint8 Data);& && &//写入数据到寄存器
extern uint8& &i2c_read_reg (I2Cn_e, uint8 SlaveID, uint8 reg);& && && && && && &//读取寄存器的数据
#endif&&//__MK60_I2C_H__
*& &&&COPYRIGHT NOTICE
*& &&&Copyright (c) 2013,山外科技
*& &&&All rights reserved.
*& &&&技术讨论:山外论坛
*& &&&除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
*& &&&修改内容时必须保留山外科技的版权声明。
* @file& && & MK60_i2c.c
* @brief& && &i2c驱动函数
* @author& &&&山外科技
* @version& & v5.0
* @date& && &
#include &common.h&
#include &MK60_port.h&
#include &MK60_i2c.h&
unsigned char MasterT
unsigned char SlaveID;
I2C_MemMapPtr I2CN[2] = {I2C0_BASE_PTR, I2C1_BASE_PTR}; //定义两个指针数组保存 I2CN 的地址
*&&把I2C通信的每个小步骤都用宏定义来实现,方便编写顶层函数
*&&此宏定义参考飞思卡尔公司例程修改所得
//启动信号
#define i2c_Start(I2Cn)& && && && & I2C_C1_REG(I2CN[I2Cn]) |= (I2C_C1_TX_MASK | I2C_C1_MST_MASK)& & //MST 由0变1,产生起始信号,TX = 1 进入发送模式
//停止信号
#define i2c_Stop(I2Cn)& && && && &&&I2C_C1_REG(I2CN[I2Cn]) &= ~(I2C_C1_MST_MASK | I2C_C1_TX_MASK)& &//MST 由1变0,产生停止信号,TX = 0 进入接收模式
//重复启动
#define i2c_RepeatedStart(I2Cn)& &&&I2C_C1_REG(I2CN[I2Cn]) |= I2C_C1_RSTA_MASK
//进入接收模式(应答,需要接收多个数据,接收最后一个字节前需要禁用应答i2c_DisableAck)
#define i2c_EnterRxMode(I2Cn)& && & I2C_C1_REG(I2CN[I2Cn]) &= ~(I2C_C1_TX_MASK | I2C_C1_TXAK_MASK)&&//
//进入接收模式(不应答,只接收一个字节)
#define i2c_PutinRxMode(I2Cn)& && & I2C_C1_REG(I2CN[I2Cn]) &= ~I2C_C1_TX_MASK;I2C_C1_REG(I2CN[I2Cn]) |= I2C_C1_TXAK_MASK
//禁用应答(接收最后一个字节)
#define i2c_DisableAck(I2Cn)& && &&&I2C_C1_REG(I2CN[I2Cn]) |= I2C_C1_TXAK_MASK
//等待 I2C_S
#define i2c_Wait(I2Cn)& && && && &&&while(( I2C_S_REG(I2CN[I2Cn]) & I2C_S_IICIF_MASK)==0) {} \
& && && && && && && && && && && && &I2C_S_REG(I2CN[I2Cn]) |= I2C_S_IICIF_MASK;
//写一个字节
#define i2c_write_byte(I2Cn,data)& &(I2C_D_REG(I2CN[I2Cn]) = (data));i2c_Wait(I2Cn)
*&&@brief& && &I2C初始化,设置波特率
*&&@param& && &I2Cn_e& && &I2C模块(I2C0、I2C1)
*&&@param& && &baud& && &&&期待的波特率
*&&@return& && && && && &&&实际的波特率
*&&@since& && &v5.0
*&&Sample usage:& && & i2c_init(I2C0,400*1000);& &&&// 初始化I2C0,期待的波特率为400k
uint32 i2c_init(I2Cn_e i2cn, uint32 baud)
& & if(i2cn == I2C0)
& && &&&/* 开启时钟 */
#if defined(MK60DZ10)
& && &&&SIM_SCGC4 |= SIM_SCGC4_I2C0_MASK;& && && &&&//开启 I2C0时钟
#elif defined( MK60F15)
& && &&&SIM_SCGC4 |= SIM_SCGC4_IIC0_MASK;& && && &&&//开启 I2C0时钟
& && &&&/* 配置 I2C0功能的 GPIO 接口 */
& && &&&if((I2C0_SCL_PIN == PTB0) || (I2C0_SCL_PIN == PTB2) || (I2C0_SCL_PIN == PTD8) )
& && && && &port_init (I2C0_SCL_PIN, ALT2 | ODO | PULLUP );
& && &&&else
& && && && &ASSERT(0);& && && && && && && && && && &//上诉条件都不满足,直接断言失败了,设置管脚有误?
& && &&&if((I2C0_SDA_PIN == PTB1) || (I2C0_SDA_PIN == PTB3) || (I2C0_SDA_PIN == PTD9) )
& && && && &port_init (I2C0_SDA_PIN, ALT2 | ODO | PULLUP );
& && &&&else
& && && && &ASSERT(0);& && && && && && && && && && &//上诉条件都不满足,直接断言失败了,设置管脚有误?
& && &&&/* 开启时钟 */
#if defined(MK60DZ10)
& && &&&SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK;& && && &&&//开启 I2C1时钟
#elif defined(MK60F15)
& && &&&SIM_SCGC4 |= SIM_SCGC4_IIC1_MASK;& && && &&&//开启 I2C1时钟
& && &&&/* 配置 I2C1功能的 GPIO 接口 */
& && &&&if(I2C1_SCL_PIN == PTE1)
& && && && &port_init (I2C1_SCL_PIN, ALT6 | ODO | PULLUP );
& && &&&else if(I2C1_SCL_PIN == PTC10)
& && && && &port_init (I2C1_SCL_PIN, ALT2 | ODO | PULLUP );
& && &&&else
& && && && &ASSERT(0);& && && && && && && && &&&//上诉条件都不满足,直接断言失败了,设置管脚有误?
& && &&&if(I2C1_SDA_PIN == PTE0)
& && && && &port_init (I2C1_SDA_PIN, ALT6 | ODO | PULLUP );
& && &&&else if (I2C1_SDA_PIN == PTC11)
& && && && &port_init (I2C1_SDA_PIN, ALT2 | ODO | PULLUP );
& && &&&else
& && && && &ASSERT(0);& && && && && && && && &&&//上诉条件都不满足,直接断言失败了,设置管脚有误?
& & /* 设置频率 */
& & // I2C baud rate = bus speed (Hz)/(mul × SCL divider)&&即这里 50MHz/(1 ×128)=390.625kHz
& & // SDA hold time = bus period (s) × mul × SDA hold value
& & // SCL start hold time = bus period (s) × mul × SCL start hold value
& & // SCL stop hold time = bus period (s) × mul × SCL stop hold value
& & //查表 ICR 对应的&&SCL_divider ,见 《K60P144M100SF2RM.pdf》第1468页的 I2C Divider and Hold Values
& & uint16 ICR_2_SCL_divider[0x40]&&=
& && &&&20, 22, 24, 26, 28, 30, 34, 40, 28, 32, 36, 40, 44, 48, 56, 68,
& && &&&48, 56, 64, 72, 80, 88, 104, 128, 80, 96, 112, 128, 144, 160, 192, 240,
& && &&&160, 192, 224, 256, 288, 320, 384, 480, 320, 384, 448, 512, 576, 640, 768, 960,
& && &&&640, 768, 896, , , , , , , 3840
& & if(bus_clk_khz &= 50000)mult = 0;& && && &//bus 一分频
& & else&&if(bus_clk_khz &= 100000)mult = 1;&&//bus 二分频
& & else& && &mult = 2;& && && && && && && &&&//bus 四分频
& & uint16 scldiv =&&bus_clk_khz * 1000 / ( (1&&mult) * baud );&&//最佳的分频系数
& & //需要从 ICR_2_SCL_divider 里找到 与最佳分频系数scldiv最相近的 分频系数
& & uint8 icr, n = 0x40;
& & uint16 min_Dvalue = ~0, D
& & while(n)& && && && && && && && && && && && && && &&&//循环里逐个扫描,找出最接近的 分频系数
& && &&&n--;
& && &&&Dvalue = abs(scldiv - ICR_2_SCL_divider[n]);
& && &&&if(Dvalue == 0)
& && && && &icr =
& && && && && && && && && && && && && && && && &&&//退出while循环
& && &&&if(Dvalue & min_Dvalue)
& && && && &icr =
& && && && &min_Dvalue = D
& & I2C_F_REG(I2CN[i2cn])&&= ( 0& && && && && && && && &// I2C Frequency Divider register (I2Cx_F)&&I2C分频寄存器& &I2C最大波特率为 400k
& && && && && && && && && && & | I2C_F_MULT(mult)& && &&&// 乘数因子 mul =&&1&&MULT
& && && && && && && && && && & | I2C_F_ICR(icr)& && && & // 时钟速率 = ICR_2_SCL_divider[ICR] ,查表获得 ICR 与 SCL_divider 映射关系
& && && && && && && && && &&&);
& & /* 使能 I2C */
& & I2C_C1_REG(I2CN[i2cn]) = ( 0
& && && && && && && && && && & | I2C_C1_IICEN_MASK& && & //使能I2C
& && && && && && && && && && & //| I2C_C1_IICIE_MASK& && & //使能中断
& && && && && && && && && &&&);
& & return (&&bus_clk_khz * 1000 / ( (1&&mult) * ICR_2_SCL_divider[icr])&&);
*&&@brief& && &I2C通信结束后需要调用的函数函数
*&&@since& && &v5.0
*&&@note& && & 如果通信失败,可尝试增大此延时值,确认是否延时导致的
void i2c_delay(void)
& & volatile uint16 n = 80;& &&&//注意,这个数据太小,会导致读取错误。
& & while(n--)
& && &&&asm(&nop&);
*&&@brief& && &读取I2C设备指定地址寄存器的数据
*&&@param& && &I2Cn_e& && &&&I2C模块(I2C0、I2C1)
*&&@param& && &SlaveID& &&&从机地址(7位地址)
*&&@param& && &reg& && && &从机寄存器地址
*&&@return& && && && && &&&读取的寄存器值
*&&@since& && &v5.0
*&&Sample usage:& && & uint8 value = i2c_read_reg(I2C0, 0x1D, 1);
uint8 i2c_read_reg(I2Cn_e i2cn, uint8 SlaveID, uint8 reg)
& & //先写入寄存器地址,再读取数据,因此此过程是 I2C 的复合格式,改变数据方向时需要重新启动
& & ASSERT((SlaveID & 0x80) == 0);& && && && && && && & //断言,我们要求的7位地址的值仅仅是7bit,不是通信时要求的高7位
& & //有些手册,给出的7位地址指的是8bit里的高7位
& & //有些手册,给出的7位地址指的是7bit
& & //请自行确认,可以尝试是否通信正常来确认
& & i2c_Start(i2cn);& && && && && && && && && && && && &//发送启动信号
& & i2c_write_byte(i2cn, ( SlaveID && 1 ) | MWSR);& && &//发送从机地址和写位
& & i2c_write_byte(i2cn, reg);& && && && && && && && &&&//发送从机里的寄存器地址
& & i2c_RepeatedStart(i2cn);& && && && && && && && && & //复合格式,发送重新启动信号
& & i2c_write_byte(i2cn, ( SlaveID && 1) | MRSW );& && &//发送从机地址和读位
& & i2c_PutinRxMode(i2cn);& && && && && && && && && && &//进入接收模式(不应答,只接收一个字节)
& & result = I2C_D_REG(I2CN[i2cn]);& && && && && && && &//虚假读取一次,启动接收数据
& & i2c_Wait(i2cn);& && && && && && && && && && && && & //等待接收完成
& & i2c_Stop(i2cn);& && && && && && && && && && && && & //发送停止信号
& & result = I2C_D_REG(I2CN[i2cn]);& && && && && && && &//读取数据
& & i2c_delay();& && && && && && && && && && && && && & //必须延时一下,否则出错
*&&@brief& && &写入一个字节数据到I2C设备指定寄存器地址
*&&@param& && &I2Cn_e& && &&&I2C模块(I2C0、I2C1)
*&&@param& && &SlaveID& &&&从机地址(7位地址)
*&&@param& && &reg& && && &从机寄存器地址
*&&@param& && &Data& && &&&数据
*&&@since& && &v5.0
*&&Sample usage:& && & i2c_write_reg(I2C0, 0x1D, 1,2);& &&&//向从机0x1D 的寄存器 1 写入数据 2
void i2c_write_reg(I2Cn_e i2cn, uint8 SlaveID, uint8 reg, uint8 Data)
& & i2c_Start(i2cn);& && && && && && && && && && && && &//发送启动信号
& & i2c_write_byte(i2cn, ( SlaveID && 1 ) | MWSR);& && &//发送从机地址和写位
& & i2c_write_byte(i2cn, reg);& && && && && && && && &&&//发送从机里的寄存器地址
& & i2c_write_byte(i2cn, Data);& && && && && && && && & //发送需要写入的数据
& & i2c_Stop(i2cn);
& & i2c_delay();& && && && && && && && && && && && && & //延时太短的话,可能写出错
这是我的5.3版本底层里的硬件IIC
旧库真不能用,不过还是谢谢了!我现在用的其他的硬件IIC程序,可是为啥读出来的只是一个奇怪的固定值呢,比如-1
surviver 发表于
旧库真不能用,不过还是谢谢了!我现在用的其他的硬件IIC程序,可是为啥读出来的只是一个奇怪的固定值呢,比如-1看看从机地址,有的是0xD0,有的是0x68,IIC取得是7位地址,有的是高7位,有的是低7位
//模拟IIC用0xD0作为地址
//硬件IIC用0x68作为地址
看看从机地址,有的是0xD0,有的是0x68,IIC取得是7位地址,有的是高7位,有的是低7位
我读出来了,谢谢!是不是6050读取得速度没有模拟的快啊?为什么和模拟的陀螺仪有一定时间差呢?
surviver 发表于
我读出来了,谢谢!是不是6050读取得速度没有模拟的快啊?为什么和模拟的陀螺仪有一定时间差呢?这就不知道了,没有去试验过
读出来的数据该如何处理呀,他们都是有什么意义?
lz&&为什么我的返回值一直是-1啊?
我读出来了,谢谢!是不是6050读取得速度没有模拟的快啊?为什么和模拟的陀螺仪有一定时间差呢?
你好,我也遇到和你一样的问题,也全是-1,不管怎么改都是-1,请问你是怎么读出来的,谢谢!
我读出来了,谢谢!是不是6050读取得速度没有模拟的快啊?为什么和模拟的陀螺仪有一定时间差呢?
你好,我也遇到和你一样的问题,也全是-1,不管怎么改都是-1,请问你是怎么读出来的,谢谢!
这是我的5.3版本底层里的硬件IIC
楼主你好,我用了好多种方法,但是我测回来的值还一直是-1,请问问题出在哪了?
楼主你好,我用了好多种方法,但是我测回来的值还一直是-1,请问问题出在哪了?
可能是地址问题,它的地址是7位的,至于是高七位还是低七位试一下,还有可能就是IIC通讯异常,你的IIC底层可能有问题,用我的那个IIC,应该就好了
学习了。。。
楼主你好,我用了你的程序,可以接受到数据,但是为什么一次接受的数据不连贯呢?每次都得按一下复位键才能继续发送数据,这是什么原因?
山外飞思卡尔智能车论坛

我要回帖

更多关于 mpu6050寄存器配置 的文章

 

随机推荐