OpenEdv-开源电子网

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

stm32f103 读tmp275温度传感器 读不出温度 希望做过的解答一下

[复制链接]

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2015-11-25
在线时间
21 小时
发表于 2018-11-2 22:54:24 | 显示全部楼层 |阅读模式
1金钱
tmp275 地址是0x98,
#include "iic.h"

void IIC_Delay(void)
{
  delay_us(2);
}
void IIC_Init()
{
        GPIO_InitTypeDef  GPIO_InitStruct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE );
       
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
       
        GPIO_SetBits(GPIOA,GPIO_Pin_6|GPIO_Pin_7);
}

void IIC_Start()
{
  SDA_OUT();
        IIC_SCL = 1;
        IIC_SDA = 1;
        IIC_Delay();
        IIC_SDA = 0;
        IIC_Delay();
        IIC_SCL = 0;

}

void IIC_Stop()
{
  SDA_OUT();
        IIC_SCL = 0;
        IIC_SDA = 0;
        IIC_Delay();
        IIC_SCL = 1;
        IIC_SDA = 1;
        IIC_Delay();
       
}
u8 IIC_Wait_Ack()
{
   uint8_t Errtime;
   SDA_IN();
         IIC_SDA = 1;IIC_Delay(); //êí·Åêy¾Y×üÏß
         IIC_SCL = 1;IIC_Delay(); //êí·ÅμØÖ·×üÏß
         while(IIC_SDA)
         {
           Errtime++;
                 if(Errtime>200)
                 {
                  IIC_Stop();
      return 1;
                 }
                                  
         }
         IIC_SCL = 0;
   return 0;       
}

void IIC_Send_Ack()
{
        IIC_SCL = 0;
  SDA_OUT();
  IIC_SDA = 0;
        IIC_Delay();
        IIC_SCL = 1;
        IIC_Delay();
        IIC_SCL = 0;
        IIC_Delay();
}

void IIC_Send_Nack()
{
        IIC_SCL = 0;
  SDA_OUT();
  IIC_SDA = 1;
        IIC_Delay();
        IIC_SCL = 1;
        IIC_Delay();
        IIC_SCL = 0;
        IIC_Delay();
}

void IIC_Write_Byte(u8 data)
{
  uint8_t i;
        SDA_OUT();
        IIC_SCL = 0;
        for(i=0;i<8;i++)
        {
          IIC_SDA = (data&0x80)>>7;
                data<<=1;
                IIC_Delay();
                IIC_SCL = 1;
                IIC_Delay();
                IIC_SCL = 0;
                IIC_Delay();
        }
       
}

u8 IIC_Read_Byte(u8 ack)
{
  uint8_t i,receive;
        SDA_IN();
       
        IIC_Delay();
        for(i=0;i<8;i++)
        {
          IIC_SCL = 0;
                IIC_Delay();
                IIC_SCL = 1;
                receive<<=1;
                if(IIC_SDA)
                receive++;
          IIC_Delay();       
        }
        if(!ack)
        IIC_Send_Nack();
        else
        IIC_Send_Ack();
       
        return receive;
}



#include "tmp275.h"
#include "iic.h"

void TMP275_Init()
{
  //IIC_Init();
        IIC_Start();
        IIC_Write_Byte(0x98);
        IIC_Wait_Ack();
        IIC_Write_Byte(0x01);
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Write_Byte(0xFE);
        IIC_Wait_Ack();       
  IIC_Stop();
}

void TMP275_Write_Byte(u8 reg,u16 data)
{
        u8 data_H,data_L;
        data_H = (u8)data>>8;
        data_L = (u8)data;
  IIC_Start();
        IIC_Write_Byte(0x98);
        IIC_Wait_Ack();
        IIC_Write_Byte(0x00);
        IIC_Wait_Ack();
        IIC_Write_Byte(data_H);
        IIC_Wait_Ack();
        IIC_Write_Byte(data_L);
        IIC_Wait_Ack();
  IIC_Stop();
}

u16 TMP275_Read_Byte()
{
        u8 data_H,data_L;
  u16 temp = 0;
        IIC_Start();
        IIC_Write_Byte(0x98);
        IIC_Wait_Ack();
        IIC_Write_Byte(0x00);
        IIC_Wait_Ack();
        IIC_Start();
        IIC_Write_Byte(0x99);
        IIC_Wait_Ack();
        data_H = IIC_Read_Byte(1);
        data_L = IIC_Read_Byte(0);
        temp = (((u16)data_H)<<8|data_L)>>4;
        IIC_Stop();
       
        return temp;

}



#include "pwm.h"
#include "delay.h"
#include "usart1.h"
#include "stm32f10x.h"
#include "tmp275.h"

float data;
u16 temp;
int main()
{
  //u16 led0pwmval=0;
        //u8 dir=1;       
  //TIME3_PWM_Init(999,7199);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        USART1_Init(115200);
        delay_init();       
        while(1)
        {
                u16 len,t;
                //delay_ms(10);         
                //if(dir)led0pwmval++;
                //else led0pwmval--;

                //if(led0pwmval>300)dir=0;
                //if(led0pwmval==0)dir=1;                                                                                 
                //TIM_SetCompare3(TIM3,300);
                //TIM_SetCompare4(TIM3,500);
                delay_ms(1000);
                temp = TMP275_Read_Byte();
                printf("%d\r\n",temp);
                if((temp&0x80)!=0)
                {
                  temp=~(temp-1);
                        data = 0.625*temp;
                  printf("-%.1f\r\n",data);
                }
                else
                {
                  data = 0.625*temp;
                  printf("%.1f\r\n",data);
               
                }

                //data = 0.625*TMP275_Read_Byte(00);
                //data=(data/16.0);
                //printf("%f\r\n",data);
                if(USART1_RX_STA&0X8000)
                {
                  len = USART1_RX_STA&0x3fff;
                        printf("&#196;&#227;·¢&#203;íμ&#196;&#207;&#251;&#207;¢&#206;a:\r\n\r\n");
                        for(t=0;t<len;t++)
                        {
                           USART_SendData(USART1,USART1_RX_BUF[t]); //·¢&#203;íêy&#190;Y
                                 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); //μè′y·¢&#203;í&#189;áê&#248;
                        }
                  printf("\r\n");
                        USART1_RX_STA =0;
                }
        }
}



my project.zip

7.76 MB, 下载次数: 46

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-11-3 02:41:36 | 显示全部楼层
回复

使用道具 举报

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2012-12-2
在线时间
67 小时
发表于 2018-11-3 08:54:35 | 显示全部楼层
我想问一下,你的控制端口是PB6、PB7还是PA6、PA7,对应时钟或引脚都没配置对怎么能行      
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE );
        
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
        
        GPIO_SetBits(GPIOA,GPIO_Pin_6|GPIO_Pin_7);
回复

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2015-11-25
在线时间
21 小时
 楼主| 发表于 2018-11-3 09:10:43 | 显示全部楼层
hwb_dream 发表于 2018-11-3 08:54
我想问一下,你的控制端口是PB6、PB7还是PA6、PA7,对应时钟或引脚都没配置对怎么能行      
        RCC ...

PB6 PB7太感谢了 都没有查到这个问题,我再试一下
回复

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2015-11-25
在线时间
21 小时
 楼主| 发表于 2018-11-3 09:26:55 | 显示全部楼层
lipengliang0335 发表于 2018-11-3 09:10
PB6 PB7太感谢了 都没有查到这个问题,我再试一下

这个改过之后,串口输出还是0,希望帮忙看看哪里的问题
回复

使用道具 举报

2

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2018-8-7
在线时间
74 小时
发表于 2018-11-5 15:24:06 | 显示全部楼层
排查一下I2C时序,会不会是延时问题
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-12-27
在线时间
8 小时
发表于 2019-7-21 15:22:45 | 显示全部楼层
我的TMP275温度也没读出来,你的解决了没?   我QQ:1140910857,谢谢
回复

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-7-22 15:29:19 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 10:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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