社区导航

 

搜索
查看: 2511|回复: 20

[求助] HMC5883l 一直输出ff该怎么办,急求!!!

[复制链接]

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-3-16 19:34 | 显示全部楼层 |阅读模式
#include "hmc5883.h"
#include "uart.h"
#include "stc.h"

sbit
心累,无论怎么调都是ff
求大佬们帮帮忙

此帖出自51单片机论坛

回复

使用道具 举报

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-3-16 19:35 | 显示全部楼层

#define        SlaveAddress   0x3C                                                  //定义器件在i2c中的地址

#include "hmc5883.h"
#include "uart.h"
#include "stc.h"

sbit        SCL=P1^2;                                                                              //IICê±ÖóÏß
sbit        SDA=P1^3;                                                                                     //IICêy¾YÏß


unsigned char ge,shi,bai,qian,wan;               
unsigned char BUF[8];

void Conversion(unsigned int temp_data)  
{  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   
          qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;   
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      
    ge=temp_data+0x30;        
}

void delay5us()
{
    unsigned char i;

    _nop_();
    _nop_();
    _nop_();
    i = 24;
    while (--i);
}


/*****************Æeê¼DÅoÅ**************/
void hmc5883_start()
{
        SDA = 1;
        SCL = 1;
        delay5us();
        SDA = 0;
        delay5us();
        SCL = 0;
}

/*******************í£Ö1DÅoÅ**************/
void hmc5883_stop()
{
        SDA = 0;
        SCL = 1;
        delay5us();
        SDA = 1;
        delay5us();
}

/********************·¢Ëíó|′eDÅoÅ***********/
void hmc5883_sendack(bit ack)
{
        SDA = ack;
        SCL = 1;
        delay5us();
        SCL = 0;
        delay5us();
}

/*********************½óêüó|′eDÅoÅ**********/
bit hmc5883_recvack()
{
        SCL = 1;
        delay5us();
        CY = SDA;
        SCL = 0;
        delay5us();
       
        return CY;
       
}

/**********************·¢Ëíò»¸ö×Ö½úêy¾Y*******/
void hmc5883_sendbyte(unsigned char dat)
{
        unsigned char i;
       
        for(i=0; i<8; i++)
        {
                dat <<= 1;
                SDA = CY;
                SCL = 1;
                delay5us();
                SCL = 0;
                delay5us();
        }
        hmc5883_recvack();
}

/*************************½óêüò»¸ö×Ö½úêy¾Y*********/
unsigned char hmc5883_recvbyte()
{
        unsigned char i;
        unsigned char dat = 0;
       
        SDA = 1;
        for(i=0; i<8; i++)
        {
                dat <<= 1;
                SCL = 1;
                delay5us();
                dat |= SDA;
                SCL = 0;
                delay5us();
        }
        return dat;
}

/*************************D′èëμ¥×Ö½úêy¾Y***********/
void single_write_hmc5883(unsigned char reg_address, unsigned char reg_data)
{
        hmc5883_start();
        hmc5883_sendbyte(SlaveAddress);
        hmc5883_sendbyte(reg_address);
        hmc5883_sendbyte(reg_data);
        hmc5883_stop();
}

/**************************á¬Dø¶áè¡Äú2¿¼Ä′æÆ÷******/
void multiple_read_hmc5883(void)
{
        unsigned char i;
       
        hmc5883_start();
        hmc5883_sendbyte(SlaveAddress);
        hmc5883_sendbyte(0x03);
        hmc5883_start();
        hmc5883_sendbyte(SlaveAddress+1);
        for (i=0; i<6; i++)                  
  {
                BUF[i] = hmc5883_recvbyte();         
    if (i == 5)
    {
                        hmc5883_sendack(1);              
                }
    else
    {
      hmc5883_sendack(0);              
    }
   }
    hmc5883_stop();                        
    delay5us();
         SendString1(BUF);
}

void init_hmc5883()
{
       
        single_write_hmc5883(0x02, 0x01);
       
       
}

/********************êy¾Y′|àí**********************/
void send_hmc5883()
{
        static int X,Y,Z;
        static double Angle_XY=0,Angle_XZ=0,Angle_YZ=0;
        static unsigned char str[20];
       
       
        multiple_read_hmc5883();      


        X=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register  ?????
        Z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register
        Y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

        if(X>0x7fff)X-=0xffff;          
        if(Y>0x7fff)Y-=0xffff;
        if(Z>0x7fff)Z-=0xffff;
       


        Angle_XY= atan2((double)Y,(double)X) * (180 / 3.14159265) + 180;
        Angle_XY*=10;
        Conversion(Angle_XY);  
       
        sprintf(str, "XY:%c%c%c.%c\r\n", qian, bai, shi, ge);
        SendString1(str);


        Angle_XZ= atan2((double)Z,(double)X) * (180 / 3.14159265) + 180;
        Angle_XZ*=10;
        Conversion(Angle_XZ);      

sprintf(str, "XZ: %c%c%c.%c\r\n", qian, bai, shi, ge);
        SendString1(str);
       
        Angle_YZ= atan2((double)Z,(double)Y) * (180 / 3.14159265) + 180;
        Angle_YZ*=10;
        Conversion(Angle_YZ);      

sprintf(str, "YZ: %c%c%c.%c\r\n", qian, bai, shi, ge);
        SendString1(str);
       
       
}
















回复

使用道具 举报

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-3-16 20:10 | 显示全部楼层

回复

使用道具 举报

1173

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-3-17 11:23 | 显示全部楼层
问题估计在这个位置:

#define        SlaveAddress   0x3C                                                  //定义器件在i2c中的地址

HMC5883l的I2C发送接收地址是不一样的!

发送地址是0x3C、接收地址是0x3D   

这个要注意!

回复

使用道具 举报

1173

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-3-17 11:48 | 显示全部楼层
本帖最后由 yang_alex 于 2018-3-17 11:50 编辑


  1. /**************************á¬Dø¶áè¡Äú2¿¼Ä′æÆ÷******/
  2. void multiple_read_hmc5883(void)
  3. {
  4.         unsigned char i;
  5.         
  6.         hmc5883_start();
  7.         hmc5883_sendbyte(SlaveAddress);
  8.         hmc5883_sendbyte(0x03);
  9.         hmc5883_start();
  10.         hmc5883_sendbyte(SlaveAddress+1);
  11.         for (i=0; i<6; i++)                  
  12.   {
  13.                 BUF[i] = hmc5883_recvbyte();         
  14.     if (i == 5)
  15.     {
  16.                         hmc5883_sendack(1);              
  17.                 }
  18.     else
  19.     {
  20.       hmc5883_sendack(0);              
  21.     }
  22.    }
  23.     hmc5883_stop();                        
  24.     delay5us();
  25.          SendString1(BUF);
  26. }
复制代码


上面代码中        hmc5883_sendbyte(0x03);
        hmc5883_start();
之间是否少个        hmc5883_stop();

回复

使用道具 举报

1173

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-3-17 11:53 | 显示全部楼层
另外就是把你的I2C部分原理图发一下,看看是否正确。调通讯部分,最好先确认硬件部分是正确的,否则出一堆稀奇古怪的问题。有逻辑分析仪的话,可以看看通讯线上的数据、时序是否是你想要的。

回复

使用道具 举报

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-3-19 09:08 | 显示全部楼层
yang_alex 发表于 2018-3-17 11:53
另外就是把你的I2C部分原理图发一下,看看是否正确。调通讯部分,最好先确认硬件部分是正确的,否则出一堆 ...

地址的话0x3c、0x3d、0x1e都试过了,任然输出ff,逻辑分析仪没有 我有波形图可以么接线的话p1.3接的sda、p1.2接的scl
GY-271-SCH.jpg
TIM截图20180319090611.png

回复

使用道具 举报

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-3-19 09:12 | 显示全部楼层
yang_alex 发表于 2018-3-17 11:53
另外就是把你的I2C部分原理图发一下,看看是否正确。调通讯部分,最好先确认硬件部分是正确的,否则出一堆 ...

示波器的图
77284A525F101D21DC988608E7FD8A17.jpg

点评

用示波器也可以看,只是你要对应到I2C读指令。另外,时间长一点,现在你的波形都看不完整一帧数据。 从你描述看,不同的I2C口接了两个I2C器件?  详情 回复 发表于 2018-3-19 12:26

回复

使用道具 举报

1173

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-3-19 12:26 | 显示全部楼层

用示波器也可以看,只是你要对应到I2C读指令。另外,时间长一点,现在你的波形都看不完整一帧数据。

从你描述看,不同的I2C口接了两个I2C器件?

点评

完整波形图  详情 回复 发表于 2018-3-19 13:59

回复

使用道具 举报

1173

TA的帖子

0

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-3-19 12:28 | 显示全部楼层
5楼说的问题有没有试一下?hmc5883_stop();

回复

使用道具 举报

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-3-19 13:53 | 显示全部楼层
yang_alex 发表于 2018-3-19 12:28
5楼说的问题有没有试一下?hmc5883_stop();

试了也没用呢,stc12c5a32s2有两个串口,一组串口用来接电脑,一组用来模拟12c与hmc5883l通信。

回复

使用道具 举报

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-3-19 13:59 | 显示全部楼层
yang_alex 发表于 2018-3-19 12:26
用示波器也可以看,只是你要对应到I2C读指令。另外,时间长一点,现在你的波形都看不完整一帧数据。

...

完整波形图
P80319-135549.jpg
P80319-135636.jpg
P80319-135707.jpg

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-7-18 10:28 | 显示全部楼层
楼主解决了吗?我也遇到同样问题

点评

硬件问题,换了个就好了  详情 回复 发表于 2018-8-20 14:54

回复

使用道具 举报

6

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-8-6 20:13 | 显示全部楼层
楼主解决了吗?

点评

硬件问题  详情 回复 发表于 2018-8-20 14:54

回复

使用道具 举报

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-8-20 14:54 | 显示全部楼层
地平线上的太阳 发表于 2018-7-18 10:28
楼主解决了吗?我也遇到同样问题

硬件问题,换了个就好了

回复

使用道具 举报

38

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-8-20 14:54 | 显示全部楼层

硬件问题

回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-1-9 16:43 | 显示全部楼层

我遇到了同样的问题,把模块把了还是只能读取FF,读模块寄存器哪个地址都是FF,您能发一下您的程序给我吗?万分感谢,我给您我的1474736005,邮箱1474736005@qq.com


回复

使用道具 举报

885

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-1-9 20:46 | 显示全部楼层
淡定,淡定,淡定……

回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-7-15 15:27 | 显示全部楼层
楼主可以给个文件过来吗

回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-3-25 18:41 | 显示全部楼层

求,可否解释一下读取传感器数据时,

        X=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register  ?????
        Z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register
        Y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

是什么意思。左移8位再按位或不就相当于BUF[1]自己吗?还有就是为什么只要BUF[1]而不要BUF[0]中的数据??


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-3-29 22:34 , Processed in 0.538453 second(s), 19 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表