首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于STM32 I2C的TMP101温度传感器的C源码(3)

基于STM32 I2C的TMP101温度传感器的C源码(3)


TM 报警极性.POL 也是报警的 咱先不管.....
这个STM32 历程没有借助DMA 与中断。

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
u8 I2c_Buf[3]="AB0";//温度存放
void I2C_Configuration(void)
{
I2C_InitTypeDef  I2C_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); //开I2C的时钟
/* PB6,7 SCL and SDA */
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏复用功能
GPIO_Init(GPIOB, &GPIO_InitStructure);

    I2C_DeInit(I2C1);
    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 = 0x30; //STM32自身地址
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //使能应答(ACK)
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //应答7位地址
    I2C_InitStructure.I2C_ClockSpeed = 100000; //100K速度
   
I2C_Cmd(I2C1, ENABLE);
I2C_Init(I2C1, &I2C_InitStructure);
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
}
/***************************************************
**函数名:I2C_ReadTmp
**功能:读取tmp101的2个字节温度
***************************************************/

void I2C_ReadTmp(void)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); /*检测总线是否忙 就是看 SCL 或SDA是否为 低 */
  
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);

/* 发送起始位 */
    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /*EV5,主模式*/

    /*发送器件地址(写)*/
    I2C_Send7bitAddress(I2C1,  0x92, I2C_Direction_Transmitter);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/*发送Pointer Register*/
    I2C_SendData(I2C1, 0X00);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /*数据已发送*/
  
/*起始位*/
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

/*发送器件地址(读)*/

I2C_Send7bitAddress(I2C1, 0x92, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
/* 读Temperature Register*/
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */
I2c_Buf[0]= I2C_ReceiveData(I2C1);

    I2C_AcknowledgeConfig(I2C1, DISABLE); //最后一位后要关闭应答的
    I2C_GenerateSTOP(I2C1, ENABLE);   //发送停止位

  /*● 为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)必须清除ACK位。
● 为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)设置STOP/START位。
● 只接收一个字节时,刚好在EV6之后(EV6_1时,清除ADDR之后)要关闭应答和停止条件的产生位。*/


while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */
I2c_Buf[1]= I2C_ReceiveData(I2C1);
     
/* Decrement the read bytes counter */
   
/*再次允许应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
}

/*************************************************
**函数名:void I2C_InitTmp(void)
**功能:初始化TMP101
*************************************************/

void I2C_InitTmp(void)
{
   I2C_GenerateSTART(I2C1, ENABLE);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  

   /* 发送器件地址(写)*/
   I2C_Send7bitAddress(I2C1, 0X92, I2C_Direction_Transmitter);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  
   /*发送Pointer Register*/
   I2C_SendData(I2C1, 0X01);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* 写Configuration Register  12位温度 连续转换*/
   I2C_SendData(I2C1, 0XFE);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

   I2C_GenerateSTOP(I2C1, ENABLE);
  
  
}


//测试用 使用之前要先调用I2C_InitTmp 初始化TMP101
void I2C_Test(void)
{
char a[8]=" ";
u32 temp;
float tmp;
I2C_ReadTmp(); //读温度
temp=I2c_Buf[0]; //转换温度
temp=temp<<4;
temp=temp|I2c_Buf[1]>>4;
tmp=(temp/16.0); /*仅处理了正的温度 负温度取反后加1 再按正温度处理*/
a[0]=(char)tmp/10+48;
a[1]=(char)tmp%10+48;
a[2]='.';
a[3]=(char)((int)(tmp*10)%10+48);
a[4]=(char)((int)(tmp*100)%10+48);
a[5]=(char)((int)(tmp*1000)%10+48);
a[6]='C';
USART1_Puts(a); //USART 出温度
USART1_Puts("\r\n");
}
继承事业,薪火相传
返回列表