IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> RM3100 stm32 hal库 spi 磁力计数据 -> 正文阅读

[嵌入式]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);
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:35:13  更:2021-08-11 12:37:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:18:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码