LM75 --温度采集(时序及代码)
一、 LM75A传感器介绍二、寄存器介绍三、时序图四、代码#define LM75A_SCL_GPIOGPIOB#define LM75A_SCL_PINGPIO_Pin_8#define LM75A_SDA_GPIOGPIOB#define LM75A_SDA_PINGPIO_Pin_...
·
一、 LM75A传感器介绍
二、寄存器介绍
三、时序图
四、代码
#define LM75A_SCL_GPIO GPIOB
#define LM75A_SCL_PIN GPIO_Pin_8
#define LM75A_SDA_GPIO GPIOB
#define LM75A_SDA_PIN GPIO_Pin_7
#define LM75A_SCL(value) GPIO_WRITE_BIT(LM75A_SCL_GPIO, LM75A_SCL_PIN, value);
#define LM75A_SDA(value) GPIO_WRITE_BIT(LM75A_SDA_GPIO, LM75A_SDA_PIN, value);
#define LM75A_READ_GPIO(value) {value = GPIO_READ_IDB(LM75A_SDA_GPIO, LM75A_SDA_PIN);}
#define SDA_H LM75A_SDA(1)
#define SDA_L LM75A_SDA(0)
#define SCL_H LM75A_SCL(1)
#define SCL_L LM75A_SCL(0)
#define SDA_read GPIO_READ_IDB(LM75A_SDA_GPIO, LM75A_SDA_PIN)
#define I2C_delay() LM75A_DELAY
#define I2C_TM_ERR 0
#define I2C_TM_OK 1
#define LM75_ADDRESS 0x94
// 0x00 temperature 0x01 conf 0x00 temperature 0x00 temperature
#define LM75A_addr 0x94
#define LM75A_REG_TEMPERATUYA 0x00
#define LM75A_REG_CONF 0x01
#define LM75A_REG_THYST 0x02
#define LM75A_REG_TOS 0x03
//1NOP = 1CLOCK = 5.95ns
/*
TP min: 2.5us
TH min: 0.6us
TL min: 1.3us
*/
#define LM75A_DELAY NOP_1000;//2.975us
void LM75A_MDIO_Out()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//MDIO
GPIO_InitStructure.GPIO_Pin = LM75A_SDA_PIN;
GPIO_Init(LM75A_SDA_GPIO, &GPIO_InitStructure);
}
void LM75A_MDIO_In()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//MDIO
GPIO_InitStructure.GPIO_Pin = LM75A_SDA_PIN;
GPIO_Init(LM75A_SDA_GPIO, &GPIO_InitStructure);
}
void LM75A_InitGpio()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//MDC
GPIO_InitStructure.GPIO_Pin = LM75A_SCL_PIN;
GPIO_Init(LM75A_SCL_GPIO, &GPIO_InitStructure);
LM75A_MDIO_Out();
LM75A_SCL(0);
LM75A_SDA(1);
}
/********************************************************************************
* 使用I2C1读写AT24C256,LM75
*******************************************************************************/
u16 I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
SDA_L;
I2C_delay();
SCL_L;
I2C_delay();
return (I2C_TM_OK);
}
void I2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
SCL_L;
I2C_delay();
}
void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
void I2C_NoAck(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
u16 I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
SCL_L;
I2C_delay();
SCL_H;
LM75A_MDIO_In();
I2C_delay();
if(SDA_read)
{
SCL_L;
return(I2C_TM_ERR);
}
SCL_L;
LM75A_MDIO_Out();
return(I2C_TM_OK);
}
void I2C_SendByte(u8 SendByte) //数据从高位到低位//
{
u8 i=8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0x80)
{
SDA_H;
}
else
{
SDA_L;
}
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
u8 I2C_ReceiveByte(void) //数据从高位到低位//
{
u8 i=8;
u8 ReceiveByte=0;
SDA_H;
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
/*******************************************************************************
* Function Name : I2C_LM75_Read
* Description : Reads Temperature data from the LM75.
* Input : None
* Output : 0xFFFF -- Error
* 0x0000 ~ 0x01FF -- Valid data
* Temp Binary Hex
* +125 0111 1101 0xxx xxxx 0FAh
* +25 0001 1001 0xxx xxxx 032h
* +0.5 0000 0000 1xxx xxxx 001h
* 0 0000 0000 0xxx xxxx 000h
* -0.5 1111 1111 1xxx xxxx 1FFh
* -25 1110 0111 0xxx xxxx 1CEh
* -55 1100 1001 0xxx xxxx 192h
* Return : None
*******************************************************************************/
float I2C_LM75_Read(void)
{
float temp;
vu16 TempH,TempL;
if(I2C_Start()==I2C_TM_ERR)return(I2C_TM_ERR);
I2C_SendByte(LM75_ADDRESS); //器件地址
if(I2C_WaitAck()==I2C_TM_ERR){I2C_Stop(); return(I2C_TM_ERR);}
I2C_SendByte(0x00);
//设置温度寄存器地址
if(I2C_Start()==I2C_TM_ERR)return(I2C_TM_ERR);
I2C_SendByte(LM75_ADDRESS | 0x01); //设置器件地址
if(I2C_WaitAck()==I2C_TM_ERR){I2C_Stop(); return(I2C_TM_ERR);}
LM75A_MDIO_In();
TempH = I2C_ReceiveByte();
I2C_Ack();
TempL = I2C_ReceiveByte();
I2C_NoAck();
LM75A_MDIO_Out();
I2C_Stop();
temp=TempH+(TempL>>5)*0.125;
return(temp);
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)