#include "tmp100 i2c.h"
#include <stdbool.h>
bool I2C_HardWare_FAILUER = false;//I2C故障标志 需要在主程序文件中用extern声明一下,并在主循环中判断.
//如果故障标志为true,重新执行一遍I2C_Configuration();
void I2C_Configuration(void)//初始化I2C总线
{
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
I2C_APBxClock_FUN(I2C_CLK,ENABLE); //开I2C的时钟
I2C_GPIO_APBxClock_FUN(I2C_GPIO_CLK, ENABLE); //使能PB端口时钟
/* PB6,7 SCL and SDA */
GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏复用功能
GPIO_Init(I2C_PORT, &GPIO_InitStructure);
I2C_DeInit(I2Cx);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; //设置I2C为I2C模式
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //I2C快速模式Tlow / Thigh = 2 就是拉扯SCL 高低电平比
I2C_InitStructure.I2C_OwnAddress1 = I2Cx_OWN_ADDRESS7; //STM32自身地址
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //使能应答(ACK)
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //应答7位地址
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; //100K速度
I2C_Cmd(I2Cx, ENABLE);
I2C_Init(I2Cx, &I2C_InitStructure);
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2Cx, ENABLE);
}
/***************************************************
**函数名:I2C_ReadTmp
**功能:读取tmp101的2个字节温度
** 使用之前要先调用I2C_InitTmp 初始化TMP101
***************************************************/
double I2C_ReadTmp(u8 TMP100_ADDR)//TMP100_ADDR 为tmp101地址,具体数值与硬件上地址管脚连接有关.
{
int I2C_HardWare_count=0;
u8 I2c_Buf[3]="AB0";//温度存放
u16 temp;
while((I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY))
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE)) /*检测总线是否忙 就是看 SCL 或SDA是否为 低 */
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return 0;
}
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2Cx, ENABLE);
/* 发送起始位 */
I2C_GenerateSTART(I2Cx, ENABLE);
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE)) /*EV5,主模式*/
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return 0;
}
/*发送器件地址(写)*/
I2C_Send7bitAddress(I2Cx, TMP100_ADDR, I2C_Direction_Transmitter);
while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return 0;
}
/*发送Pointer Register*/
I2C_SendData(I2Cx, 0X00);
while ((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) /*数据已发送*/
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return 0;
}
/*起始位*/
I2C_GenerateSTART(I2Cx, ENABLE);
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return 0;
}
/*发送器件地址(读)*/
I2C_Send7bitAddress(I2Cx, TMP100_ADDR, I2C_Direction_Receiver);
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) /* 读Temperature Register*/
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return 0;
}
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return 0;
}
I2c_Buf[0]= I2C_ReceiveData(I2Cx);
I2C_AcknowledgeConfig(I2Cx, DISABLE); //最后一位后要关闭应答的
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
/*● 为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)必须清除ACK位。
● 为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)设置STOP/START位。
● 只接收一个字节时,刚好在EV6之后(EV6_1时,清除ADDR之后)要关闭应答和停止条件的产生位。*/
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return 0;
}
I2c_Buf[1]= I2C_ReceiveData(I2Cx);
/* Decrement the read bytes counter */
/*再次允许应答模式*/
I2C_AcknowledgeConfig(I2Cx, ENABLE);
// tmp=(uint32_t)I2c_Buf[0]*16+(uint32_t)(I2c_Buf[1]>>4);
// tmp=tmp*((double)625/10000);
/*
先整体右移动8位,求和在左移4位。
tmp=((unsigned int)buf[0]*256+(unsigned int)buf[1])>>4;
tmp=tmp*((double)128/2047);
TMP_value=(unsigned int)(tmp*100);
*/
temp=I2c_Buf[0]; //转换温度
temp=temp<<4;
temp=temp|I2c_Buf[1]>>4; //不加括号的话先左移再或运算
return temp;
}
/*************************************************
**函数名:void I2C_InitTmp(void)
**功能:初始化TMP101
*************************************************/
void I2C_InitTmp(u8 TMP100_ADDR)
{ int I2C_HardWare_count=0;
I2C_GenerateSTART(I2Cx, ENABLE);
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return;
}
/* 发送器件地址(写)*/
I2C_Send7bitAddress(I2Cx, TMP100_ADDR, I2C_Direction_Transmitter);
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return;
}
/*发送Pointer Register*/
I2C_SendData(I2Cx, 0X01);
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWARE_WAIT_CIRCLE)//等待超时
{ I2C_HardWare_FAILUER=true;
I2C_HardWare_count=0;
I2C_GenerateSTOP(I2Cx, ENABLE); //发送停止位
return;
}
/* 写Configuration Register 12位温度 连续转换*/
I2C_SendData(I2Cx, 0XFE);
while((!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
&&(I2C_HardWare_count<=I2Cx_HARDWARE_WAIT_CIRCLE))
{
I2C_HardWare_count++;
};
if(I2C_HardWare_count>I2Cx_HARDWA
评论0