这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » MLX90614的SMbus协议通信

共6条 1/1 1 跳转至

MLX90614的SMbus协议通信

菜鸟
2015-05-13 20:33:28     打赏
大家好,我最近在使用MLX90614设计一款便携式温度测量计,用的是STC系列的51内核的单片机,设计过程中遇到了一些问题:MLX90614是5V电压版的,单片机晶振11.0592MHZ,SMbus协议通信,网络中只使用了一个MLX90614,按照数据手册的描述,只有一个MLX90614时可以通过0X00来访问从设备,我通过单片机给MLX90614发送0X00,但是单片机一只接收不到应答信号,就是SDA返回的数据一直是1,想请问一下懂得的大神,问题出在哪里?



关键词: MLX90614     传感器     温度测量     电子仪表    

菜鸟
2015-05-13 20:35:16     打赏
2楼

我把代码贴出来吧,程序代码是从网上改编过来的,数据通过串口打印到电脑上进行调试!

#include"reg52.h"
#include"intrins.h"
//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
//**************端口定义**************
sbit SCL=P2^0;//时钟线
sbit SDA=P2^1;//数据线
//************数据定义****************
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg;
//************函数声明*****************************************
void start_bit(); //MLX90614发起始位子程序
void stop_bit(); //MLX90614发结束位子程序
uchar rx_byte(void); //MLX90614接收字节子程序
void send_bit(void); //MLX90614发送位子程序
void tx_byte(uchar dat_byte); //MLX90614接收字节子程序
void receive_bit(void); //MLX90614接收位子程序
void delay(uint N); //延时程序
void display(uint Tem);
void uart_txd(char *a);
void init_uart();
void uart_txd1(char n) ;
uint memread(void); //读温度数据
char TemCode[6];
//*************主函数*******************************************
void main()
{
  uint Tem;
//函数部分
  init_uart();
  SCL=1;
  SDA=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SCL=0;
  delay(1000);
  SCL=1;
//init1602();      这里写串口初始化程序
 
  while(1) {
            Tem=memread();
            display(Tem);     //函数里调用串口发送数据
            delay(20);
           }
}
//*********输入转换并显示*********
void display(uint Tem)
{
  uint T,a,b;
  T=Tem*2;
/*1*///dis_cmd_wrt(0x01);//清屏
  if(T>=27315){
               T=T-27315;
               a=T/100;
               b=T-a*100;
               TemCode[0]=a/100+'0';         //在这里增加了内容
               TemCode[1]=a%100/10+'0';         /*1*/
               TemCode[2]=a%10+'0';
               TemCode[3]='.';
               TemCode[4]=b/10+'0';
               TemCode[5]=b%10+'0';
               }
  else{
                 TemCode[0]='-';
               TemCode[1]=a/10+'0';
               TemCode[2]=a%10+'0';
               TemCode[3]='.';
               TemCode[4]=b/10+'0';
               TemCode[5]=b%10+'0';
 
      }
  uart_txd(TemCode);                                          //在这里调用串口显示函数
}
//************************************
void start_bit(void)
{
  SDA=1;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=1;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  SDA=0;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=0;
  _nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void stop_bit(void)
{
  SCL=0;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  SDA=0;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  SCL=1;
  _nop_();_nop_();_nop_();_nop_();_nop_();
  SDA=1;
}
//---------发送一个字节---------
void tx_byte(uchar dat_byte)
{
  char i,n,dat;
  n=Nack_counter;
TX_again:
  dat=dat_byte;
  for(i=0;i<8;i++){
                   if(dat&0x80)
                   bit_out=1;
                   else
                   bit_out=0;
                   send_bit();
                   dat=dat<<1;
                  }
  receive_bit();
  if(bit_in==1){
                   uart_txd1(n);
                stop_bit();
                if(n!=0) {
                          n--;
                          goto Repeat;
                         }
                else
                goto exit;
               }
  else
  goto exit;
Repeat:
  start_bit();
  goto TX_again;
exit: ;
}
//-----------发送一个位---------
void send_bit(void)
{
  if(bit_out==0)
  SDA=0;
  else
  SDA=1;
  _nop_();
  SCL=1;
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  SCL=0;
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
}
//----------接收一个字节--------
uchar rx_byte(void)
{
  uchar i,dat;
  dat=0;
  for(i=0;i<8;i++){
                   dat=dat<<1;
                   receive_bit();
                   if(bit_in==1)
                   dat=dat+1;
                  }
  send_bit();
  return dat;
}
//----------接收一个位----------
void receive_bit(void)
{
  //SDA=1;
  bit_in=1;
  SCL=1;
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
  bit_in=SDA;
  _nop_();
  SCL=0;
  _nop_();_nop_();_nop_();_nop_();
  _nop_();_nop_();_nop_();_nop_();
}
//------------延时--------------
void delay(uint N)
{
  uint i;
  for(i=0;i<N;i++)
  _nop_();
}
//------------------------------
uint memread(void)
{
  start_bit();
  tx_byte(0x00); //Send SlaveAddress
  tx_byte(0x07); //Send Command
//------------
  start_bit();
  tx_byte(0x01);
  bit_out=0;
  DataL=rx_byte();
  bit_out=0;
  DataH=rx_byte();
  bit_out=1;
  Pecreg=rx_byte();
  stop_bit();
  return(DataH*256+DataL);
}
/*1*/
/*下面是自己写的函数*/
void init_uart()
{
     TMOD =0X20;
    TH1=0Xfd;
    TL1=0Xfd;
    TR1=1;        
    REN=0;
    SM0=0;
    SM1=1;
    EA=1;
    ES=1;
}
void uart_txd(char * a){
    uint i;
    ES=0;
    for(i=0;i<6;i++) {
    SBUF=a[i];
    while(!TI);
    TI=0;
    }
    delay(100);
}
void uart_txd1(char n){
    ES=0;
    SBUF=n;
    while(!TI);
    TI=0;
    delay(100);
}


菜鸟
2015-05-13 20:38:15     打赏
3楼
#include"reg52.h" 
#include"intrins.h" 
//************************************ 
#define uint unsigned int 
#define uchar unsigned char 
#define Nack_counter 10 
//**************端口定义************** 
sbit SCL=P2^0;//时钟线
sbit SDA=P2^1;//数据线
//************数据定义**************** 
bdata uchar flag;//可位寻址数据
sbit bit_out=flag^7; 
sbit bit_in=flag^0; 
uchar DataH,DataL,Pecreg; 
//************函数声明***************************************** 
void start_bit(); //MLX90614发起始位子程序
void stop_bit(); //MLX90614发结束位子程序
uchar rx_byte(void); //MLX90614接收字节子程序
void send_bit(void); //MLX90614发送位子程序
void tx_byte(uchar dat_byte); //MLX90614接收字节子程序
void receive_bit(void); //MLX90614接收位子程序
void delay(uint N); //延时程序
void display(uint Tem);
void uart_txd(char *a);
void init_uart();
void uart_txd1(char n) ;
uint memread(void); //读温度数据
char TemCode[6];
//*************主函数******************************************* 
void main() 
{ 
  uint Tem; 
//函数部分 
  init_uart();
  SCL=1;
  SDA=1;
  _nop_(); 
  _nop_();
  _nop_();
  _nop_(); 
  SCL=0; 
  delay(1000); 
  SCL=1; 
//init1602(); 	 这里写串口初始化程序
  
  while(1) { 
            Tem=memread(); 
            display(Tem); 	//函数里调用串口发送数据
            delay(20); 
           } 
} 
//*********输入转换并显示********* 
void display(uint Tem) 
{ 
  uint T,a,b; 
  T=Tem*2; 
/*1*///dis_cmd_wrt(0x01);//清屏 
  if(T>=27315){ 
               T=T-27315; 
               a=T/100; 
               b=T-a*100;
			   TemCode[0]=a/100+'0';		 //在这里增加了内容
	           TemCode[1]=a%100/10+'0';		 /*1*/
	           TemCode[2]=a%10+'0';
	           TemCode[3]='.';
	           TemCode[4]=b/10+'0';
	           TemCode[5]=b%10+'0';
			   } 
  else{
  	           TemCode[0]='-';
		       TemCode[1]=a/10+'0';
		       TemCode[2]=a%10+'0';
		       TemCode[3]='.';
		       TemCode[4]=b/10+'0';
		       TemCode[5]=b%10+'0';
  
      }
  uart_txd(TemCode);                        				  //在这里调用串口显示函数 
}
//************************************ 
void start_bit(void) 
{ 
  SDA=1; 
  _nop_();_nop_();_nop_();_nop_();_nop_(); 
  SCL=1; 
  _nop_();_nop_();_nop_();_nop_();_nop_(); 
  SDA=0; 
  _nop_();_nop_();_nop_();_nop_();_nop_(); 
  SCL=0; 
  _nop_();_nop_();_nop_();_nop_();_nop_(); 
} 
//------------------------------ 
void stop_bit(void) 
{ 
  SCL=0; 
  _nop_();_nop_();_nop_();_nop_();_nop_(); 
  SDA=0; 
  _nop_();_nop_();_nop_();_nop_();_nop_(); 
  SCL=1; 
  _nop_();_nop_();_nop_();_nop_();_nop_(); 
  SDA=1; 
} 
//---------发送一个字节--------- 
void tx_byte(uchar dat_byte) 
{ 
  char i,n,dat; 
  n=Nack_counter; 
TX_again: 
  dat=dat_byte; 
  for(i=0;i<8;i++){ 
                   if(dat&0x80) 
                   bit_out=1; 
                   else 
                   bit_out=0; 
                   send_bit(); 
                   dat=dat<<1; 
                  } 
  receive_bit(); 
  if(bit_in==1){
   			    uart_txd1(n);
                stop_bit(); 
                if(n!=0) {
                          n--;
                          goto Repeat;
                         } 
                else 
                goto exit; 
               } 
  else 
  goto exit; 
Repeat: 
  start_bit(); 
  goto TX_again; 
exit: ; 
} 
//-----------发送一个位--------- 
void send_bit(void) 
{ 
  if(bit_out==0) 
  SDA=0; 
  else 
  SDA=1; 
  _nop_(); 
  SCL=1; 
  _nop_();_nop_();_nop_();_nop_(); 
  _nop_();_nop_();_nop_();_nop_(); 
  SCL=0; 
  _nop_();_nop_();_nop_();_nop_(); 
  _nop_();_nop_();_nop_();_nop_(); 
} 
//----------接收一个字节-------- 
uchar rx_byte(void) 
{ 
  uchar i,dat; 
  dat=0; 
  for(i=0;i<8;i++){ 
                   dat=dat<<1; 
                   receive_bit(); 
                   if(bit_in==1) 
                   dat=dat+1; 
                  } 
  send_bit(); 
  return dat; 
} 
//----------接收一个位---------- 
void receive_bit(void) 
{ 
  //SDA=1;
  bit_in=1; 
  SCL=1; 
  _nop_();_nop_();_nop_();_nop_(); 
  _nop_();_nop_();_nop_();_nop_(); 
  bit_in=SDA; 
  _nop_(); 
  SCL=0; 
  _nop_();_nop_();_nop_();_nop_(); 
  _nop_();_nop_();_nop_();_nop_(); 
} 
//------------延时-------------- 
void delay(uint N) 
{ 
  uint i; 
  for(i=0;i<N;i++) 
  _nop_(); 
} 
//------------------------------ 
uint memread(void) 
{ 
  start_bit(); 
  tx_byte(0x00); //Send SlaveAddress 
  tx_byte(0x07); //Send Command 
//------------ 
  start_bit(); 
  tx_byte(0x01); 
  bit_out=0; 
  DataL=rx_byte(); 
  bit_out=0; 
  DataH=rx_byte(); 
  bit_out=1; 
  Pecreg=rx_byte(); 
  stop_bit(); 
  return(DataH*256+DataL); 
}
/*1*/
/*下面是自己写的函数*/ 
void init_uart()
{
 	TMOD =0X20;
    TH1=0Xfd;
    TL1=0Xfd;
    TR1=1;		
    REN=0;
    SM0=0;
    SM1=1;
    EA=1;
    ES=1;
}
void uart_txd(char * a){
    uint i;
	ES=0;
	for(i=0;i<6;i++) {
	SBUF=a[i];
	while(!TI);
	TI=0;
	}
	delay(100);
}
void uart_txd1(char n){
	ES=0;
	SBUF=n;
	while(!TI);
	TI=0;
	delay(100);
}

 


菜鸟
2015-05-13 20:39:42     打赏
4楼
电路连接

专家
2015-05-14 10:39:45     打赏
5楼
5v电压,把上拉电阻换成10k的试试。 还有sda接受是1.是示波器抓到的波形吗?

菜鸟
2017-05-02 13:13:02     打赏
6楼
能请问您最后是怎么解决的嘛,我也是网上搜的程序,改完端口后一直显示38.19,不知道怎么解决了

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]