3472|3

71

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

虚拟现实远端消防机器人组进度贴:STM32F746用模拟I2C(二)--读取MPU6050 [复制链接]

 
本帖最后由 天天好心情亲 于 2015-12-14 09:27 编辑

上次用F7的模拟I2C读取了电子罗盘的数据 ,但是无法读取MPU6050的数据,经过稍稍的改动现在成功读取了MPU6050的数据源码和图片如下
  1. /*********I2C*********************/
  2. uint32_t I2CStep;
  3. void I2C1_Delay(void)
  4. {
  5.         I2CStep=50;
  6.         while(I2CStep--);
  7. }       
  8. uint8_t I2C1_Start(void)
  9. {

  10.         I2C_SDA_OUT();
  11.        
  12.         I2C1_SDA_H;
  13.         I2C1_SCL_H;
  14.         I2C1_Delay();
  15.         I2C1_SDA_L;
  16.         I2C1_Delay();
  17.         I2C1_SCL_L;
  18. }
  19. void I2C1_Stop(void)
  20. {

  21.         I2C_SDA_OUT();

  22.    I2C1_SCL_L;
  23.    I2C1_SDA_L;
  24.    I2C1_SCL_H;
  25.    I2C1_Delay();
  26.    I2C1_SDA_H;
  27.    I2C1_Delay();
  28. }
  29. void I2C1_Ack(void)
  30. {

  31.         I2C1_SCL_L;
  32.    I2C_SDA_OUT();
  33.    I2C1_SDA_L;
  34.    I2C1_Delay();
  35.    I2C1_SCL_H;
  36.    I2C1_Delay();
  37.    I2C1_SCL_L;
  38. }
  39. void I2C1_NAck(void)
  40. {

  41.                 I2C1_SCL_L;
  42.    I2C_SDA_OUT();
  43.    I2C1_SDA_H;
  44.    I2C1_Delay();
  45.    I2C1_SCL_H;
  46.    I2C1_Delay();
  47.    I2C1_SCL_L;
  48. }
  49. uint8_t I2C1_WaitAck(void)
  50. {

  51. uint8_t tempTime=0;

  52.         I2C_SDA_IN();

  53.         I2C1_SDA_H;
  54.         I2C1_Delay();
  55.         I2C1_SCL_H;
  56.         I2C1_Delay();

  57.         while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9))
  58.         {
  59.                 tempTime++;
  60.                 if(tempTime>250)
  61.                 {
  62.                         I2C1_Stop();
  63.                         return 1;
  64.                 }         
  65.         }

  66.         I2C1_SCL_L;
  67.         return 0;
  68. }
  69. uint8_t I2C1_SendByte(uint8_t SendByte) //
  70. {


  71.                 uint8_t i=0;

  72.         I2C_SDA_OUT();
  73.         I2C1_SCL_L;//拉低时钟开始数据传输

  74.         for(i=0;i<8;i++)
  75.         {
  76.                 if((SendByte&0x80)>0) //0x80  1000 0000
  77.                         I2C1_SDA_H;
  78.                 else
  79.                         I2C1_SDA_L;

  80.                 SendByte<<=1;
  81.                 I2C1_SCL_H;
  82.                 I2C1_Delay(); //发送数据
  83.                 I2C1_SCL_L;
  84.                 I2C1_Delay();
  85.         }
  86. }
  87. uint8_t I2C1_ReceiveByte(void)  //
  88. {

  89.          uint8_t i,Dat = 0;
  90.          I2C1_SDA_H;
  91.          I2C1_SCL_L;
  92.          Dat=0;
  93.          for(i=0;i<8;i++)
  94.          {
  95.                 I2C1_SCL_H;//???????[???],????????
  96.                 I2C1_Delay();
  97.                 I2C1_Delay();
  98.                 I2C1_Delay();
  99.                 Dat<<=1;
  100.                 if(I2C1_SDA) //?????
  101.                 {
  102.                         Dat|=0x01;
  103.                 }   
  104.                 I2C1_SCL_L;//?????????  
  105.                 I2C1_Delay();
  106.                 I2C1_Delay();
  107.                 I2C1_Delay();//???????         
  108.          }
  109.          return Dat;
  110. }

  111. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  112. uint8_t I2C1_Read_Byte(unsigned char ack)
  113. {

  114.           uint8_t i=0,receive=0;

  115.    I2C_SDA_IN();
  116.    for(i=0;i<8;i++)
  117.    {
  118.                    I2C1_SCL_L;
  119.                 I2C1_Delay();
  120.                 I2C1_SCL_H;
  121.                 receive<<=1;
  122.                 if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9))
  123.                    receive++;
  124.                 I2C1_Delay();       
  125.    }

  126.            if(ack==0)
  127.                    I2C1_NAck();
  128.         else
  129.                 I2C1_Ack();

  130.         return receive;
  131. }
  132. /*******MPU6050****************/
  133. void PMU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat)
  134. {
  135.         I2C1_Start();
  136.         I2C1_SendByte(MPU6050_SLAVE_ADDRESS);
  137.         I2C1_WaitAck();
  138.         I2C1_SendByte(reg_add);
  139.         I2C1_WaitAck();
  140.         I2C1_SendByte(reg_dat);
  141.         I2C1_WaitAck();
  142.         I2C1_Stop();
  143. }

  144. void PMU6050_ReadData(uint8_t reg_add,unsigned char*Read,uint8_t num)
  145. {
  146.         unsigned char i;
  147.        
  148.         I2C1_Start();
  149.         I2C1_SendByte(MPU6050_SLAVE_ADDRESS);
  150.         I2C1_WaitAck();
  151.         I2C1_SendByte(reg_add);
  152.         I2C1_WaitAck();
  153.        
  154.         I2C1_Start();
  155.         I2C1_SendByte(MPU6050_SLAVE_ADDRESS+1);
  156.         I2C1_WaitAck();
  157.        
  158.         for(i=0;i<(num-1);i++){
  159.                 *Read=I2C1_Read_Byte(1);
  160.                 Read++;
  161.         }
  162.         *Read=I2C1_Read_Byte(0);
  163.         I2C1_Stop();
  164. }

  165. void MPU6050_Init(void)
  166. {
  167.         I2C1_Delay();
  168.         I2C1_Delay();
  169.         I2C1_Delay();
  170. //        MPU6050_PWR_MGMT_1_INIT();
  171.         PMU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00);             //解除休眠状态
  172.         PMU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07);            //陀螺仪采样率
  173.         PMU6050_WriteReg(MPU6050_RA_CONFIG , 0x06);       
  174.         PMU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x01);          //配置加速度传感器工作在16G模式
  175.         PMU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18);     //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
  176. }
  177. void MPU6050ReadID(void)
  178. {
  179.         unsigned char Re = 0;
  180.     PMU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1);    //读器件地址
  181. //     printf("%d\r\n",Re);
  182. }
  183. void MPU6050ReadAcc(short *accData)
  184. {
  185.     uint8_t buf[6];
  186.     PMU6050_ReadData(MPU6050_ACC_OUT, buf, 6);
  187.     accData[0] = (buf[0] << 8) | buf[1];
  188.     accData[1] = (buf[2] << 8) | buf[3];
  189.     accData[2] = (buf[4] << 8) | buf[5];
  190.                 printf("AccX = %d  ",accData[0]);
  191.                 printf("AccY = %d  ",accData[1]);
  192.                 printf("AccZ = %d  ",accData[2]);
  193. }
  194. void MPU6050ReadGyro(short *gyroData)
  195. {
  196.     uint8_t buf[6];
  197.     PMU6050_ReadData(MPU6050_GYRO_OUT,buf,6);
  198.     gyroData[0] = (buf[0] << 8) | buf[1];
  199.     gyroData[1] = (buf[2] << 8) | buf[3];
  200.     gyroData[2] = (buf[4] << 8) | buf[5];
  201.           printf("GYROX = %d  ",gyroData[0]);
  202.                 printf("GYROY = %d  ",gyroData[1]);
  203.                 printf("GYROZ = %d\r\n",gyroData[2]);
  204. }

  205. void MPU6050ReadTemp(short *tempData)
  206. {
  207.         uint8_t buf[2];
  208.     PMU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);     //读取温度值
  209.     *tempData = (buf[0] << 8) | buf[1];
  210. }

  211. void MPU6050_ReturnTemp(short*Temperature)
  212. {
  213.         short temp3;
  214.         uint8_t buf[2];
  215.        
  216.         PMU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2);     //读取温度值
  217.   temp3= (buf[0] << 8) | buf[1];
  218.         *Temperature=(((double) (temp3 + 13200)) / 280)-13;
  219. }

复制代码




MPU6050加速度串口数据.png (21.58 KB, 下载次数: 1)

MPU6050加速度串口数据

MPU6050加速度串口数据

引脚图.png (384.1 KB, 下载次数: 0)

引脚图

引脚图

最新回复

谢谢楼主分享   详情 回复 发表于 2015-12-14 10:20
点赞 关注
 
 

回复
举报

3836

帖子

19

TA的资源

纯净的硅(中级)

沙发
 
请问楼主,开始无法读取是什么原因呀

点评

你复位了吗 ? 我这边下载进去就好使 啊  详情 回复 发表于 2015-12-14 10:28
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢楼主分享
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(中级)

4
 
fish001 发表于 2015-12-14 10:06
请问楼主,开始无法读取是什么原因呀

你复位了吗 ?  我这边下载进去就好使  啊  
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表