OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5829|回复: 5

mpu6050dm移植报Unsupported software product rev %d错

[复制链接]

2

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2015-12-11
在线时间
49 小时
发表于 2021-11-4 19:44:30 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 mrwang7758 于 2021-11-5 09:01 编辑

mpu6050dmp驱动移植卡在Unsupported software product rev %d错误,读出结果rev值应该为7。确定I2C读写正确,6050地址也已有0x68改为0xd0,这种问题可能出在哪里啊?
QQ图片20211104193949.png
QQ图片20211104194003.png

最佳答案

查看完整内容[请看2#楼]

搜到superliu588[/backcolor]关于I2C连续读取回复的一篇帖子,解决了这个问题,在此向superliu588[/backcolor]表示感谢,如果同仁有类似问题可以参照此截图尝试解决。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2015-12-11
在线时间
49 小时
 楼主| 发表于 2021-11-4 19:44:31 | 显示全部楼层
本帖最后由 mrwang7758 于 2021-11-9 17:42 编辑

搜到superliu588关于I2C连续读取回复的一篇帖子,解决了这个问题,在此向superliu588表示感谢,如果同仁有类似问题可以参照此截图尝试解决。
微信图片_20211109173559.png
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-11-5 11:57:49 | 显示全部楼层
帮顶      
回复

使用道具 举报

2

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2015-12-11
在线时间
49 小时
 楼主| 发表于 2021-11-6 13:14:54 | 显示全部楼层
本帖最后由 mrwang7758 于 2021-11-6 14:12 编辑

经过测试,发现读单字节正确,连续读会不正常,修改ACK和NACK后,单字节读取继续正常,连续读取的data结果及初始化执行如图一(上传顺序原因,请看最后一幅图)。初始完成后进入mpu_set_dmp_state设置时,又报mpu_set_dmp_state come across error,随即修改#define LOAD_CHUNK  (16)为#define LOAD_CHUNK  (1),初始化完成。但pitch=1.0、roll=-2.0、yaw=0.0,且不变。现在还在纠结是否连续读仍不正常或是不能将16改为1,倘若正常和可以,为何后面值不变呢,求指点迷津
图二.png
图三.png
图一.png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-11-9 02:35:09 | 显示全部楼层
mrwang7758 发表于 2021-11-6 13:14
经过测试,发现读单字节正确,连续读会不正常,修改ACK和NACK后,单字节读取继续正常,连续读取的data结果 ...

基于什么平台?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2015-12-11
在线时间
49 小时
 楼主| 发表于 2021-11-9 09:23:49 | 显示全部楼层
本帖最后由 mrwang7758 于 2021-11-9 11:57 编辑

STM32f407ZGT6,我把I2C函数部分和读数结果贴出来吧,还是有点担心这块,特别是连续读取部分
  1. [code]/*****************************************************************************
  2. *函数原型:                void I2C1_Start(void)
  3. *功  能:                产生IIC起始信号
  4. *******************************************************************************/
  5. uint8_t I2C1_Start(void)
  6. {
  7.         Pin_SCL_H; // 拉高时钟线
  8.         Pin_SDA_H; // 拉高信号线
  9.         Delay_us(1);
  10.         if(!Read_SDA_Pin)
  11.         {
  12.                 return        ERROR;
  13.         }
  14.         Pin_SDA_L;
  15.         Delay_us(1);
  16.         Pin_SCL_L;        //钳住I2C总线,准备发送或接收数据
  17.         return SUCCESS;
  18. }

  19. /*****************************************************************************
  20. *函数原型:                void I2C1_Stop(void)
  21. *功  能:            //产生IIC停止信号
  22. *******************************************************************************/
  23. void I2C1_Stop(void)
  24. {
  25.         Pin_SCL_H;
  26.         Delay_us(1);
  27.     Pin_SDA_H;        //发送I2C总线结束信号
  28.         Delay_us(1);
  29. }

  30. /******************************************************************************
  31. *函数原型:                void I2C1_Ack(void)
  32. *功  能:            产生ACK应答
  33. *******************************************************************************/
  34. void I2C1_Ack(void)
  35. {
  36.         Pin_SCL_L;
  37.         Delay_us(1);
  38.         Pin_SDA_L;
  39.         Delay_us(2);
  40.         Pin_SCL_H;
  41.         Delay_us(1);
  42.         Pin_SCL_L;
  43.         Delay_us(1);
  44. }

  45. /******************************************************************************
  46. *函数原型:                void I2C1_NAck(void)
  47. *功  能:            产生NACK应答
  48. *******************************************************************************/
  49. void I2C1_NAck(void)
  50. {
  51.         Pin_SCL_L;
  52.         Delay_us(1);
  53.         Pin_SDA_H;
  54.         Delay_us(2);
  55.         Pin_SCL_H;
  56.         Delay_us(1);
  57.         Pin_SCL_L;
  58.         Delay_us(1);
  59.         
  60. }

  61. /******************************************************************************
  62. *函数原型:                uint8_t I2C1_Wait_Ack(void)
  63. *功  能:            等待应答信号到来
  64. //返回值:1,接收应答失败
  65. //        0,接收应答成功
  66. *******************************************************************************/
  67. uint8_t I2C1_Wait_Ack(void)
  68. {
  69.         uint8_t ack = 1;
  70.     Pin_SCL_H;
  71.     Delay_us(1);
  72.     ack = (Read_SDA_Pin)? ERROR : SUCCESS;
  73.     Pin_SCL_L;
  74.     return ack;
  75. }

  76. /******************************************************************************
  77. *函数原型:                void I2C1_Send_Byte(uint8_t txd)
  78. *功  能:            IIC发送一个字节
  79. *******************************************************************************/
  80. void I2C1_Send_Byte(uint8_t txd)
  81. {
  82.     for(uint8_t i=0; i<8; i++)
  83.     {
  84.                 Pin_SCL_L;
  85.                 Delay_us(1);
  86.                 if(txd & 0x80)
  87.                 {
  88.                         Pin_SDA_H;
  89.                 }
  90.                 else
  91.                 {
  92.                         Pin_SDA_L;
  93.                 }
  94.                 Delay_us(1);
  95.                 Pin_SCL_H;
  96.                 Delay_us(1);
  97.                 txd <<= 1;
  98.     }
  99.         I2C1_Wait_Ack();
  100.         Pin_SDA_H;        //sda拉高释放sda总线
  101. }

  102. /******************************************************************************
  103. *函数原型:                uint8_t        I2C1_Read_Byte(void)
  104. *功  能:            //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
  105. *******************************************************************************/
  106. uint8_t        I2C1_Read_Byte(void)
  107. {
  108.     uint8_t rxd = 0;
  109.     for(uint8_t i=0; i<8; i++)
  110.     {
  111.                 rxd <<= 1;
  112.                 Pin_SCL_L;
  113.                 Delay_us(1);
  114.                 Pin_SCL_H;
  115.                 Delay_us(1);
  116.                 if(Read_SDA_Pin)
  117.                 {
  118.                         rxd |= 0x01;
  119.                 }
  120.     }
  121.     return rxd;
  122. }

  123. // 向从机指定地址写数据
  124. uint8_t I2C1_Write_REG(uint8_t SlaveAddress, uint8_t REG_Address,uint8_t REG_data)
  125. {
  126.         if(!I2C1_Start())
  127.         {
  128.                 return        ERROR;
  129.         }
  130.     I2C1_Send_Byte(SlaveAddress);
  131.     if(!I2C1_Wait_Ack())
  132.         {
  133.                 I2C1_Stop();
  134.                 return        ERROR;
  135.         }
  136.     I2C1_Send_Byte(REG_Address);
  137.         I2C1_Wait_Ack();
  138.     I2C1_Send_Byte(REG_data);
  139.         I2C1_Wait_Ack();
  140.     I2C1_Stop();
  141.         return        SUCCESS;
  142. }

  143. // 从设备中读取数据
  144. uint8_t I2C1_Read_REG(uint8_t SlaveAddress,uint8_t REG_Address)
  145. {
  146.     uint8_t data;
  147.     I2C1_Start();
  148.     I2C1_Send_Byte(SlaveAddress);
  149.     I2C1_Wait_Ack();
  150.     I2C1_Send_Byte(REG_Address);
  151.     I2C1_Wait_Ack();
  152.     I2C1_Start();
  153.     I2C1_Send_Byte(SlaveAddress + 1);
  154.     I2C1_Wait_Ack();
  155.     data = I2C1_Read_Byte();
  156.     I2C1_NAck();
  157.     I2C1_Stop();
  158.     return data;
  159. }

  160. // 连续写N个字节
  161. int8_t I2C1_Write_NByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t len, uint8_t* buf)
  162. {
  163.         if(!I2C1_Start())
  164.         {
  165.                 return        -1;
  166.         }
  167.         I2C1_Send_Byte(SlaveAddress);  //发送设备地址+写信号
  168.         if(!I2C1_Wait_Ack())
  169.         {
  170.                 I2C1_Stop();
  171.                 return        -1;
  172.         }
  173.     I2C1_Send_Byte(REG_Address);   
  174.     I2C1_Wait_Ack();
  175.     for(uint8_t i=0; i<len; i++)
  176.     {
  177.         I2C1_Send_Byte(buf[i]);
  178.                 if(!I2C1_Wait_Ack())
  179.                 {
  180.                         I2C1_Stop();
  181.                         return        -1;                        
  182.                 }
  183.     }
  184.     I2C1_Stop();
  185.         return        0;
  186. }

  187. // 连续读N个字节
  188. int8_t I2C1_Read_NByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t len, uint8_t* buf)
  189. {
  190.    if(!I2C1_Start())
  191.         {
  192.                 return        -1;        
  193.         }
  194.     I2C1_Send_Byte(SlaveAddress);  //发送设备地址+写信号
  195.     if(!I2C1_Wait_Ack())
  196.         {
  197.                 I2C1_Stop();
  198.                 return        -1;
  199.         }
  200.     I2C1_Send_Byte(REG_Address);
  201.     I2C1_Wait_Ack();
  202.     I2C1_Start();
  203.     I2C1_Send_Byte(SlaveAddress + 1); // 读操作
  204.     I2C1_Wait_Ack();
  205.     while (len)
  206.     {
  207.                 *buf = I2C1_Read_Byte();
  208.                 len==1 ? I2C1_NAck() : I2C1_Ack();
  209.                 buf++;
  210.                 len--;               
  211.     }
  212.     I2C1_Stop();
  213.         return        0;
  214. }
复制代码

读一个数两种方式

读一个数两种方式

连续读6个数

连续读6个数
微信图片_20211109093852.jpg
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 12:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表