电子指南针模块在智能车和飞行器上是很常用的模块,这篇文章就介绍一下瑞萨单片机如何使用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, ®isterNum, 1);
delayLittle(2);
R_IIC00_Master_Receive(SALVE_ADDR+1, ®isterValue, 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, ®isterNum, 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 + 工程链接。