RM3100 stm32 hal库 spi 磁力计数据

SPI 配置

作为参数参考,其详细配置请自行在CUBEMX 中配置生成代码

void MX_SPI2_Init(void)
{

  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 7;
  hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }
  GPIO_InitStruct.Pin = CS1_ACCEL_Pin|CS1_GYRO_Pin|SPI2_NSS_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, CS1_ACCEL_Pin|CS1_GYRO_Pin|SPI2_NSS_Pin, GPIO_PIN_SET);
}

RM3100.C

#include "stdio.h"
#include "RM3100.h"
#include "spi.h"
#define RM3100_CS HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port,SPI2_NSS_Pin,GPIO_PIN_RESET);		
#define RM3100_DEL HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port,SPI2_NSS_Pin,GPIO_PIN_SET);

//1000000uT=10000G
//100uT=1G
//100uT=1000mG
//1uT=10mG
	  uint8_t ccx0;
    uint8_t ccx1;
    uint8_t ccy0;
    uint8_t ccy1;
    uint8_t ccz0;
    uint8_t ccz1;
void RM3100_init(void)
{
	//SPI 首先调用一下开启通讯
	spi_read_onebyte(RM3100_CCX0_REG,&ccx0);
	//正式读写
	spi_read_onebyte(RM3100_CCX0_REG,&ccx0);
	spi_read_onebyte(RM3100_CCX1_REG,&ccx1);
	spi_read_onebyte(RM3100_CCY0_REG,&ccy0);
	spi_read_onebyte(RM3100_CCY1_REG,&ccy1);
	spi_read_onebyte(RM3100_CCZ0_REG,&ccz0);
	spi_read_onebyte(RM3100_CCZ1_REG,&ccz1);
	if((ccx0!=CCP0_DEFAULT)||(ccx1!=CCP1_DEFAULT)|| (ccy0!=CCP0_DEFAULT)||(ccy1!=CCP1_DEFAULT)||(ccz0!=CCP0_DEFAULT)||(ccz1!=CCP1_DEFAULT))
	{
	}
	else
	{
	spi_write_onebyte(RM3100_TMRC_REG,TMRC);
	spi_write_onebyte(RM3100_CMM_REG,CMM);
	spi_write_onebyte(RM3100_CCX1_REG,CCP1);
	spi_write_onebyte(RM3100_CCX0_REG,CCP0);
	spi_write_onebyte(RM3100_CCY1_REG,CCP1);
	spi_write_onebyte(RM3100_CCY0_REG,CCP0);
	spi_write_onebyte(RM3100_CCZ1_REG,CCP1);
	spi_write_onebyte(RM3100_CCZ0_REG,CCP0);
	}
}

//  _scaler = (1 / GAIN_CC200) * UTESLA_TO_MGAUSS; /   (1/75)*10=1/75
void spi_read_bytes(uint8_t reg,uint8_t len,uint8_t read_data[])
{
	uint8_t temp;
	RM3100_CS;
	
	SPI1_ReadWriteByte(reg | 0x80);
	for(temp=0;temp<len;temp++)
	{
		read_data[temp] = SPI1_ReadWriteByte(0xff);
	}
	RM3100_DEL;
}

void spi_read_onebyte(uint8_t reg,uint8_t *data)
{
	RM3100_CS;
	SPI1_ReadWriteByte(reg | 0x80);
	*data = SPI1_ReadWriteByte(0xff);
	RM3100_DEL;
}

void spi_write_onebyte(uint8_t reg,uint8_t data)
{
	RM3100_CS;
	SPI1_ReadWriteByte(reg);
	SPI1_ReadWriteByte(data);
	RM3100_DEL;
}

void spi_write_bytes(uint8_t reg,uint8_t len,uint8_t write_data[])
{
	uint8_t temp;
	RM3100_CS;
	SPI1_ReadWriteByte(reg);
	for(temp=0;temp<len;temp++)
	{
			SPI1_ReadWriteByte(write_data[temp]);
	}
	RM3100_DEL;
}

bool RM3100_data_ok(void)
{
	uint8_t temp;
	spi_read_onebyte(RM3100_STATUS_REG,&temp);
	if(temp&0x80) return true;
  else return false;
}

uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{		
	uint8_t retry=0;				 		  
	HAL_SPI_TransmitReceive(&hspi2,&TxData,&retry,1,0xffff);
	return retry; //返回通过SPIx最近接收的数据					    
}

bool get_RM3100_data(int32_t* mx,int32_t* my,int32_t* mz)
{
	uint8_t temp_data[9];
	uint8_t status=0;
	int32_t mag_data[3];	
	while(!(status&0x80))
	spi_read_onebyte(RM3100_STATUS_REG,&status);
	if(!(status&0x80)) return false;//状态
	spi_read_bytes(RM3100_MX2_REG,9,temp_data);	
	mag_data[0]= (uint32_t)temp_data[0]<<24 | (uint32_t)temp_data[1]<<16 |  (uint32_t)temp_data[2]<<8;
	mag_data[1]= (uint32_t)temp_data[3]<<24 | (uint32_t)temp_data[4]<<16 |  (uint32_t)temp_data[5]<<8;
	mag_data[2]= (uint32_t)temp_data[6]<<24 | (uint32_t)temp_data[7]<<16 |  (uint32_t)temp_data[8]<<8;
	*mx=mag_data[0]>>8;
	*my=mag_data[1]>>8;
	*mz=mag_data[2]>>8;
	return true;
}

uint8_t get_RM3100_devid(void)
{
	uint8_t dev_id;
	spi_read_onebyte(RM3100_REVID_REG,&dev_id); 
	return dev_id;
}

RM3100.H

#ifndef __RM3100_H
#define __RM3100_H
#include <stdbool.h>
#include "main.h"
#define RM3100_POLL_REG        0x00

#define RM3100_CMM_REG         0x01

#define RM3100_CCX1_REG        0x04
#define RM3100_CCX0_REG        0x05
#define RM3100_CCY1_REG        0x06
#define RM3100_CCY0_REG        0x07
#define RM3100_CCZ1_REG        0x08
#define RM3100_CCZ0_REG        0x09

#define RM3100_TMRC_REG        0x0B

#define RM3100_MX2_REG      0x24
#define RM3100_MX1_REG      0x25
#define RM3100_MX0_REG      0x26
#define RM3100_MY2_REG      0x27
#define RM3100_MY1_REG      0x28
#define RM3100_MY0_REG      0x29
#define RM3100_MZ2_REG      0x2A
#define RM3100_MZ1_REG      0x2B
#define RM3100_MZ0_REG      0x2C

#define RM3100_BIST_REG       0x33
#define RM3100_STATUS_REG     0x34
#define RM3100_HSHAKE_REG     0x34
#define RM3100_REVID_REG      0x36

#define CCP0    0xC8      // Cycle Count values
#define CCP1    0x00
#define CCP0_DEFAULT 0xC8 // Default Cycle Count values (used as a whoami check)
#define CCP1_DEFAULT 0x00
#define GAIN_CC50 20.0f   // LSB/uT
#define GAIN_CC100 38.0f
#define GAIN_CC200 75.0f
#define UTESLA_TO_MGAUSS   10.0f // uT to mGauss conversion

#define TMRC    0x93    // Update rate 600Hz
#define CMM     0x71    // read 3 axes and set data ready if 3 axes are ready

typedef struct 
{
	//原始数据
	uint16_t raw_mag_x;
	uint16_t raw_mag_y;
	uint16_t raw_mag_z;
	//转换为地磁大小的值
	float mag_ut_x;
	float mag_ut_y;
	float mag_ut_z;
}RM3100_DATA;

void spi_read_bytes(uint8_t reg,uint8_t len,uint8_t read_data[]);
void spi_read_onebyte(uint8_t reg,uint8_t *data);
void spi_write_onebyte(uint8_t reg,uint8_t data);
void spi_write_bytes(uint8_t reg,uint8_t len,uint8_t write_data[]);
void RM3100_init(void);
bool get_RM3100_data(int32_t *mx,int32_t *my,int32_t *mz);
uint8_t get_RM3100_devid(void);
bool RM3100_data_ok(void);
uint8_t SPI1_ReadWriteByte(uint8_t TxData);
#endif

MAIN.C

	int32_t mx,my,mz;
	get_RM3100_data(&mx,&my,&mz);
RM3100是一种高精度、低功耗的磁传感器,常用于姿态检测、导航、机器人等领域。为了让RM3100能够正常工作,我们需要安装相应的驱动程序。 首先,我们可以从RM3100的官方网站或者供应商的网站上下载到最新版本的驱动程序。下载后,我们需要将驱动程序解压缩到计算机的特定文件夹中。 接下来,我们需要连接RM3100与计算机。如果我们使用的是I2C接口连接,我们需要将RM3100与计算机的I2C总线相连。如果使用SPI接口,我们则需将RM3100与计算机的SPI接口相连。此外,在连接之前,还需要确保供电电压与电流符合RM3100的要求。 一旦确保连接正确,我们可以打开计算机上的设备管理器,并找到RM3100磁传感器。如果驱动程序没有正确安装,设备管理器将显示黄色感叹号或问号。 在设备管理器中,我们可以选择更新驱动程序,选择手动安装驱动程序,并选择我们之前解压缩的驱动程序所在的文件夹。 一旦我们完成安装,设备管理器将显示磁传感器设备的名称,并且没有任何错误标志。 现在,我们可以在计算机上编写程序,使用RM3100磁传感器进行姿态检测、导航或机器人控制等应用。在编写代码时,我们需要调用相应的接口进行数据读取和处理。 总的来说,安装RM3100的驱动程序是使用该磁传感器进行正常工作的必要步骤。在正确安装驱动程序后,我们就可以利用RM3100进行各种应用领域的开发和研究。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值