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=10mGuint8_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 readytypedef 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 stm32 hal库 spi 磁力计数据相关推荐
- STM32 HAL库串口收发数据
STM32 HAL库串口收发数据 许多传感器的使用方法是:单片机给传感器发送一帧数据,然后传感器返回单片机一帧有用数据,所以串口的收发功能十分重要. STM32cubeMX的配置 时钟和下载方式就不讲 ...
- 晶联讯JLX12864G-290液晶,STM32+HAL库 SPI显示成功。
JLX12864G_290_PN.h #ifndef __JLX12864G_290_PN_H__ #define __JLX12864G_290_PN_H__ /* 包含头文件 ---------- ...
- STM32 HAL库 STM32CubeMX -- SPI
文章目录 一.SPI 协议简介 SPI 物理层 SPI 协议层 二.SPI 的架构 三.通讯过程 四.STM32Cube MX配置 五.SPI HAL库函数 一.SPI 协议简介 SPI (Seria ...
- STM32 HAL库 串口DMA接收不定长数据
STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据:串口2我找了一个UBLOX卫 ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- STM32 HAL库学习笔记4-SPI
STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...
- stm32+HAL库制作转速仪
stm32+HAL库制作转速仪 前言 电机在运行过程中,需要实时检测其转速的稳定性,有效反映电机的运行情况. 本文介绍了基于stm32的转速仪的设计,可以用光电门传感器和红外对管传感器测量,可以设置选 ...
- STM32 HAL 驱动SPI总线2.13寸电子纸墨水屏
STM32 HAL 驱动SPI总线2.13寸电子纸墨水屏 电子纸墨水屏具有断电界面不失和低反光度的护眼效果.QYEG0213RWS800是2.13寸黑白红三色墨水屏,分辨率为250*122. STM3 ...
- STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题
一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...
- 温湿度传感器驱动SHT85 单片机STM32 HAL库
功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...
最新文章
- Load balancer does not have available server for client
- 机器视觉+常识+概念
- dataframe常用处理
- 挑战程序设计竞赛_实力爆棚!2019年,华中科技大学拿下亚洲区竞赛金牌4枚!...
- OpenStack Nova计算服务管理(四)
- ICWAI和ICWA的完整形式是什么?
- 为什么6lowpan 要有四个地址_大型监控网络系统如何规划ip地址
- 为什么要重构,何时进行重构
- linux基础-文本编辑器,Linux基础之vim文本编辑器
- 老李分享: 全栈工程师? 2
- 算法:移除最外层的括号1021. Remove Outermost Parentheses
- 自动控制原理第七版胡寿松pdf_自动控制原理简明笔记—(04)
- 随机存取存储器与只读存储器
- 概率论中PDF、PMF和CDF的区别与联系
- python用函数绘制椭圆_Python学习笔记——opencv绘制椭圆
- 【思前享后】区块链的起源
- 如何快速修改文件的修改时间?
- MATLAB虫害检测农业应用设计
- 【腾讯开放平台】Android、IOS实现指定QQ临时会话功能
- matlab模拟土壤水分入渗,基于HYDRUS-3D的涌泉根灌土壤入渗数值模拟