基于STM32F103的MLX90614驱动
可以直接在STM32F103上面运行的驱动程序
$MLX90614.C
/** ****************************************************************************** * *基于STM32F103的MLX90614红外温度传感器驱动程序 * ****************************************************************************** *//* Includes ------------------------------------------------------------------*/#include"stdlib.h"#include"stm32f10x.h"//===============================================================================//#include"MLX90614.H"//-- IO Operate -#define SetBit_SDA GPIO_SetBits(GPIOB,GPIO_Pin_10)#define ClrBit_SDA GPIO_ResetBits(GPIOB,GPIO_Pin_10)#define SetBit_SCK GPIO_SetBits(GPIOB,GPIO_Pin_11)#define ClrBit_SCK GPIO_ResetBits(GPIOB,GPIO_Pin_11)#define STA_SDA GPIOB->IDR& GPIO_Pin_10#define STA_SCL GPIOB->IDR& GPIO_Pin_11//-- MLX90614 Command Mode -#define RAM#define EEPROM#define MODE#define EXITMODE#define READFLAG#define SLEEP#define RD#define WR//-- MLX90614 RAM Address -#define AMBITEMPADDR#define IR1ADDR#define IR2ADDR#define ENVITEMPADDR#define OBJ1TEMPADDR -70.01~ 382.19度#define OBJ2TEMPADDR -70.01~ 382.19度
0x00 0x20 0x60 0x61 0xf0 0xff 0x01 0x00
//对RAM进行操作//对EEPROM进行操作//进入命令模式//退出命令模式//读标志//进入睡眠模式//读操作//写操作
0x03 0x04 0x05 0x06 0x07 0x08
//周围温度//////环境温度 -40~ 125度//目标1温度,检测到的红外温度//目标2温度,检测到的红外温度
//-- MLX90614 EEPROM Address -#define TOBJMAXADDR 0x00#define TOBJMINADDR 0x01#define PWMCTRLADDR 0x02#define TARANGEADDR 0x03#define KEADDR 0x04#define CONFIGADDR 0x05#define SMBUSADDR 0x0e#define RES1ADDR 0x0f#define RES2ADDR 0x19#define ID1ADDR 0x1c#define ID2ADDR 0x1d#define ID3ADDR 0x1e
//测量温度上限设定//测量温度下限设定//PWM设定//环境温度设定//频率修正系数//配置寄存器//器件地址设定//保留//保留//ID地址1//ID地址2//ID地址3
可以直接在STM32F103上面运行的驱动程序
$MLX90614.C
#define
ID4ADDR
0x1f
//ID地址4
//-- Special Define -#define ACK_SUCCESS#define ACK_FAIL
0x01 0x00
//成功接收到应答信号//没有收到应答信号
#define
N
5
//以上宏定义可以放在头文件里面//============================================================================/** *@功能 I2C通信状态改变后的延时 *@说明无 *@参数无 *@返回值无 */ void I2C_Delay(void){ Delay_us(2);}/** *@功能产生通讯开始信号 *@说明 MLX90614在SCK=1时,检测到SDA由1到0表示通信开始 *@参数无 *@返回值无 */ void I2C_Start(void){ SetBit_SDA; SetBit_SCK; I2C_Delay(); ClrBit_SDA; I2C_Delay(); ClrBit_SCK; I2C_Delay();}/** *@功能产生通讯停止信号 *@说明 MLX90614在SCK=1时,检测到SDA由0到1表示通信结束 *@参数无 *@返回值无 */ void I2C_Stop(void){ ClrBit_SDA; ClrBit_SCK; I2C_Delay(); SetBit_SCK; I2C_Delay(); SetBit_SDA; I2C_Delay();}
可以直接在STM32F103上面运行的驱动程序
$MLX90614.C
/** *@功能将MLX90614的工作模式从PWM模式切换
到SMBus模式 *@说明从PWM模式切换到SMBus的方法是将SCL保持至少1.44ms以上的低电平 *如果PWM没有使能就不需要发送请求命令 *@参数无 *@返回值无 */ void PwmToSMBus(void){ ClrBit_SCK; Delay_us(1500);//大于1.44ms SetBit_SCK;}/** *@功能退出睡眠模式 *@说明保持SCK高电平后,SDA持续至少33ms低电平, *在退出睡眠模式后需要间隔250ms(典型值)才输出数据。 *@参数无 *@返回值无 */ void Eixt_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_t I2C_ReadByte(uint8_t ack_nack){ uint8_t i=0; uint8_t dat=0; ClrBit_SCK; Delay_us(5); for(i=0;i<8;i++){ dat= dat<<1; ClrBit_SCK; Delay_us(5*N); SetBit_SCK; Delay_us(5*N); if(STA_SDA){ dat= dat| 0x01;
可以直接在STM32F103上面运行的驱动程序
$MLX90614.C
}} ClrBit_SCK; Delay_us(3*N); if(!ack_nack) ClrBit_SDA; else SetBit_SDA; Delay_us(3*N); SetBit_SCK; Delay_us(4*N); ClrBit_SCK; Delay_us(4*N); return dat;}/** *@功能向EEPROM写一个字节数据 *@说明在写完一个字节后检测MLX6014是否发送了应答信号 *@参数 dat:需要发送的字节 *@返回值 s_ack:应答信号状态 */ uint8_t I2C_WriteByte(uint8_t dat){ uint8_t i=0; uint8_t s_ack=0; ClrBit_SCK; ClrBit_SDA; I2C_Delay(); for(i=0;i<8;i++){ ClrBit_SCK; Delay_us(3*N); if(dat&0x80){ SetBit_SDA;} else{ ClrBit_SDA;} dat= dat<<1; Delay_us(4*N); SetBit_SCK; Delay_us(4*N);}//第8个时钟下降沿
//在第9个时钟上升沿,主机发送应答信号//在第9个时钟上升沿,主机发送应答信号
//改变SDA状态
//SCK上升沿写入数据
ClrBit_SCK;//第8个下降沿开始,MLX90614将SDA置为低电平供主机检测是否正确接收 SetBit_SDA; Delay_us(2*N); SetBit_SCK;//第9个上升沿后,主机检测SDA状态 if(STA_SDA)//高电平表示正确接收数据
可以直接在STM32F103上面运行的驱动程序
$MLX90614.C
{ s_ack= ACK_FAIL;} else{ s_ack= ACK_SUCCESS;} Delay_us(2*N); ClrBit_SCK; Delay_us(4*N); return s_ack;}
/** *@功能读MLX90614的RAM中内容 *@说明主要读取三个,环境温度,物体温度1,物体温度2 *器件从地址可以通过向EEPROM的SMBus地址0x0E中写入来进行设定。 *@参数 saddr:从机地址,7位地址,任何MLX90614都会对0x00地址作出反应 * cmd:存放温度的寄存器地址 *@返回值 Data:读取出来的数值 */ uint16_t I2C_ReadRAM(uint8_t saddr,uint8_t cmd){ uint16_t Data; uint8_t DataL;//接收数据低字节 uint8_t DataH;//接收数据高字节 uint8_t PEC; uint8_t retry= 10;//失败重复次数 uint8_t s_ack= 0; uint8_t Pecreg;//计算的PEC值 uint8_t buf[6];//存储已接收数据的缓存 ClrBit_SCK; while(retry--){ I2C_Start();//发送起
始位 s_ack= I2C_WriteByte((saddr<<1)|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((saddr<<1)+1);//发送从机地址和Rd位 if(s_ack== ACK_SUCCESS){ s_ack= 0; DataL= I2C_ReadByte(1);//读数据低字节 DataH= I2C_ReadByte(1);//读数据高字节 PEC= I2C_ReadByte( …… 此处隐藏:5138字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [初中教育]婚姻家庭法学教学教案
- [初中教育]浅谈小学语文教学中的创新教育
- [初中教育]中华人民共和国侵权责任法2009
- [初中教育]2016-2022年中国薄膜太阳能电池行业发
- [初中教育]多级轻型井点降水的应用
- [初中教育]外语教学法流派介绍和简评
- [初中教育]实验一、典型环节及其阶跃响应
- [初中教育]内蒙古2012-2013学年度国家奖学金获奖
- [初中教育]移动通信营销渠道管理探讨
- [初中教育]初三化学第一学期第一第二章基础知识点
- [初中教育]一天的食物教学设计
- [初中教育]光导照明系统的基本结构及工作原理
- [初中教育]长春市十一高、东北师范大学附属中学、
- [初中教育]“十三五”规划重点-配重式装卸车项目
- [初中教育]领导方法和领导艺术
- [初中教育]第三章 植物病虫草鼠害诊断与防治基
- [初中教育]2019届九年级语文上册 第二单元 6纪念
- [初中教育]甲级单位编制水豆腐项目可行性报告(立
- [初中教育]Ch8-1补充 09101数据库系统原理及应用-
- [初中教育]2017-2023年中国吊装设备行业市场分析
- 制作毕业纪念册需要哪些材料
- 2015-2016学年高二化学苏教版选修4课件
- 哈佛管理导师-创建商业案例
- 职场交际中的谈吐礼仪知识与职场会议接
- 中国糕点及面包行业发展现状与竞争战略
- 沂河“12·7”洪水茶山拦河坝
- 管道水流量计算公式
- 4-2发电机火灾事故处置方案
- 数字信号处理实验五
- 2009年经济师(中级)金融专业知识全真试
- 历史街区保护规划--04历史文化遗产保护
- 宁夏回族自治区中小学职称评价标准
- 评先评优测评表
- 圆的切线证明及线段长求解在在中考中的
- 【解析版】2015年江苏省南京外国语学校
- 人教版八年级上册科学第一章习题精华
- 责任心与执行力
- SA8000社会责任管理体系标准培训
- IgA肾病的饮食应注意
- 杭州市建设工程文件归档整理方案(试行)




