STM32通过SPI方式读取MT6816磁编码器绝对位置

CUBEMX基本配置:

调试方式:SW

在这里插入图片描述

系统时钟配置:

在这里插入图片描述

CS引脚配置:

在这里插入图片描述

SPI参数配置:

在这里插入图片描述

串口配置:

在这里插入图片描述

生成代码:在这里插入图片描述在这里插入图片描述

然后点右上角生成代码。

代码:

源文件:

#include "mt6816.h"
#include "stdio.h"

MT6816_SPI_Signal_Typedef	mt6816_spi;

void REIN_MT6816_SPI_Signal_Init(void)
{
	mt6816_spi.sample_data = 0;
	mt6816_spi.angle = 0;
}

void RINE_MT6816_SPI_Get_AngleData(void)
{
	uint16_t data_t[2];
	uint16_t data_r[2];
	uint8_t h_count;
	data_t[0] = (0x80 | 0x03) << 8;
	data_t[1] = (0x80 | 0x04) << 8;
	for(uint8_t i=0; i<3; i++){
		//读取SPI数据
		MT6816_SPI_CS_L();
		HAL_SPI_TransmitReceive(&MT6816_SPI_Get_HSPI, (uint8_t*)&data_t[0], (uint8_t*)&data_r[0], 1, HAL_MAX_DELAY);
		MT6816_SPI_CS_H();
		MT6816_SPI_CS_L();
		HAL_SPI_TransmitReceive(&MT6816_SPI_Get_HSPI, (uint8_t*)&data_t[1], (uint8_t*)&data_r[1], 1, HAL_MAX_DELAY);
		MT6816_SPI_CS_H();
		mt6816_spi.sample_data = ((data_r[0] & 0x00FF) << 8) | (data_r[1] & 0x00FF);
		//奇偶校验
		h_count = 0;
		for(uint8_t j=0; j<16; j++){
			if(mt6816_spi.sample_data & (0x0001 << j))
				h_count++;
		}
		if(h_count & 0x01){
			mt6816_spi.pc_flag = false;
		}
		else{
			mt6816_spi.pc_flag = true;
			break;
		}
	}
	if(mt6816_spi.pc_flag){
		mt6816_spi.angle = mt6816_spi.sample_data >> 2;
		mt6816_spi.no_mag_flag = (bool)(mt6816_spi.sample_data & (0x0001 << 1));
	}
}

MT6816_Typedef	mt6816;

float REIN_MT6816_Get_AngleData()
{
	RINE_MT6816_SPI_Get_AngleData();
	mt6816.angle_data = mt6816_spi.angle;

头文件:

#include <stdbool.h>	
#include <string.h>		
#include <stdlib.h>		
#include <stdio.h>		
#include <spi.h>		
#include <main.h>		

#define MT6816_SPI_CS_H()	     HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,1) 
#define MT6816_SPI_CS_L()		 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,0) 
#define MT6816_SPI_Get_HSPI		    (hspi1)
#define MT6816_Mode_SPI		        (0x03)	


typedef struct{
	uint16_t	sample_data;	
	uint16_t	angle;				
	bool		no_mag_flag;	
	bool		pc_flag;			
}MT6816_SPI_Signal_Typedef;

void REIN_MT6816_SPI_Signal_Init(void);		
void RINE_MT6816_SPI_Get_AngleData(void);	

typedef struct{
	uint16_t	angle_data;			
	uint16_t	rectify_angle;		
	bool			rectify_valid;		
}MT6816_Typedef;

extern MT6816_Typedef	mt6816;
					
float REIN_MT6816_Get_AngleData();

#endif

重定向printf,添加到main.c即可

#include "mt6816.h"
#include "stdio.h"
int fputc(int ch, FILE *File)
{
    while((USART1->SR & 0X40) == 0);
    USART1->DR = (uint8_t)ch;
    return ch;
}

编译记得勾选Use Micro LIB

在这里插入图片描述

循环中放入以下代码即可:

     printf("%.2f\r\n", 360/4096*REIN_MT6816_Get_AngleData());
     HAL_Delay(1000);

最后就完成了对MT6816绝对位置的读取。

  • 12
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
STM32通过SPI方式读取SD卡的原理如下: 1. SPI总线的初始化 首先需要通过SPI总线与SD卡进行通信,因此需要对SPI总线进行初始化。在STM32中,可以通过配置SPI的控制寄存器来设置SPI的工作模式、数据位数、时钟极性等参数,同时还需要配置SPI的GPIO口,将SCK、MISO、MOSI等信号连接到正确的GPIO口上。 2. SD卡的初始化 在使用SD卡之前,需要对SD卡进行初始化操作,包括检查SD卡是否存在、设定SD卡的工作模式等。具体步骤如下: (1)向SD卡发送CMD0命令,将SD卡置于空闲状态。 (2)向SD卡发送CMD8命令,检查SD卡是否支持高速模式。 (3)向SD卡发送CMD55命令,进入应用命令模式。 (4)向SD卡发送ACMD41命令,等待SD卡初始化完成。 (5)向SD卡发送CMD2命令,获取SD卡CID信息。 (6)向SD卡发送CMD3命令,获取SD卡RCA信息。 (7)向SD卡发送CMD7命令,选择SD卡。 3. 读取SD卡的数据 在完成SPI总线和SD卡的初始化之后,就可以通过SPI总线读取SD卡的数据了。具体步骤如下: (1)向SD卡发送CMD17命令,选择要读取的扇区。 (2)向SD卡发送读命令,读取指定扇区的数据。 (3)读取SD卡返回的数据,并将数据保存到指定的存储器中。 需要注意的是,SD卡的读取速度较慢,因此在读取数据时需要考虑到速度问题,避免出现数据读取不完整或者出现超时等问题。同时,也需要注意SD卡的时序问题,以保证读取数据的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Colorful Life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值