文档章节

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

kangxin1234
 kangxin1234
发布于 2015/07/12 21:21
字数 612
阅读 485
收藏 0

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

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

下面是关键结构体和函数,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 + 工程链接。


© 著作权归作者所有

kangxin1234

kangxin1234

粉丝 38
博文 51
码字总数 35417
作品 0
程序员
私信 提问
加载中

评论(1)

丨奇灬锦兮丶
丨奇灬锦兮丶
采不出来呀
MPU6050开发 -- 在 C52 单片机上测试

用了三篇文章,从 MPU6050的初识,相关基本概念,到 I2C/SPI通信协议都讲了一下。现在可以上手来测试了。 手头没有什么Arduino的开发板,只有两款,一个是郭天祥的STC89C52单片机,另一个S5P...

qq_29350001
2017/11/23
0
0
【目录】电子发烧友, 持续更新

目录内容: 1)Geek 2)C51单片机学习平台搭建 3)入门 4)提高 5)红外发射 6)树莓派 7)物联网 8)模电基础 【Geek】 C51单片机 SIM900A 手机给门禁解锁 智能家居 【C程序代码已开源,更新...

990487026
2015/09/26
0
0
IIC详解,包括原理、过程,最后一步步教你实现IIC

转自:http://blog.csdn.net/shaguahaha/article/details/70766665 IIC详解 1、I2C总线具有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL 2、IIC总线上可以挂很多设备:多个主设备,多...

scliu12345
2018/03/17
0
0
Arduino 与指南针传感器HMC5883L

首先Arduino默认的I2C地址是7位地址,手册上说明有,7位地址为0X1E,读地址为0x3D = (7位地址<<1 +1),写地址为0X3C (7位地址 << 1) 如果要想与HMC5883L进行通信,则需要在HMC5883L上电5ms之...

quanwei9958
2015/07/13
1K
0
HMC5883L 在瑞萨数据读取

@kangxin1234 你好,想跟你请教个问题: HMC5883L的引脚要怎么连 DRDA不用连在接瑞萨上是吗? 还有怎么才能读取到数据?谢谢

xqs961023
2015/08/06
220
1

没有更多内容

加载失败,请刷新页面

加载更多

编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
21分钟前
4
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
36分钟前
63
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
今天
5
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
今天
8
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部