首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32F4的I2C读取BMP085模块的温度和气压(2)

STM32F4的I2C读取BMP085模块的温度和气压(2)

uint8_t I2C_Read(uint8_t addr)
{  


while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));



I2C_AcknowledgeConfig(I2C1, ENABLE);
   
I2C_GenerateSTART(I2C1, ENABLE);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

  I2C_Send7bitAddress(I2C1,  0xee, I2C_Direction_Transmitter);
  while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));


I2C_SendData(I2C1, addr);
  while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));




I2C_GenerateSTART(I2C1, ENABLE);

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));



I2C_Send7bitAddress(I2C1, 0xee, I2C_Direction_Receiver);

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));  /* EV7 */
  value[0] = I2C_ReceiveData(I2C1);   
  
I2C_AcknowledgeConfig(I2C1, DISABLE);
  I2C_GenerateSTOP(I2C1, ENABLE);  


   
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));  /* EV7 */  
  value[1] = I2C_ReceiveData(I2C1);
  //cal_data = value[0]<<8 | value[1];
  

//printf("buf[0] = %x,buf[1] = %x,%d,%d\r\n",buf[0],buf[1],(buf[0]<<8|buf[2]),cal_data);   

   /* Decrement the read bytes counter */


I2C_AcknowledgeConfig(I2C1, ENABLE);


return 0;
}

在这个函数中也遇到了问题,又是因为复制代码,没有看清楚,误将while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))写为while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)),导致的问题就是程序一直停在while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)),为什么在这里死循环我还没搞明白。
如果没有出现上述的错误,这时候就可以在main函数里面添加函数read_calibration_data()去读BMP085内部E2PROM的校准数据了

下面整理出最终的代码
uint8_t I2C_Read(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t *buf,uint16_t num)
{  
  if(num==0)

return 1;


   

while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));



I2C_AcknowledgeConfig(I2Cx, ENABLE);
   
  I2C_GenerateSTART(I2Cx, ENABLE);
  while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

  I2C_Send7bitAddress(I2Cx,  I2C_Addr, I2C_Direction_Transmitter);
  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));


I2C_SendData(I2Cx, addr);
  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));




I2C_GenerateSTART(I2Cx, ENABLE);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));



I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));



  while (num)
  {

if(num==1)

{
      I2C_AcknowledgeConfig(I2Cx, DISABLE);
   
I2C_GenerateSTOP(I2Cx, ENABLE);

}

   

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED));  /* EV7 */

   *buf = I2C_ReceiveData(I2Cx);

   buf++;

   /* Decrement the read bytes counter */

   num--;
  }  

I2C_AcknowledgeConfig(I2Cx, ENABLE);



return 0;
}




uint8_t I2C_Write(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t value)
{


while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY))

  I2C_GenerateSTART(I2Cx, ENABLE);

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

  
I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);
  
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  
I2C_SendData(I2Cx, addr);
  
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  
I2C_SendData(I2Cx, value);
  
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));


  
I2C_GenerateSTOP(I2Cx, ENABLE);
    I2C_AcknowledgeConfig(I2Cx, DISABLE);


//I2C_delay(200000);//4.5ms

return 0;
}
继承事业,薪火相传
返回列表