根据数据手册编写初始化代码,通过模拟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