MLX90621驱动编写1
MLX90621驱动编写1
- MLX90621为迈来芯厂家的温度传感器,该器件能够进行生成16*4的温度矩阵。其通信方式采用I2C通信。该器件的驱动编写主要是从内部取到的温度数据需要经过多次补偿后才能得到测量的实际的物体温度。故需要根据芯片手册来编写相应地函数来实现MLX90621器件的使用。该器件的驱动编写可以按照以下步骤进行编写:1,最底层的I2C驱动;2 利用I2C来编写对MLX90621的读数据,写数据函数;3,利用编写好的读写函数来编写对MLX90621的操作函数,包括配置函数,读取配置函数,读取RAM函数,读取EEPROM函数等操作函数;4 利用操作函数完成对MLX90621的使用。其他类型的传感器的软件驱动也可以采用这种步骤来对其进行操作。下面进行具体讲解。
1 底层I2C驱动,该部分采用软件模拟的方式来实现。主要包括起始信号,停止信号,读写函数,应答信号和NACK信号。
2 利用I2C来编写对MLX90621的读写数据。图1为MLX90621的写时序图。从时序图可以看出,写入时的数据包括从机地址,写入命令,校验数据和要写入的数据。因此MLX90621的写函数可以如下:
/*Description :MLX90621利用I2C总线写数据*Param :u8 slaveAddr :地址:u8 command:命令:u8 checkvalue:校验数据:u16 data:要写入的数据*Return Code :None
*/
int MLX90621_I2CWrite(u8 slaveAddr,u8 command,u8 checkValue,u16 data)
{ u8 i;u8 sa;u8 cmd[5]={0,0,0,0,0}; //写入的命令static u16 dataCheck; //检查数据,检查写入的数据sa=(slaveAddr<<1); //写入的地址cmd[0]=command; //要操作的地址cmd[2] = data & 0x00FF; //低8位cmd[1] = cmd[2] - checkValue; //低8位减去checkValuecmd[4] = data >> 8; //高8位cmd[3] = cmd[4] - checkValue; //高8位减去checkValueIIC_Start(); //起始信号IIC_Send_Byte(sa); //发送地址IIC_Wait_Ack(); //等待ACKfor(i=0;i<5;i++){IIC_Send_Byte(cmd[i]); //发送数据IIC_Wait_Ack(); //等待ACK }IIC_Stop(); //停止信号MLX90621_I2CRead(slaveAddr,0x02,0X8F+command,0,1,&dataCheck); //将写入的数据读出来if(dataCheck!=data) //对数据进行校验{return -2;}return 0;
}
图1 写时序图
在读函数方面为了方便读写RAM和读写EEPROM这里将读RAM和EEPROM分开来操作,读EEPROM的时序图如图2所示,读RAM时序图如图3所示。因此读EEPROM函数如下
/*Description :MLX90621利用I2C总线读取EEPROM数据*Param :u8 slaveAddr :地址:u8 startAddress:起始地址:u16 nMemAddressRead:读取的个数:u8 *data:存储数据的指针*Return Code :None
*/
int MLX90621_I2CReadEEPROM(u8 slaveAddr, u8 startAddress, u16 nMemAddressRead, u8 *data)
{u8 sa;int cnt=0;u8 cmd=0;u8 i2cData[256]={0}; //EEPROM为256个字节sa = (slaveAddr << 1); //地址偏移cmd = startAddress; //起始地址IIC_Start(); //启动信号IIC_Send_Byte(sa); //发送地址IIC_Wait_Ack(); //等待回应IIC_Send_Byte(cmd); //发送起始地址IIC_Wait_Ack(); //等待回应//IIC_RepeatedStart(); //重新启动IIC_Start();sa=sa|0X01;IIC_Send_Byte(sa); //发送读命令IIC_Wait_Ack(); //等待ACKIIC_ReadBytes(nMemAddressRead,i2cData); //读取数据IIC_Stop(); //停止信号for(cnt=0;cnt<nMemAddressRead;cnt++){*data++=i2cData[cnt]; //转移数据}return 0;
}
读取RAM的函数如下
/*Description :MLX90621利用I2C总线读取数据*Param :u8 slaveAddr :地址:u8 command:命令:u8 startAddress:起始地址:u8 addressStep:读取的步长:u8 nMemAddressRead:读取的个数:u16 *data:存储数据的指针*Return Code :None
*/
int MLX90621_I2CRead(u8 slaveAddr, u8 command, u8 startAddress, u8 addressStep, u8 nMemAddressRead, u16 *data)
{u8 sa;int cnt=0;int i=0;u8 cmd[4]={0,0,0,0};u8 i2cData[132]={0};sa=(slaveAddr<<1);cmd[0] = command;cmd[1] = startAddress;cmd[2] = addressStep;cmd[3] = nMemAddressRead;IIC_Start(); //起始信号IIC_Send_Byte(sa); //发送地址IIC_Wait_Ack(); //等待ACKfor(i=0;i<4;i++){IIC_Send_Byte(cmd[i]); //发送数据IIC_Wait_Ack(); //等待ACK}//IIC_RepeatedStart(); //重新启动IIC_Start();sa = sa | 0x01; //读命令IIC_Send_Byte(sa); //发送出去IIC_Wait_Ack(); //等待ACKIIC_ReadBytes((nMemAddressRead << 1), i2cData);//读取数据IIC_Stop(); //结束后发送停止信号for(cnt=0; cnt < nMemAddressRead; cnt++){i = cnt << 1;*data++ = (u16)i2cData[i+1]*256 + (u16)i2cData[i]; //接收的时候先接收低位,再高位}return 0;}
图2 读取EEPROM时序图
图3 读取RAM时序图
3. 编写对MLX90621的操作函数。操作函数如下
/*Description :进行配置,读取EEPROM的值后,直接进行配置*Param :u8 *eeData 从eeprom数据中读取*Return Code :None
*/
int MLX90621_Configure(u8 *eeData)
{int error = 1;uint16_t value;error = MLX90621_I2CWrite(0x60, 0x04, 0xAA, eeData[247]); //写入振荡器微调值if (error != 0){return error;}value = 256*eeData[246] + eeData[245]; value = value | 0x0400;error = MLX90621_I2CWrite(0x60, 0x03, 0x55, value); //写入配置值return error;
}
/*Description :设置分辨率*Param :u8 resolution 分辨率:0x00 15 resolution:0x01 16 resolution:0x02 17 resolution:0x03 18 resolution*Return Code :None
*/
int MLX90621_SetResolution(u8 resolution)
{u16 cfgReg;u16 value;u16 error;value = (resolution & 0x03) << 4;error = MLX90621_GetConfiguration(&cfgReg);if(error == 0){value = (cfgReg & 0xFFCF) | value;error = MLX90621_I2CWrite(0x60, 0x03, 0x55, value); } return error;
}
int MLX90621_SetRefreshRate(u8 refreshRate)
{u16 cfgReg;u16 value;u16 error;value =(refreshRate & 0x0F);error = MLX90621_GetConfiguration(&cfgReg); if(error == 0){value = (cfgReg & 0xFFF0) | value;error = MLX90621_I2CWrite(0x60, 0x03, 0x55, value); } return error;
}
4 该器件比较复杂的部分是各种补偿值函数的编写,补偿函数见第二部分
MLX90621驱动编写1相关推荐
- 设备树下的platform 驱动编写
目录 设备树下的platform 驱动简介 硬件原理图分析 实验程序编写 修改设备树文件 platform 驱动程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测试 上一章我们详细的 ...
- Linux程序之触摸,linux 触摸屏驱动编写
早在诺基亚手机还比较流行的时候,那时候触摸屏用的还不多.但是随着触摸屏手机.即智能手机的流行,触摸屏基本成了手机的标配.所以,今天可以看看触摸屏驱动在linux上是如何进行的. 1.驱动目录 driv ...
- DS18B20 驱动编写
嵌入式开发平台:mini2440 DS18B20 所用GPIO:S3C2410_GPF(3) 一.DS18B20 时序分析 DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→ ...
- linux设备驱动编写基础
Linux设备驱动编写基础 一.linux中的驱动是以模块的形式存在的,这样就大大提高了驱动的灵活性,linux内核模块的程序结构如下: l 模块加载函数(必须):module_init() l ...
- 编写android驱动程序,Android 驱动编写LED-NDK程序
1. 首先编写LINUX内核模块LED #include #include #include #include #include #include #include #include MODULE_L ...
- linux驱动编写(入门)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在我离职之前,工作内容几乎不涉及到驱动方面的知识.我所要做的内容就是把客户对设备的请求拆分成一 ...
- ARM+SD2405 IIC_RTC驱动编写及IIC通讯协议
IIC通讯协议 协议简介 IIC(inter-integrated Circuit集成电路总线)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它需要两根信号线来完成信息交换,它是由 ...
- Linux驱动编写入门-新解
1.驱动编写后是一个C文件,通过make命令对其进行编译,生成 .KO文件,这个文件就是可执行的驱动文件,通过使用insmod xx.ko即可执行此驱动文件.如下为一个完整的驱动程序C文件.(用的是讯 ...
- IMX6ull_Linux驱动编写(1)
IMX6ull_Linux驱动编写-1 linux系统下程序编写架构分析 前言 整体分析 驱动大致框架介绍 Makefile文件 运行流程测试 linux系统下程序编写架构分析 前言 Linux属 ...
最新文章
- MikuMikuShaders
- MM模块常用T-code
- 【吊炸天】TensorFlow什么的都弱爆了,强者只用Numpy搭建神经网络
- docker 开启服务
- 比较三个数大小PHP代码,php 写程序求三个数的最大值
- Report Builder:SRW包
- Java -Dfile.encoding=UTF-8 出现乱码问题原因分析
- 自然语言处理基本概念及基础工具
- 常见HTTP状态码大全
- 华为鸿蒙deveco studio编译时提示Browserslist: caniuse-lite is outdated的解决办法
- android 考勤界面,一种android终端实时考勤记录统计展现方法和装置与流程
- 遇到的问题集合(倒序)
- 笔记本无线自动配置服务器,笔记本无线网络连接IP地址怎么设置
- Java实现 LeetCode 492 构造矩形
- premiere如何把多个视频放在同一个视频画面
- CF Card Reader Test市面CF读卡器不完全测评
- 软件质量属性的两个模型(Software Quality Attributes)—中英文对照
- 宇视阿宇摄像机夜间效果好吗?画面可以看清楚吗?
- Redis常用命令和操作
- android唱吧源码,Android版唱吧K歌王