基于STM32F103的MLX90614驱动(2)
e(1); DataH= I2C_ReadByte(1); PEC= I2C_ReadByte(1); I2C_Stop(); buf[5]=(saddr<<1); buf[4]=EEPROM|cmd; buf[3]=(saddr<<1)|RD; buf[2]=DataL; buf[1]=DataH; buf[0]=0; Pecreg=PEC_Cal(buf,6); if(Pecreg== PEC){ break;}} else goto stop_re;} else goto stop_re;} else goto stop_re; stop_re: I2C_Stop();} Data= (DataH<<8)+ DataL; return Data;
//发送起始位//发送从机地址和Wr位
//发送命令
//重新发送起始位//发送从机地址和Rd位
//读数据低字节//读数据高字节//读数据PEC字节//发送停止位
//调用计算 PEC的函数
}/** *@功能写EEPROM指定单元的数据 *@说明在向EEPROM中写入数据之前必须先清除内存单元中的数据,也就是全部写入0 *@参数 saddr:要清除数据的内存单元 *@返回值无 */ void I2C_WriteEEPROM(uint8_t saddr,uint8_t cmd,uint8_t DataL,uint8_t DataH){ uint8_t retry= 10;//失败重复次数 uint8_t s_ack= 0; uint8_t Pecreg;//存储计算所得PEC结果
可以直接在STM32F103上面运行的驱动程序
$MLX90614.C
uint8_t
buf[6];
//存储将要发送字节的缓冲器
buf[5]=0; buf[4]=saddr<<1; buf[3]=cmd; buf[2]=DataL; buf[1]=DataH; buf[0]=0; Pecreg=PEC_Cal(buf,6); ClrBit_SCK; while(retry--){ I2C_Start(); s_ack= I2C_WriteByte((saddr<<1)|WR); if(s_ack== ACK_SUCCESS){ s_ack= 0; s_ack= I2C_WriteByte(EEPROM|cmd); if(s_ack== ACK_SUCCESS){ s_ack= 0; s_ack= I2C_WriteByte(DataL); if(s_ack== ACK_SUCCESS){ s_ack= 0; s_ack= I2C_WriteByte(DataH); if(s_ack== ACK_SUCCESS){ s_ack= 0; s_ack= I2C_WriteByte(Pecreg); if(s_ack== ACK_SUCCESS){ I2C_Stop(); break;} else goto stop_we;} else goto stop_we;} else goto stop_we;} else goto stop_we;} else goto stop_we; stop_we: I2C_Stop();} Delay_ms(5);}/** *@功能 *@说明
//发送起始位//发送从机地址和Wr位
//发送命令
//发送低字节
//发送高字节
//发送PEC码
//发送停止位//退出循环
//写入之后等待5ms
计算PEC包裹校验码,根据接收的字节计算PEC码计算传入数据的PEC码
可以直接在STM32F103上面运行的驱动程序
$MLX90614.C
pec[]:传入的数据 n:传入数据个数 *@返回值 pec[0]:计算得到的PEC值 */ uint8_t PEC_Cal(uint8_t pec[],uint16_t n){ unsigned char crc[6]; unsigned char Bitposition=47; unsigned char shift; unsigned char i; unsigned char j; unsigned char temp; do{ crc[5]=0; crc[4]=0; crc[3]=0; crc[2]=0; crc[1]=0x01; crc[0]=0x07; Bitposition=47; shift=0;//在传送的字节中找出第一个“1”
*@参数
//载入 CRC数值 0x000000000107
//设置Bitposition的最大值为47
i=5;//设置最高标志位 (包裹字节标志) j=0;//字节位标志,从最低位开始 while((pec[i]&(0x80>>j))==0&& (i>0)){ Bitposition--; if(j<7){ j++;} else{ j=0x00; i--;}}//while语句结束,并找出Bitposition中为“1”的最高位位置 shift=Bitposition-8;//得到CRC数值将要左移/右移的数值“shift”//对CRC数据左移“shift”位 while(shift){ for(i=5;i<0xFF;i--){ if((crc[i-1]&0x80)&& (i>0))//核对字节的最高位的下一位是否为"1"{//是 -
当前字节+ 1 temp=1;//否 -当前字节+ 0}//实现字节之间移动“1” else{ temp=0;}
可以直接在STM32F103上面运行的驱动程序
$MLX90614.C
crc[i]<<=1; crc[i]+=temp;} shift--;}//pec和crc之间进行异或计算 for(i=0;i<=5;i++){ pec[i]^=crc[i];}}while(Bitposition>8); return pec[0];//返回计算所得的crc数值}/** *@功能设定MLX90614器件地址 *@说明器件从地址可以通过向EEPROM的SMBus地址0x0E中写入来进行设定。为了给从器件设定地址,必须先以0x00+Wr当作从地址开始,当主机发送此命令,MLX90614总是会反馈并忽略掉内部芯片编码信息。向EEPROM写入数据前需要清除原来的数据,就是向修改单元写入0x0000擦除之后需要等待5ms才可以重新写入数据修改地址时写入的地址高字节MLX90614会忽略修改之后需要重新将MLX90614的电源断开重启。 *@参数 soaddr:从机旧地址 snaddr:从机新地址 *@返回值无 */ void I2C_SetSlaveAddr(uint8_t soaddr,uint8_t snaddr){// uint8_t cmd= EEPROM|SMBUSADDR;// uint8_t DataL= snaddr;// uint8_t DataH= 0x00;// EEPROM_WRITE(snaddr,cmd,0x00,0x00);// EEPROM_WRITE(snaddr,cmd,DataL,DataH);}
…… 此处隐藏:1124字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [初中教育]婚姻家庭法学教学教案
- [初中教育]浅谈小学语文教学中的创新教育
- [初中教育]中华人民共和国侵权责任法2009
- [初中教育]2016-2022年中国薄膜太阳能电池行业发
- [初中教育]多级轻型井点降水的应用
- [初中教育]外语教学法流派介绍和简评
- [初中教育]实验一、典型环节及其阶跃响应
- [初中教育]内蒙古2012-2013学年度国家奖学金获奖
- [初中教育]移动通信营销渠道管理探讨
- [初中教育]初三化学第一学期第一第二章基础知识点
- [初中教育]一天的食物教学设计
- [初中教育]光导照明系统的基本结构及工作原理
- [初中教育]长春市十一高、东北师范大学附属中学、
- [初中教育]“十三五”规划重点-配重式装卸车项目
- [初中教育]领导方法和领导艺术
- [初中教育]第三章 植物病虫草鼠害诊断与防治基
- [初中教育]2019届九年级语文上册 第二单元 6纪念
- [初中教育]甲级单位编制水豆腐项目可行性报告(立
- [初中教育]Ch8-1补充 09101数据库系统原理及应用-
- [初中教育]2017-2023年中国吊装设备行业市场分析
- 制作毕业纪念册需要哪些材料
- 2015-2016学年高二化学苏教版选修4课件
- 哈佛管理导师-创建商业案例
- 职场交际中的谈吐礼仪知识与职场会议接
- 中国糕点及面包行业发展现状与竞争战略
- 沂河“12·7”洪水茶山拦河坝
- 管道水流量计算公式
- 4-2发电机火灾事故处置方案
- 数字信号处理实验五
- 2009年经济师(中级)金融专业知识全真试
- 历史街区保护规划--04历史文化遗产保护
- 宁夏回族自治区中小学职称评价标准
- 评先评优测评表
- 圆的切线证明及线段长求解在在中考中的
- 【解析版】2015年江苏省南京外国语学校
- 人教版八年级上册科学第一章习题精华
- 责任心与执行力
- SA8000社会责任管理体系标准培训
- IgA肾病的饮食应注意
- 杭州市建设工程文件归档整理方案(试行)




