tmp432远程温度传感器

根据数据手册编写初始化代码,通过模拟IIc协议驱动,源码如下:(有必要注明一点,这是自己根据手册和网上参考写的,有兴趣的可以自己买一个试一下,有问题欢迎交流),stm32驱动程序如下

#include "includes.h"
#include "tmp432.h"


//读取输入GPIO_ReadOutputDataBit( GPIOC, GPIO_Pin_11);
//void delay_us(u16 time)
//{    
//   u16 i=0;  
//   while(time--)
//   {
//      i=10;  //自己定义
//      while(i--) ;    
//   }
//}


void I2C_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟
  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高

I2C_SCL_H;
I2C_SDA_H;
}


/*******************************************************************************
* 函 数 名         : I2C_I2C_SDA_OUT
* 函数功能   : SDA输出配置   
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void I2C_SDA_OUT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}


/*******************************************************************************
* 函 数 名         : I2C_I2C_SDA_IN
* 函数功能   : SDA输入配置   
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void I2C_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=I2C_SDA;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}




void IIC_Start()
{
        I2C_SDA_OUT();     //sda线输出
I2C_SDA_H;    
I2C_SCL_H;
delay_us(4);
I2C_SDA_L;//START:when CLK is high,DATA change form high to low 
delay_us(4);
I2C_SCL_L;//钳住I2C总线,准备发送或接收数据 
}
void IIC_Stop()
{
I2C_SDA_OUT();//sda线输出
I2C_SCL_L;
I2C_SDA_L;//STOP:when CLK is high DATA change form low to high
delay_us(4);
        I2C_SCL_H; 
I2C_SDA_H;//发送I2C总线结束信号
delay_us(4);
}


void IIC_SendByte(u8 txd)
{
    u8 t;   
    I2C_SDA_OUT();    
    I2C_SCL_L;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
if((txd&0x80)>0) //0x80  1000 0000
I2C_SDA_H;
else
I2C_SDA_L;
                txd<<=1;  
delay_us(2);   //对TEA5767这三个延时都是必须的
I2C_SCL_H;
delay_us(2); 
I2C_SCL_L;
delay_us(2);
    }  
}


u8 IIC_ReadByte(void)
{
u8 i,receive=0;
I2C_SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
I2C_SCL_L; 
delay_us(2);
                I2C_SCL_H;
receive<<=1;
if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
receive++;   
                delay_us(1); 
}  
    return receive;
}


u8 IIC_WaitAck()
{
u8 ucErrTime=0;
I2C_SDA_IN();      //SDA设置为输入  
I2C_SDA_H;delay_us(1);   
I2C_SCL_H;delay_us(1);  
while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
I2C_SCL_L;//时钟输出0   
return 0;  
}


void IIC_Ack()
{
I2C_SCL_L;
I2C_SDA_OUT();
I2C_SDA_L;
delay_us(2);
I2C_SCL_H;
delay_us(2);
I2C_SCL_L;
}
void IIC_NAck()
{
I2C_SCL_L;
I2C_SDA_OUT();
I2C_SDA_H;
delay_us(2);
I2C_SCL_H;
delay_us(2);
I2C_SCL_L;
}
u8 TMP432_ReadByte(u8 TMPAddress,u8 RegMap)
{
u8 Buf = 0;
IIC_Start();
IIC_SendByte((TMPAddress<<1)|0);
IIC_WaitAck();
IIC_SendByte(RegMap);
IIC_WaitAck();
IIC_Start();
IIC_SendByte((TMPAddress<<1) | 1);
IIC_WaitAck();


Buf = IIC_ReadByte();
IIC_NAck();
IIC_Stop();
return Buf;
}
void TMP432_WriteByte(u8 TMPAdderss,u8 RegMap,u8 data)
{
IIC_Start();
IIC_SendByte((TMPAdderss<<1)|0);
IIC_WaitAck();
IIC_SendByte(RegMap);
IIC_WaitAck();
IIC_SendByte(data);
IIC_WaitAck();
IIC_Stop();
}
u8 TempResultH[3];
u8 TempResultL[3];
const u8 TMP432_TempMsbRead[3]={0x00,0x01,0x23};
const u8 TMP432_TempLsbRead[3]= {0x29,0x10,0x24};


const u8 TMP431_TempMsbRead[2]={0x00,0x01};  //431只有两路
const u8 TMP431_TempLsbRead[2]= {0x15,0x10};


/******************************
*
*432温度传感器初始化
*
*******************************/
void TMP432Init(void)
{
I2C_INIT();
#ifdef  TMP432_DEVICE
/*432初始化*/
TMP432_WriteByte(0x4C,TMP432_CONFIG1_WRITE,TMP432_CONFIG1_VALUE);//设置启动,不报警,范围0-127
TMP432_WriteByte(0x4C,TMP432_CONFIG2_WRITE,TMP432_CONFIG2_VALUE);  //使能各通道 ,开启RC校验
TMP432_WriteByte(0x4C,TMP432_CONVERSION_RATE_WRITE,TMP432_CONVERSION_RATE_VALUE);  //设置转换率最高
TMP432_WriteByte(0x4C,TMP432_TEMP_CRIT_HYST,TMP432_TEMP_CRIT_HYST_VALUE);  //设置比较器滞后值
#elif  defined TMP431_DEVICE
/*431初始化*/
TMP432_WriteByte(0x4C,TMP432_CONFIG1_WRITE,TMP432_CONFIG1_VALUE);//设置启动,不报警,范围0-127
TMP432_WriteByte(0x4C,TMP431_CONFIG2_WRITE,TMP431_CONFIG2_VALUE);  //使能各通道 ,开启RC校验
TMP432_WriteByte(0x4C,TMP432_CONVERSION_RATE_WRITE,TMP432_CONVERSION_RATE_VALUE);  //设置转换率最高
TMP432_WriteByte(0x4C,TMP432_TEMP_CRIT_HYST,TMP432_TEMP_CRIT_HYST_VALUE);  //设置比较器滞后值
#else  /*432B初始化*/
TMP432_WriteByte(0x4D,TMP432_CONFIG1_WRITE,TMP432_CONFIG1_VALUE);//设置启动,不报警,范围0-127
TMP432_WriteByte(0x4D,TMP432_CONFIG2_WRITE,TMP432_CONFIG2_VALUE);  //使能各通道 ,开启RC校验
TMP432_WriteByte(0x4D,TMP432_CONVERSION_RATE_WRITE,TMP432_CONVERSION_RATE_VALUE);  //设置转换率最高
TMP432_WriteByte(0x4D,TMP432_TEMP_CRIT_HYST,TMP432_TEMP_CRIT_HYST_VALUE);  //设置比较器滞后值
#endif
}
/******************************
*
*432温度数值获取
*
*******************************/
void TMP432_GetTemp(void)
{
u8 i;
#ifdef  TMP432_DEVICE
for(i = 0; i < 3;i++)  //三路数据(本地和两路远程数据),循环三次
{
TempResultH[i] = TMP432_ReadByte(0x4C,TMP432_TempMsbRead[i]);
TempResultL[i] = TMP432_ReadByte(0x4C,TMP432_TempLsbRead[i]);
printf("TEMP_H[i] = %d\n",TempResultH[i]);
printf("TEMP_L[i] = %d\n",TempResultL[i]);
printf("TEMP_L小数 = %lf\n",(TempResultL[i]*(TMP432_TEMP_L_PARAMTER/16)));
printf("TEMP = %lf\n",TempResultH[i]+(TempResultL[i]*(TMP432_TEMP_L_PARAMTER/16)));
}
#else 
/*431*/
for(i = 0; i < 2;i++)
{
TempResultH[i]=TMP432_ReadByte(0x4C,TMP431_TempMsbRead[i]);
TempResultL[i]=TMP432_ReadByte(0x4C,TMP431_TempLsbRead[i]);
printf("TEMP_H[i] = %d\n",TempResultH[i]);
printf("TEMP_L[i] = %d\n",TempResultL[i]);
printf("TEMP_L小数 = %lf\n",(TempResultL[i]*(TMP432_TEMP_L_PARAMTER/16)));
printf("TEMP = %lf\n",TempResultH[i]+(TempResultL[i]*(TMP432_TEMP_L_PARAMTER/16)));
}
#endif
}


网上参考链接:http://blog.sina.com.cn/s/blog_7fbb077f0102wy50.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值