目录
概述
前段时间,写过一篇博文,关于“瑞盟 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