野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13919|回复: 1

LM75A温度传感器基于STM32F4固件库I2C模块的程序分享

[复制链接]
发表于 2016-9-24 19:53:24 | 显示全部楼层 |阅读模式
几天前曾在坛子里询问淘宝上LM75A模块该怎么接线。想不到一下子就得到了火哥的回复并解决了问题。
但是火哥分享的软件模拟I2C通讯例程在我STM32F429的板子上不知道为什么跑不起来。
所以我参照<零死角玩转STM32-F429>里I2C相关章节,通过I2C固件库的方法写了一个简单的获取温度程序供大家参考。
我的程序还存在以下问题,希望能到高手指教:
通过STM32 I2C库写的I2C通讯程序,板子与LM75A的连接和通讯必须正确,否则板子会没有任何反应。
应该如何处理STM32 I2C出错的情况??
同时希望火哥能够在新版本的《零死角玩转STM32》里添加I2C出错时的解决方案。

引脚配置部分:
  1. void IIC_LIM75A_config()
  2. {
  3.     GPIO_InitTypeDef I2C_GPIO;
  4.        
  5.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
  6.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
  7.         GPIO_PinAFConfig(GPIOH,GPIO_PinSource4,GPIO_AF_I2C2);
  8.         GPIO_PinAFConfig(GPIOH,GPIO_PinSource5,GPIO_AF_I2C2);
  9.        
  10.         I2C_GPIO.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
  11.         I2C_GPIO.GPIO_Mode=GPIO_Mode_AF;
  12.         I2C_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
  13.         I2C_GPIO.GPIO_OType = GPIO_OType_OD;
  14.         I2C_GPIO.GPIO_PuPd = GPIO_PuPd_NOPULL;
  15.        
  16.         GPIO_Init(GPIOH,&I2C_GPIO);
  17.        
  18.         I2C_InitTypeDef I2C_InitStruct;       
  19.         I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
  20.         I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
  21.         I2C_InitStruct.I2C_OwnAddress1 =0x00;
  22.         I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
  23.         I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  24.         I2C_InitStruct.I2C_ClockSpeed = 100000;
  25.        
  26.         I2C_Init(I2C2, &I2C_InitStruct);

  27.         I2C_Cmd(I2C2, ENABLE);
  28. }
复制代码
温度获取部分:
  1. float I2C_LM75_Read(void)
  2. {
  3.         uint8_t TempH,TempL;
  4.         uint16_t data;
  5.         uint32_t TimeOut;
  6.        
  7.         while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
  8.         I2C_GenerateSTART(I2C2,ENABLE);
  9.         TimeOut=0x1000;
  10.         while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT))
  11.         {
  12.                 if ((TimeOut--) == 0)  printf("I2C GenerateSTART 0 Error\r\n");
  13.         }
  14.         I2C_Send7bitAddress(I2C2, 0x90,I2C_Direction_Transmitter);
  15.         TimeOut=0x1000;
  16.     while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  17.         {
  18.                 if ((TimeOut--) == 0)  printf("I2C Send7bitAddress 0 Error\r\n");
  19.         }
  20.        
  21.         I2C_SendData(I2C2,0x00);
  22.        
  23.         TimeOut=0x1000;
  24.     while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  25.         {
  26.                 if ((TimeOut--) == 0)  printf("I2C SendData 0 Error\r\n");
  27.         }
  28.        
  29.         I2C_GenerateSTART(I2C2,ENABLE);
  30.         TimeOut=0x1000;
  31.         while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT))
  32.         {
  33.                 if ((TimeOut--) == 0)  printf("I2C GenerateSTART 1 Error\r\n");
  34.         }
  35.        
  36.         I2C_Send7bitAddress(I2C2, 0x90,I2C_Direction_Receiver);
  37.        
  38.         TimeOut=0x1000;
  39.         while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
  40.         {
  41.                 if ((TimeOut--) == 0)  printf("I2C I2C_Send7bitAddress 1 Error\r\n");
  42.         }

  43.         I2C_AcknowledgeConfig(I2C2,ENABLE);
  44.         TimeOut=0x1000;
  45.         while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED))
  46.         {
  47.             if ((TimeOut--) == 0)  printf("I2C I2C_ReceiveData 0 Error\r\n");
  48.         }
  49.         TempH = I2C_ReceiveData(I2C2);
  50.        
  51.         printf("TempH:%x\r\n",TempH);
  52.         TimeOut=0x1000;
  53.        
  54.         I2C_AcknowledgeConfig(I2C2,DISABLE);
  55.         I2C_GenerateSTOP(I2C2,ENABLE);
  56.         while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED))
  57.         {
  58.             if ((TimeOut--) == 0)  printf("I2C I2C_ReceiveData 1 Error\r\n");
  59.         }
  60.         TempL = I2C_ReceiveData(I2C2);
  61.        
  62.        
  63.        
  64.         data=((uint16_t)TempH << 8) | TempL ;
  65.        
  66.        
  67.         return data_convert(data);
  68. }
复制代码
温度结果数据转换部分:
  1. float data_convert(uint16_t data)
  2. {
  3.         uint8_t is_negative=data&(uint16_t)(0x8000);
  4.         uint8_t vaild_data_part=(((data<<1)&(uint16_t)(0xFF00))>>8);
  5.        
  6.         return is_negative==1 ? -(((int)vaild_data_part)*0.5):((int)vaild_data_part)*0.5;
  7. }
复制代码


调用部分:
  1. int main()
  2. {
  3.         float LM75_Temp=0;
  4.         IIC_LIM75A_config();
  5.        
  6.         while(1)
  7.         {
  8.                 LM75_Temp=I2C_LM75_Read();
  9.                 printf("LM75_Temp %.2f\r\n",LM75_Temp);
  10.                 delay_ms(300);
  11.         }
  12. }
复制代码



回复

使用道具 举报

发表于 2016-9-24 22:06:53 | 显示全部楼层
我们硬件IIC驱动会有错误提示的啊,根据串口的错误代码,看看你的是卡在哪里
软件iic的话可以参考触摸屏的驱动
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 03:44 , Processed in 0.025580 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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