6414|20

34

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

HMC5883l 一直输出ff该怎么办,急求!!! [复制链接]

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

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

此帖出自51单片机论坛

最新回复

您好 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]中的数据??能不能帮忙解答一下。谢谢啦   详情 回复 发表于 2020-3-25 18:44
点赞 关注(1)
 

回复
举报

34

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

#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);
       
       
}















此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
此帖出自51单片机论坛
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

4
 
问题估计在这个位置:

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

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

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

这个要注意!
此帖出自51单片机论坛
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

5
 
本帖最后由 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();
此帖出自51单片机论坛
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

6
 
另外就是把你的I2C部分原理图发一下,看看是否正确。调通讯部分,最好先确认硬件部分是正确的,否则出一堆稀奇古怪的问题。有逻辑分析仪的话,可以看看通讯线上的数据、时序是否是你想要的。
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

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

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

GY-271-SCH.jpg (113.86 KB, 下载次数: 0)

GY-271-SCH.jpg

TIM截图20180319090611.png (121.35 KB, 下载次数: 0)

TIM截图20180319090611.png
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

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

示波器的图

77284A525F101D21DC988608E7FD8A17.jpg (350.01 KB, 下载次数: 0)

77284A525F101D21DC988608E7FD8A17.jpg
此帖出自51单片机论坛

点评

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

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

9
 

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

从你描述看,不同的I2C口接了两个I2C器件?
此帖出自51单片机论坛

点评

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

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

10
 
5楼说的问题有没有试一下?hmc5883_stop();
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

11
 
yang_alex 发表于 2018-3-19 12:28
5楼说的问题有没有试一下?hmc5883_stop();

试了也没用呢,stc12c5a32s2有两个串口,一组串口用来接电脑,一组用来模拟12c与hmc5883l通信。
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

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

...

完整波形图

P80319-135549.jpg (2.49 MB, 下载次数: 0)

P80319-135549.jpg

P80319-135636.jpg (2.47 MB, 下载次数: 0)

P80319-135636.jpg

P80319-135707.jpg (3.16 MB, 下载次数: 0)

P80319-135707.jpg
此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
楼主解决了吗?我也遇到同样问题
此帖出自51单片机论坛

点评

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

回复

6

帖子

0

TA的资源

一粒金砂(初级)

14
 
楼主解决了吗?
此帖出自51单片机论坛

点评

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

回复

34

帖子

0

TA的资源

一粒金砂(中级)

15
 
地平线上的太阳 发表于 2018-7-18 10:28
楼主解决了吗?我也遇到同样问题

硬件问题,换了个就好了
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

16
 

硬件问题
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 

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

此帖出自51单片机论坛
 
 
 

回复

869

帖子

0

TA的资源

禁止发言

18
 
淡定,淡定,淡定……
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

19
 
楼主可以给个文件过来吗
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

20
 

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

        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]中的数据??

此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表