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

2019-07-21 08:17发布

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 ",temp);
                if((temp&0x80)!=0)
                {
                  temp=~(temp-1);
                        data = 0.625*temp;
                  printf("-%.1f ",data);
                }
                else
                {
                  data = 0.625*temp;
                  printf("%.1f ",data);
               
                }

                //data = 0.625*TMP275_Read_Byte(00);
                //data=(data/16.0);
                //printf("%f ",data);
                if(USART1_RX_STA&0X8000)
                {
                  len = USART1_RX_STA&0x3fff;
                        printf("&#196;&#227;·¢&#203;íμ&#196;&#207;&#251;&#207;¢&#206;a: ");
                        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(" ");
                        USART1_RX_STA =0;
                }
        }
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
正点原子
1楼-- · 2019-07-21 08:51
继续努力
hwb_dream
2楼-- · 2019-07-21 12:35
 精彩回答 2  元偷偷看……
lipengliang0335
3楼-- · 2019-07-21 15:44
hwb_dream 发表于 2018-11-3 08:54
我想问一下,你的控制端口是PB6、PB7还是PA6、PA7,对应时钟或引脚都没配置对怎么能行      
        RCC ...

PB6 PB7太感谢了 都没有查到这个问题,我再试一下
lipengliang0335
4楼-- · 2019-07-21 20:39
lipengliang0335 发表于 2018-11-3 09:10
PB6 PB7太感谢了 都没有查到这个问题,我再试一下

这个改过之后,串口输出还是0,希望帮忙看看哪里的问题
wsy54
5楼-- · 2019-07-21 21:11
排查一下I2C时序,会不会是延时问题

一周热门 更多>