教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 初中教育 >

基于STM32F103的MLX90614驱动(2)

来源:网络收集 时间:2026-05-26
导读: e(1); DataH= I2C_ReadByte(1); PEC= I2C_ReadByte(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); if(Pecreg== PEC){

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字,全部文档内容请下载后查看。喜欢就下载吧 ……
基于STM32F103的MLX90614驱动(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/47838.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)