论坛» 嵌入式开发» MCU

MLX90614的SMbus协议通信

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

菜鸟
2015-05-13 20:39 4楼
电路连接
专家
2015-05-14 10:39 5楼
5v电压,把上拉电阻换成10k的试试。 还有sda接受是1.是示波器抓到的波形吗?
菜鸟
2017-05-02 13:13 6楼
能请问您最后是怎么解决的嘛,我也是网上搜的程序,改完端口后一直显示38.19,不知道怎么解决了
共6条 1/1 1 跳转至

回复

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