STM8L051 MPU6050 读取不了数据,注释一个函数就可以

2019-12-12 18:14发布


问题很奇怪,单独调试时候还正常。

添加了其他函数  LED  KEY   ADC ,有时候就不能读取数据了,注释一个就可以读取数据了。

引脚检查了,确认没有问题。

最不解的是,把其他函数内所有东西注释掉了,也不能运行, 必须在main 里面注释掉函数才可以。

但是还是能读取到  MPU6050  WHO_AM_I   也发送上来0x68  然后就死在 读取函数内了



2.jpg (174.04 KB, 下载次数: 0) 下载附件 内部已经注释掉 2019-3-21 10:13 上传




仿真看了下,是停留在读取MPU6050 函数内,程序如下:


  1. void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
  2. {  
  3.   /*!< While the bus is busy */
  4.   while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  5.   
  6.   /*!< Enable Acknowledgement to be ready for another reception */
  7.   I2C_AcknowledgeConfig(I2C1, ENABLE);//产生应答信号        

  8.   /*!< Send START condition */
  9.   I2C_GenerateSTART(I2C1, ENABLE);//发送起始信号
  10.   /*!< Test on EV5 and clear it */
  11.   while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//等待起始信号产生
  12.   
  13.   /*!< Send EEPROM address for write *///发送器件地地址,并清除SB标志位
  14.   I2C_Send7bitAddress(I2C1,MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter);
  15.   /*!< Test on EV6 and clear it */
  16.   while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//等待器件地址发送完成

  17.   
  18.   /*!< Send the EEPROM's internal address to read from: LSB of the address */
  19.   I2C_SendData(I2C1, (u8)(ReadAddr));//发送存储地址
  20.   
  21.   /*!< Test on EV8 and clear it */
  22.   while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待移位发送器发送完成

  23.   
  24.   /*!< Send STRAT condition a second time */
  25.   I2C_GenerateSTART(I2C1, ENABLE); //重新发送起始信号
  26.   
  27.   /*!< Test on EV5 and clear it *///等待起始信号产生
  28.   while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  29.   

  30.    /*!< Send EEPROM address for read *///发送器件地地址,并清除SB标志位
  31.   I2C_Send7bitAddress(I2C1, (u8)MPU6050_SLAVE_ADDRESS, I2C_Direction_Receiver);

  32.   /*!< Test on EV6 and clear it *///等待器件地址发送完成
  33.   while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

  34.   
  35.   /* While there is data to be read */
  36.   while(NumByteToRead)                                                                                                                                                                  //停留在这个死循环了
  37.   {
  38.     if(NumByteToRead == 1)
  39.     {
  40.       /* Disable Acknowledgement */
  41.       I2C_AcknowledgeConfig(I2C1, DISABLE);
  42.       
  43.       /* Send STOP Condition */
  44.       I2C_GenerateSTOP(I2C1, ENABLE);
  45.     }
  46.    
  47.    
  48. //    /*!< Test on EV7 and clear it */ //等待数据接收完成
  49. //    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
  50. //
  51. //    *pBuffer = I2C_ReceiveData(I2C1);
  52. //   
  53. //    pBuffer++;
  54. //   
  55. //    NumByteToRead--;
  56.    

  57.     /* Test on EV7 and clear it */
  58.     if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  
  59.     {      
  60.       /* Read a byte from the EEPROM */
  61.       *pBuffer = I2C_ReceiveData(I2C1);

  62.       /* Point to the next location where the byte read will be saved */
  63.       pBuffer++;
  64.       
  65.       /* Decrement the read bytes counter */
  66.       NumByteToRead--;     
  67.     }  
  68.    
  69.    

  70.   }//end while(NumByteToRead)

  71.    
  72. //  /* Enable Acknowledgement to be ready for another reception */
  73. //  I2C_AcknowledgeConfig(I2C1, ENABLE);
  74.   
  75. }
复制代码




附件视频。


录制_2019_03_21_09_48_10_1.zip (10.16 MB, 下载次数: 4) 2019-3-21 10:18 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lyg407
1楼-- · 2019-12-12 23:36
  6 133 bytes of readonly  code memory
    206 bytes of readonly  data memory
    287 bytes of readwrite data memory


程序空间占用
lyg407
2楼-- · 2019-12-13 01:51
如果有STM8L051  MPU6050 完整的程序,可以发出来参考一下。   愿付费。
desireyao
3楼-- · 2019-12-13 05:48
楼主哪里?
lyg407
4楼-- · 2019-12-13 07:05
把IAR 优化等级调了一下,测试正常了, 目前还没出现问题。
huangyiting1990
5楼-- · 2019-12-13 12:56
 精彩回答 2  元偷偷看……
lyg407
6楼-- · 2019-12-13 13:05
huangyiting1990 发表于 2019-3-25 17:04
一般也只敢开低级优化 , 中级和高级从来不开。   就怕神马时候编译器给你自作主张  ...

对啊,但是我这也是没办法了,还好只是个小东西,不是航模,不是载人,死机开关一次再来。

一周热门 更多>