MS41929 步进电机驱动 一(硬件SPI通讯)

本文介绍了如何使用STM32F103C8T6通过硬件SPI与MS41929步进电机驱动IC进行通讯。通过STM32CubeMX配置工程,并在Keil中编写代码实现电机转动。提供了关键的SPI读写函数示例。
摘要由CSDN通过智能技术生成

目录

概述

一、STM32CubeMX配置生成工程

二、Keil 编码


概述

        前段时间,写过一篇博文,关于“瑞盟 MS41929 步进电机驱动IC 一些使用心得”,当然只是个人片面理解,如有错误的地方,请各位看官指出,谢谢!!共同进步。^_^

今天为什么写这篇简单例程,因为有一位粉丝咨询过我这款驱动IC,在此,为了帮助更多人,这篇博文只是简单驱动马达转动,具体使用在镜头上的细节算法,还是自己完善,因为是公司项目,不方便公开,请谅解。

这篇只要是介绍硬件SPI通讯方式。

(注:详情还是要多看 "MS41929" Datasheet)

1)、硬件平台

       STM32F103C8T6 + MS41929
2)、软件平台

       IDE:STM32CubeMX + Keil 5.29


一、STM32CubeMX配置生成工程


以上这些配置完成后,生成代码即可。

接下来就可以愉快的编写驱动马达代码了,此时,高不高兴。

二、Keil 编码

1、新建bsp_init.h 与 bsp_init.c文件

bsp_spi.h
 

#ifndef __SPI_H
#define	__SPI_H

#include "stm32f1xx_hal.h"
#include <stdio.h>


uint8_t MS41929_SPI_Write(uint8_t addr, uint16_t TxData);
uint8_t MS41929_SPI_Read(uint8_t addr, uint8_t* RxData);

#endif /* __SPI_H */


bsp_spi.c

#include "bsp_spi.h"
#include "main.h"
#include "spi.h"


uint8_t Reverse8Bit(uint8_t x) {
#if 1
    uint8_t i = 0;
 uint8_t data = 0;
 for (i=0;i<8;i++)
 {
  if (x & 0x01)
  {
   data |= 0x01;
  }
  x >>= 1;
  data <<= 1;
 }
 data >>= 1;
 return data;
#else
    x = (((x & 0xaaaa) >> 1) | ((x & 0x5555) << 1));
    x = (((x & 0xcccc) >> 2) | ((x & 0x3333) << 2));
    return x;
#endif
}


#if 0

uint8_t MS41929_SPI_Write(uint8_t addr, uint16_t TxData)
{
#if 1	
		uint8_t pData[3] = {0}, revData[3] = {0};
		uint8_t res = HAL_OK;
		
		pData[0] = addr;
		pData[1] = (uint8_t)(TxData >> 8);
		pData[2] = (uint8_t)(TxData);
		
		HAL_GPIO_WritePin(MS41929_CS_GPIO_Port, MS41929_CS_Pin, GPIO_PIN_SET);
	  
//		if(HAL_SPI_TransmitReceive(&hspi2, pData, revData, 3, 0xff) != HAL_OK)
		if(HAL_SPI_Transmit(&hspi2, pData, 3, 0xff) != HAL_OK)
		{
			res = HAL_ERROR;
		}
	  
		HAL_GPIO_WritePin(MS41929_CS_GPIO_Port, MS41929_CS_Pin, GPIO_PIN_RESET);
#else
		uint8_t pData[3] = {0}, revData[3] = {0};
		uint8_t res = HAL_OK;
		
		struct 
		{
			uint8_t  pAddr;
			uint16_t pData;
		}buff;
		
		buff.pAddr = 0;
		buff.pData = 0;
		buff.pAddr = addr;
		buff.pData = txData;
		
		HAL_GPIO_WritePin(MS41929_CS_GPIO_Port, MS41929_CS_Pin, GPIO_PIN_SET);
	  
		if(HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&buff, revData, 3, 0xff) != HAL_OK)
//		if(HAL_SPI_Transmit(&hspi2, (uint8_t*)&buff, 3, 0xff) != HAL_OK)
		{
			res = HAL_ERROR;
		}
	  
		HAL_GPIO_WritePin(MS41929_CS_GPIO_Port, MS41929_CS_Pin, GPIO_PIN_RESET);
#endif
		return  res;
}

uint8_t MS41929_SPI_Read(uint8_t addr, uint8_t* RxData)
{
		uint8_t addrr = addr | Reverse8Bit(0x02); //Reverse8Bit(0x02) result:0x40
		uint8_t pData[3] = {0};//, revData[3] = {0};
		uint8_t res = HAL_OK;
		pData[0] = addrr;
		uint8_t i = 0;
		
		HAL_GPIO_WritePin(MS41929_CS_GPIO_Port, MS41929_CS_Pin, GPIO_PIN_SET);
	  
		if(HAL_SPI_TransmitReceive(&hspi2, pData, RxData, 3, 0xff) != HAL_OK)
		{
			res = HAL_ERROR;
		}
		
		HAL_GPIO_WritePin(MS41929_CS_GPIO_Port, MS41929_CS_Pin, GPIO_PIN_RESET);
	
		return res;
}

#else

uint8_t SPI_ReadWriteByte(uint8_t TxData)//
{
	uint8_t Rxdata;
	HAL_SPI_TransmitReceive(&hspi2, &TxData, &Rxdata, 1, 1000);       
 	return Rxdata;          		    
}

void SPI_Write(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{
 	uint16_t i; 
 
	HAL_GPIO_WritePin(MS41929_CS_GPIO_Port, MS41929_CS_Pin, GPIO_PIN_SET);
	SPI_ReadWriteByte((uint8_t)((W
以下是使用M481SIDAE芯片通过SPI通讯驱动MS41919步进电机的C代码示例: ```C #include "stdio.h" #include "NuMicro.h" #define SPI_CLK_FREQ 1000000 // SPI时钟频率 #define MS41919_CS_PIN PB0 // MS41919步进电机的片选引脚 SPI_T *spi; // 定义SPI模块指针 void GPIO_Init(void) { GPIO_SetMode(PB, BIT0, GPIO_MODE_OUTPUT); // 设置MS41919的片选引脚为输出模式 GPIO_SetMode(PB, BIT1, GPIO_MODE_OUTPUT); // 设置SPI的时钟引脚为输出模式 GPIO_SetMode(PB, BIT2, GPIO_MODE_OUTPUT); // 设置SPI的从机输入引脚为输出模式 GPIO_SetMode(PB, BIT3, GPIO_MODE_OUTPUT); // 设置SPI的主机输出引脚为输出模式 } void SPI_Init(void) { /* 开启SPI时钟 */ CLK_EnableModuleClock(SPI0_MODULE); /* 配置SPI引脚 */ SYS->GPC_MFPH = (SYS->GPC_MFPH & ~(SYS_GPC_MFPH_PC8MFP_Msk | SYS_GPC_MFPH_PC9MFP_Msk | SYS_GPC_MFPH_PC10MFP_Msk | SYS_GPC_MFPH_PC11MFP_Msk)) | (SYS_GPC_MFPH_PC8MFP_SPI0_CLK | SYS_GPC_MFPH_PC9MFP_SPI0_MISO | SYS_GPC_MFPH_PC10MFP_SPI0_MOSI | SYS_GPC_MFPH_PC11MFP_SPI0_SS); /* 设置SPI时钟频率 */ SPI_SetBusClock(SPI0, SPI_CLK_FREQ); /* 配置SPI控制器 */ spi = SPI0; spi->CTL = SPI_CTL_MASTER_Msk | SPI_CTL_SPIEN_Msk | SPI_CTL_TXNEG_Msk | SPI_CTL_RXNEG_Msk | SPI_CTL_DUALIO_Msk; /* 配置SPI的数据宽度为8位 */ SPI_SetDataWidth(spi, 8); /* 禁止SPI的自动片选功能 */ SPI_DisableAutoSS(spi); } void MS41919_SendCmd(uint8_t cmd) { GPIO_SetBit(PB, MS41919_CS_PIN); // 将MS41919的片选引脚置高 SPI_WRITE_TX(spi, cmd); // 将命令写入SPI发送缓冲区 while(SPI_IS_BUSY(spi)); // 等待SPI发送完成 GPIO_ClearBit(PB, MS41919_CS_PIN); // 将MS41919的片选引脚置低 } int main() { /* 初始化GPIO模块 */ GPIO_Init(); /* 初始化SPI模块 */ SPI_Init(); /* 发送步进电机控制命令 */ MS41919_SendCmd(0x11); // 控制步进电机转动1步 while(1); } ``` 在上面的代码中,我们使用了M481SIDAE芯片的SPI模块来与MS41919步进电机进行通讯。我们首先需要初始化GPIO模块,将MS41919的片选引脚设置为输出模式。然后,我们需要初始化SPI模块,将SPI的引脚配置为SPI模式。在发送步进电机的控制命令时,我们需要先将MS41919的片选引脚置高,然后将命令写入SPI发送缓冲区,等待SPI发送完成后将MS41919的片选引脚置低。 需要注意的是,在使用M481SIDAE芯片驱动MS41919步进电机时,需要根据具体的步进电机型号和驱动方式来编写相应的控制代码。本示例仅供参考。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ch_champion

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

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

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

打赏作者

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

抵扣说明:

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

余额充值