您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > 基于STM32F103的MLX90614驱动
$MLX90614.C/**********************************************************************************基于STM32F103的MLX90614红外温度传感器驱动程序********************************************************************************//*Includes------------------------------------------------------------------*/#includestdlib.h#includestm32f10x.h//===============================================================================//#includeMLX90614.H//--IOOperate--#defineSetBit_SDAGPIO_SetBits(GPIOB,GPIO_Pin_10)#defineClrBit_SDAGPIO_ResetBits(GPIOB,GPIO_Pin_10)#defineSetBit_SCKGPIO_SetBits(GPIOB,GPIO_Pin_11)#defineClrBit_SCKGPIO_ResetBits(GPIOB,GPIO_Pin_11)#defineSTA_SDAGPIOB-IDR&GPIO_Pin_10#defineSTA_SCLGPIOB-IDR&GPIO_Pin_11//--MLX90614CommandMode--#defineRAM0x00//对RAM进行操作#defineEEPROM0x20//对EEPROM进行操作#defineMODE0x60//进入命令模式#defineEXITMODE0x61//退出命令模式#defineREADFLAG0xf0//读标志#defineSLEEP0xff//进入睡眠模式#defineRD0x01//读操作#defineWR0x00//写操作//--MLX90614RAMAddress--#defineAMBITEMPADDR0x03//周围温度#defineIR1ADDR0x04//#defineIR2ADDR0x05//#defineENVITEMPADDR0x06//环境温度-40~125度#defineOBJ1TEMPADDR0x07//目标1温度,检测到的红外温度-70.01~382.19度#defineOBJ2TEMPADDR0x08//目标2温度,检测到的红外温度-70.01~382.19度//--MLX90614EEPROMAddress--#defineTOBJMAXADDR0x00//测量温度上限设定#defineTOBJMINADDR0x01//测量温度下限设定#definePWMCTRLADDR0x02//PWM设定#defineTARANGEADDR0x03//环境温度设定#defineKEADDR0x04//频率修正系数#defineCONFIGADDR0x05//配置寄存器#defineSMBUSADDR0x0e//器件地址设定#defineRES1ADDR0x0f//保留#defineRES2ADDR0x19//保留#defineID1ADDR0x1c//ID地址1#defineID2ADDR0x1d//ID地址2#defineID3ADDR0x1e//ID地址3$MLX90614.C#defineID4ADDR0x1f//ID地址4//--SpecialDefine--#defineACK_SUCCESS0x01//成功接收到应答信号#defineACK_FAIL0x00//没有收到应答信号#defineN5//以上宏定义可以放在头文件里面//============================================================================/***@功能I2C通信状态改变后的延时*@说明无*@参数无*@返回值无*/voidI2C_Delay(void){Delay_us(2);}/***@功能产生通讯开始信号*@说明MLX90614在SCK=1时,检测到SDA由1到0表示通信开始*@参数无*@返回值无*/voidI2C_Start(void){SetBit_SDA;SetBit_SCK;I2C_Delay();ClrBit_SDA;I2C_Delay();ClrBit_SCK;I2C_Delay();}/***@功能产生通讯停止信号*@说明MLX90614在SCK=1时,检测到SDA由0到1表示通信结束*@参数无*@返回值无*/voidI2C_Stop(void){ClrBit_SDA;ClrBit_SCK;I2C_Delay();SetBit_SCK;I2C_Delay();SetBit_SDA;I2C_Delay();}$MLX90614.C/***@功能将MLX90614的工作模式从PWM模式切换到SMBus模式*@说明从PWM模式切换到SMBus的方法是将SCL保持至少1.44ms以上的低电平*如果PWM没有使能就不需要发送请求命令*@参数无*@返回值无*/voidPwmToSMBus(void){ClrBit_SCK;Delay_us(1500);//大于1.44msSetBit_SCK;}/***@功能退出睡眠模式*@说明保持SCK高电平后,SDA持续至少33ms低电平,*在退出睡眠模式后需要间隔250ms(典型值)才输出数据。*@参数无*@返回值无*/voidEixt_Sleep(void){SetBit_SCK;SetBit_SDA;I2C_Delay();ClrBit_SDA;Delay_ms(35);//大于33ms退出睡眠模式SetBit_SDA;Delay_ms(260);//大于250ms开始输出数据}/***@功能从RAM/EEPROM中读取一个字节数据*@说明从MLX90614中的指定地址读取一个字节数据,高位在前,低位在后*@参数ack_nack:主机应答信号*@返回值dat:读取的数据*/uint8_tI2C_ReadByte(uint8_tack_nack){uint8_ti=0;uint8_tdat=0;ClrBit_SCK;Delay_us(5);for(i=0;i8;i++){dat=dat1;ClrBit_SCK;Delay_us(5*N);SetBit_SCK;Delay_us(5*N);if(STA_SDA){dat=dat|0x01;$MLX90614.C}}ClrBit_SCK;//第8个时钟下降沿Delay_us(3*N);if(!ack_nack)ClrBit_SDA;//在第9个时钟上升沿,主机发送应答信号elseSetBit_SDA;//在第9个时钟上升沿,主机发送应答信号Delay_us(3*N);SetBit_SCK;Delay_us(4*N);ClrBit_SCK;Delay_us(4*N);returndat;}/***@功能向EEPROM写一个字节数据*@说明在写完一个字节后检测MLX6014是否发送了应答信号*@参数dat:需要发送的字节*@返回值s_ack:应答信号状态*/uint8_tI2C_WriteByte(uint8_tdat){uint8_ti=0;uint8_ts_ack=0;ClrBit_SCK;ClrBit_SDA;I2C_Delay();for(i=0;i8;i++){ClrBit_SCK;Delay_us(3*N);if(dat&0x80)//改变SDA状态{SetBit_SDA;}else{ClrBit_SDA;}dat=dat1;Delay_us(4*N);SetBit_SCK;//SCK上升沿写入数据Delay_us(4*N);}ClrBit_SCK;//第8个下降沿开始,MLX90614将SDA置为低电平供主机检测是否正确接收SetBit_SDA;Delay_us(2*N);SetBit_SCK;//第9个上升沿后,主机检测SDA状态if(STA_SDA)//高电平表示正确接收数据$MLX90614.C{s_ack=ACK_FAIL;}else{s_ack=ACK_SUCCESS;}Delay_us(2*N);ClrBit_SCK;Delay_us(4*N);returns_ack;}/***@功能读MLX90614的RAM中内容*@说明主要读取三个,环境温度,物体温度1,物体温度2*器件从地址可以通过向EEPROM的SMBus地址0x0E中写入来进行设定。*@参数saddr:从机地址,7位地址,任何MLX90614都会对0x00地址作出反应*cmd:存放温度的寄存器地址*@返回值Data:读取出来的数值*/uint16_tI2C_ReadRAM(uint8_tsaddr,uint8_tcmd){uint16_tData;uint8_tDataL;//接收数据低字节uint8_tDataH;//接收数据高字节uint8_tPEC;uint8_tretry=10;//失败重复次数uint8_ts_ack=0;uint8_tPecreg;//计算的PEC值uint8_tbuf[6];//存储已接收数据的缓存ClrBit_SCK;while(retry--){I2C_Start();//发送起始位s_ack=I2C_WriteByte((saddr1)|WR);//发送从机地址和Wr位if(s_ack==ACK_SUCCESS){s_ack=0;s_ack=I2C_WriteByte(RAM|cmd);//发送命令,8位,RAM表示对RAM操作,cmd表示操作RAM的地址if(s_ack==ACK_SUCCESS){s_ack=0;I2C_Start();//重新发送起始位s_ack=I2C_WriteByte((saddr1)+1);//发送从机地址和Rd位if(s_ack==ACK_SUCCESS){s_ack=0;DataL=I2C_ReadByte(1);//读数据低字节DataH=I2C_ReadByte(1);//读数据高字节PEC=I2C_ReadByte(1);//读数据PEC字节//DataL=RX_byte(0);//$MLX90614.C//DataH=RX_byte(0);////PEC=RX_byte(1);I2C_Stop();//发送停止位buf[5]=(saddr1);buf[4]=EEPROM|cmd;buf[3]=(saddr1)|RD;buf[2]=DataL;buf[1]=DataH;buf[0]=0;Pecreg=PEC_Cal(buf,6);//调用计算PEC的函数if(Pecreg==PEC){break;//退出循环}}elsegotostop_rr;}elsegotostop_rr;}elsegotostop_rr;stop_rr:I2C_Stop();//发送停止位,芯片接收失败}PEC=PEC+1;Data=(DataH8)+DataL;returnData;}/***@功能清除EEPROM指定单元的数据*@说明在向EEPROM中写入数据之前必须先清除内存单元中的数据,也就是全部写入0*@参数saddr:从机地址cmd:发送命令*@返回值无*/voidI2C_ClearEEPROM(uint8_tsaddr,uint8_tcmd){uint8_tretry=10;//失败重复次数uint8_ts_ack=0;ClrBit_SCK;while(retry--){I2C_Start();//发送起始位s_ack=I2C_WriteByte((saddr1)|WR);//发送从机地址和W
本文标题:基于STM32F103的MLX90614驱动
链接地址:https://www.777doc.com/doc-2603472 .html