打印

用msp430fr4133控制hmc5883l

[复制链接]
1938|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Erichk|  楼主 | 2017-9-18 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神帮助,我用msp430fr4133控制hmc5883l,但是无法成功显示读数。
读数一直是角度转换方程部分的整数。请问这是什么原因导致的。
除此之外,在使用msp430的时候需要对主机寄存器设置才能使用I2C传输功能吗?还是对主机寄存器设置只是在硬件I2C的时候才做的。
本人新手,麻烦大神们说的详细点。
下面是代码
#include <msp430.h>
#include <driverlib.h>
#include "hal_LCD.h"
#include <stdlib.h>
#include <math.h>


typedef unsigned char uchar;
typedef unsigned int uint;

#define HMC5883L_DIR P8DIR
#define HMC5883L_IN  P2IN
#define HMC5883L_OUT P2OUT
#define SCL BIT2  //define cloclk pin
#define SDA BIT3  //define data pin

#define SCL_H (HMC5883L_DIR|=SCL,HMC5883L_OUT|=SCL)
#define SCL_L (HMC5883L_DIR|=SCL,HMC5883L_OUT&=~SCL)
#define SDA_H (HMC5883L_DIR|=SDA,HMC5883L_OUT|=SDA)
#define SDA_L (HMC5883L_DIR|=SDA,HMC5883L_OUT&=~SDA)
#define SDA_in P8DIR&=~BIT3


#define SlaveAddress 0x3C //define SlaveAddress
uchar Rec_Data[6];
unsigned short int x,y,z;
double Angle;
uint Acr;
unsigned int A=1;
int delay=1;

unsigned char number=0;
unsigned char a,b,c,d,e;
unsigned int headingN=305;





/*delay function*/
void Delay(uint t)
{
  while(t--);
}

/*start signal*/
void IIC_Start(void)
{
  SDA_H;
  SCL_H;
  Delay(50);
  SDA_L;
  Delay(50);
  SCL_L;
}

/*stop signal*/
void IIC_Stop(void)
{
  SDA_L;
  SCL_H;
  Delay(50);
  SDA_H;
  Delay(50);
}

/*send response signal*/
void IIC_SendAck(char Ack)
{
  if(Ack)   //ack (0:ACK 1:NO ACK)
  SDA_H;
  else SDA_L;
  SCL_H;
  Delay(50);
  SCL_L;
  Delay(50);
}

/*recive reponse signal*/
char IIC_RecAck(void)
{

  char CY;
  HMC5883L_DIR&=~SDA;
  SCL_H;
  Delay(50);
  if(HMC5883L_DIR&SDA)
    CY=1;
  else CY=0;
  SCL_L;
  Delay(50);
  return CY;

}

/*send one byte data from IIC*/
uchar HMC5883_Send_Byte(uchar Dat)
{

  uchar i;
  for(i=0;i<8;i++)
  {
    if(Dat&BIT7)
      SDA_H;
    else SDA_L;
      SCL_H;
    Delay(50);
    SCL_L;
    Delay(50);
    Dat<<=1;
  }
  IIC_RecAck();
  return Dat;
}

/*recive one byte data from IIC*/
  uchar HMC5883_Rec_Byte(void)
  {
    uchar i,Dat=0;
    SDA_H;
    HMC5883L_DIR&=~SDA;
    for(i=0;i<8;i++)
    {
      Dat<<=1;
      SCL_H;
      Delay(50);

      if((HMC5883L_IN&SDA)==SDA)
      Dat|=BIT0;

      SCL_L;
      Delay(50);
    }
    return Dat;
  }

  /*single byte write HMC5883L*/

void Single_Write_HMC5883(uchar Address,uchar Dat)
{
   IIC_Start();
   HMC5883_Send_Byte(SlaveAddress);
   HMC5883_Send_Byte(Address);
   HMC5883_Send_Byte(Dat);
   IIC_Stop();
}


/*single byte read HMC5883*/
uchar Single_Read_HMC5883(uchar Addr)
{
   uchar Value;
   IIC_Start();
   HMC5883_Send_Byte(SlaveAddress);
   HMC5883_Send_Byte(Addr);
   IIC_Start();
   HMC5883_Send_Byte(SlaveAddress+1);
   Value=HMC5883_Rec_Byte();
   IIC_SendAck(1);
   IIC_Stop();
   return Value;
}

/*multiple byte read HMC5883*/
void Multiple_Read_HMC5883(void)
{
   uchar i;// read data of angle in HMC5883,address from 0x3 to 0x5
   IIC_Start();
   HMC5883_Send_Byte(SlaveAddress);
   HMC5883_Send_Byte(0x03);// send address of svae unit , from 0x03
   IIC_Start();
   HMC5883_Send_Byte(SlaveAddress+1);
   for(i=0;i<6;i++)// read data from six registers, and save them in Rec_Data
   {
     Rec_Data[i]=HMC5883_Rec_Byte();
     if(i==5)
       IIC_SendAck(1);// final data return to NOACK
     else
       IIC_SendAck(0);//
   }
   IIC_Stop();
   Delay(100);
}

//initialize HMC5883
void HMC5883_Init(void)
{
  Single_Write_HMC5883(0x00,0x60);
  Single_Write_HMC5883(0x02,0x00);
  //HMC5883_Send_Byte(0x00);
}

/* get angle*/
/* o degree to the south*/
void get_angle()
{
  Multiple_Read_HMC5883();//read data,save in Rec_Data[]
  x=Rec_Data[0]<<8 | Rec_Data[1];//Combine MSB and LSB of X Data output register
  z=Rec_Data[4]<<8 | Rec_Data[5];//Combine MSB and LSB of Z Data output register
  y=Rec_Data[2]<<8 | Rec_Data[3];//Combine MSB and LSB of Y Data output register

  Angle=atan2((double)y,(double)x)*(180/3.141592654)+180;//unit:degree(0~360)
  Acr=(uint)Angle;
  //Angle*=10;
  Delay(50000);
}



int main(void)
{
   //Default MCLK = 1MHz

  WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
   PMM_unlockLPM5();


   // Disable the GPIO power-on default high-impedance mode
   // to activate previously configured port settings



     Init_LCD();
     displayScrollText("ELECTRONIC COMPASS");



     HMC5883_Init();//HMC5883 initialize

       get_angle();//unit:degree(0~360)


a=Acr/100;
b=Acr/10%10;
c=Acr%10;
//d=Angle/1000%10;
//e=Angle/10000%10;
showChar('N', pos1);
showChar(a+48,pos2);
showChar(b+48,pos3);
showChar(c+48,pos4);
//showChar(d+48,pos5);
//showChar(e+48,pos6);


while(1) ;
{

}
}

相关帖子

沙发
迪卡| | 2017-9-18 20:44 | 只看该作者
看你的代码就是使用的软件模拟的方式,和硬件就没什么太大关系。

使用特权

评论回复
板凳
dirtwillfly| | 2017-9-18 20:55 | 只看该作者
用逻辑分*析仪或者示波器观察一下时序,看看是否能满足hmc5883l的要求

使用特权

评论回复
地板
冰河w| | 2017-9-18 20:56 | 只看该作者
建立你试着调试一下,一步一步执行看看是哪里出错了,好好看看对应hmc5883的数据手册

使用特权

评论回复
5
minzisc| | 2017-9-18 21:04 | 只看该作者
读取的数据有什么不同吗?

使用特权

评论回复
6
febgxu| | 2017-9-18 21:05 | 只看该作者
应该是硬件驱动能力不足。

使用特权

评论回复
7
sanfuzi| | 2017-9-18 21:08 | 只看该作者
iic地址正确吗?

使用特权

评论回复
8
gygp| | 2017-9-18 21:09 | 只看该作者
焊接的时候,温度不能太高。

使用特权

评论回复
9
wangdezhi| | 2017-9-18 21:10 | 只看该作者
没有看明白是哪里有问题的

使用特权

评论回复
10
51xlf| | 2017-9-18 21:10 | 只看该作者
数据有什么问题?

使用特权

评论回复
11
10299823| | 2017-9-18 21:11 | 只看该作者
是不是没有使用上拉电阻?

使用特权

评论回复
12
uptown| | 2017-9-18 21:11 | 只看该作者
不能读取数据?

使用特权

评论回复
13
plsbackup| | 2017-9-18 21:11 | 只看该作者
hmc5883l地址是什么?

使用特权

评论回复
14
dzfansman| | 2017-9-18 21:12 | 只看该作者
http://www.pudn.com/downloads502/sourcecode/embedded/detail2090531.html

使用特权

评论回复
15
minzisc| | 2017-9-18 21:13 | 只看该作者
这个是不是地址识别不正确?

使用特权

评论回复
16
febgxu| | 2017-9-18 21:13 | 只看该作者
可以添加几个上拉电阻试试。

使用特权

评论回复
17
sanfuzi| | 2017-9-18 21:13 | 只看该作者
硬件电路有问题吗?

使用特权

评论回复
18
gygp| | 2017-9-18 21:13 | 只看该作者
是不是硬件电路有问题?

使用特权

评论回复
19
wangdezhi| | 2017-9-18 21:13 | 只看该作者
楼主看看你的硬件电路是不是有问题?

使用特权

评论回复
20
10299823| | 2017-9-18 21:13 | 只看该作者
iic的驱动能力不足,建议使用10k电阻。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

500

帖子

0

粉丝