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 磁力计数据相关推荐

  1. STM32 HAL库串口收发数据

    STM32 HAL库串口收发数据 许多传感器的使用方法是:单片机给传感器发送一帧数据,然后传感器返回单片机一帧有用数据,所以串口的收发功能十分重要. STM32cubeMX的配置 时钟和下载方式就不讲 ...

  2. 晶联讯JLX12864G-290液晶,STM32+HAL库 SPI显示成功。

    JLX12864G_290_PN.h #ifndef __JLX12864G_290_PN_H__ #define __JLX12864G_290_PN_H__ /* 包含头文件 ---------- ...

  3. STM32 HAL库 STM32CubeMX -- SPI

    文章目录 一.SPI 协议简介 SPI 物理层 SPI 协议层 二.SPI 的架构 三.通讯过程 四.STM32Cube MX配置 五.SPI HAL库函数 一.SPI 协议简介 SPI (Seria ...

  4. STM32 HAL库 串口DMA接收不定长数据

    STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据:串口2我找了一个UBLOX卫 ...

  5. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  6. STM32 HAL库学习笔记4-SPI

    STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...

  7. stm32+HAL库制作转速仪

    stm32+HAL库制作转速仪 前言 电机在运行过程中,需要实时检测其转速的稳定性,有效反映电机的运行情况. 本文介绍了基于stm32的转速仪的设计,可以用光电门传感器和红外对管传感器测量,可以设置选 ...

  8. STM32 HAL 驱动SPI总线2.13寸电子纸墨水屏

    STM32 HAL 驱动SPI总线2.13寸电子纸墨水屏 电子纸墨水屏具有断电界面不失和低反光度的护眼效果.QYEG0213RWS800是2.13寸黑白红三色墨水屏,分辨率为250*122. STM3 ...

  9. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  10. 温湿度传感器驱动SHT85 单片机STM32 HAL库

    功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...

最新文章

  1. Load balancer does not have available server for client
  2. 机器视觉+常识+概念
  3. dataframe常用处理
  4. 挑战程序设计竞赛_实力爆棚!2019年,华中科技大学拿下亚洲区竞赛金牌4枚!...
  5. OpenStack Nova计算服务管理(四)
  6. ICWAI和ICWA的完整形式是什么?
  7. 为什么6lowpan 要有四个地址_大型监控网络系统如何规划ip地址
  8. 为什么要重构,何时进行重构
  9. linux基础-文本编辑器,Linux基础之vim文本编辑器
  10. 老李分享: 全栈工程师? 2
  11. 算法:移除最外层的括号1021. Remove Outermost Parentheses
  12. 自动控制原理第七版胡寿松pdf_自动控制原理简明笔记—(04)
  13. 随机存取存储器与只读存储器
  14. 概率论中PDF、PMF和CDF的区别与联系
  15. python用函数绘制椭圆_Python学习笔记——opencv绘制椭圆
  16. 【思前享后】区块链的起源
  17. 如何快速修改文件的修改时间?
  18. MATLAB虫害检测农业应用设计
  19. 【腾讯开放平台】Android、IOS实现指定QQ临时会话功能
  20. matlab模拟土壤水分入渗,基于HYDRUS-3D的涌泉根灌土壤入渗数值模拟

热门文章

  1. FileUpload文件上传控件
  2. 留言列表模板HTML代码
  3. 企业网络工程设计——局域网中的冗余链路
  4. POS收单地区代码表(2015年3月版)
  5. 全球知名企业高管预测2019人工智能趋势
  6. 计算机辅助求解如何做,计算机辅助求解一元高次方程.pdf
  7. 一条龙教程:Matlab下使用yalmip(工具箱)+cplex(求解器)
  8. JAVA实现电路布线问题
  9. 连锁门店数字化营销,打造千城万店新零售体系
  10. coreos 安装 mysql_手把手教你在 CoreOS 上构建你的第一个应用