瑞萨单片机 (R5F100LE) I2C IIC 电子指南针模块 HMC5883L

    电子指南针模块在智能车和飞行器上是很常用的模块,这篇文章就介绍一下瑞萨单片机如何使用HMC5883L,HMC5883L使用I2C进行操作的。

下图教你如何配置(R5F100LE)的I2C。当然不要忘记关闭看门狗。

211104_PafO_2255341.jpg

211105_xWAO_2255341.png

211106_0Ngy_2255341.jpg

下面是关键结构体和函数,HSD这个结构体用来保存由HMC5883L读取的X,Y,Z轴的六个数据。


typedef struct HMC5583LData
{
	uint8_t XMSB;
	uint8_t XLSB;
	uint8_t YMSB;
	uint8_t YLSB;
	uint8_t ZMSB;
	uint8_t ZLSB;
}HSD;

void delayLittle(uint16_t);
uint8_t readRegisterValue(uint8_t registerNum);//读HMC5883L寄存器的数据
void writeRegister(uint8_t registerNum, uint8_t registerValue);//写HMC5883L寄存器的数据
void initMMC5883L(void);//初始化HMC5883L
HSD readXYZ(void);//读出HMC5883L寄存器的数据返回HSD结构体

下面是代码:

//main.c
#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_port.h"
#include "r_cg_serial.h"
#include "r_cg_timer.h"
/* Start user code for include. Do not edit comment generated here */
#include <math.h>
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
#define SALVE_ADDR 0x3c
typedef struct HMC5583LData
{
	uint8_t XMSB;
	uint8_t XLSB;
	uint8_t YMSB;
	uint8_t YLSB;
	uint8_t ZMSB;
	uint8_t ZLSB;
}HSD;
uint8_t Data[6]={0};
extern uint32_t GlobalTime;
void delayLittle(uint16_t);
uint8_t readRegisterValue(uint8_t registerNum);
void writeRegister(uint8_t registerNum, uint8_t registerValue);
void initMMC5883L(void);
HSD readXYZ(void);

/* End user code. Do not edit comment generated here */
void R_MAIN_UserInit(void);

/***********************************************************************************************************************
* Function Name: main
* Description  : This function implements main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void main(void)
{
    /* Start user code. Do not edit comment generated here */
	uint32_t nowTime=0, lastTime=0;
	uint8_t regNum = 0x0a, regVal = 0xf0;
	HSD myStruct;
	
	R_MAIN_UserInit();
	R_TAU0_Channel0_Start();
	initMMC5883L();
    while (1U)
    {
        nowTime=GlobalTime;
		
		if((nowTime-lastTime)>500)
		{
			lastTime = GlobalTime;
			P13.0 = ~P13.0;
		}
		
		myStruct = readXYZ();
		delayLittle(5);		
    }
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: R_MAIN_UserInit
* Description  : This function adds user code before implementing main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    EI();
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
void delayLittle(uint16_t Tim)
{
	uint16_t delayNum=2000;
	while(--Tim)
		while(--delayNum)
			NOP();
}

uint8_t readRegisterValue(uint8_t registerNum)
{
	uint16_t cnt=0;
	uint8_t registerValue=0;
	
	R_IIC00_Master_Send(SALVE_ADDR, &registerNum, 1);
	delayLittle(2);
	R_IIC00_Master_Receive(SALVE_ADDR+1, &registerValue, 1);
	delayLittle(2);
	return registerValue; 	
}

void writeRegister(uint8_t registerNum, uint8_t registerValue)
{
	uint8_t val[2]={0};
	uint16_t cnt=0;
	val[0]=registerNum;
	val[1]=registerValue;
	
	R_IIC00_Master_Send(SALVE_ADDR, val, 2);
	delayLittle(2);
}
void initMMC5883L()
{
	writeRegister(0x02, 0x00);
}

HSD readXYZ()
{
	uint8_t registerNum = 0x03;
	HSD Data; uint8_t ch[6] = {0};
	R_IIC00_Master_Send(SALVE_ADDR, &registerNum, 1);
	delayLittle(2);
	R_IIC00_Master_Receive(SALVE_ADDR+1, ch, 6);
	delayLittle(2);
	
	Data.XMSB = ch[0]; 
	Data.XLSB = ch[1];
	Data.YMSB = ch[2];
	Data.YLSB = ch[3];
	Data.ZMSB = ch[4];
	Data.ZLSB = ch[5];
	return Data;
}

/* End user code. Do not edit comment generated here */


瑞萨单片机使用HMC5883L CubeSuite + 工程链接。


转载于:https://my.oschina.net/u/2255341/blog/477624

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值