STM32电机培训online,大佬带你玩电机
因为硬件上连接到了普通的GPIO脚,不得不写软件模拟SPI,代码经过验证。如下:- #ifndef __SPI_H
- #define __SPI_H
- /* Includes ------------------------------------------------------------------*/
- #include "stm32l0xx_hal.h"
- #define SPI_SCK_PIN GPIO_PIN_4
- #define SPI_SCK_GPIO_PORT GPIOC
- #define SPI_MOSI_PIN GPIO_PIN_7
- #define SPI_MOSI_GPIO_PORT GPIOC
- #define SPI_MISO_PIN GPIO_PIN_8
- #define SPI_MISO_GPIO_PORT GPIOC
- #define SPI_NSS_PIN GPIO_PIN_6
- #define SPI_NSS_GPIO_PORT GPIOC
- #define SPI_RESET_PIN GPIO_PIN_5
- #define SPI_RESET_GPIO_PORT GPIOC
-
- #define SPI_SCK_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
- #define SPI_MISO_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
- #define SPI_MOSI_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
- #define SPI_NSS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
- #define SPI_RESET_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
- #define MOSI_H HAL_GPIO_WritePin(SPI_MOSI_GPIO_PORT, SPI_MOSI_PIN, GPIO_PIN_SET)
- #define MOSI_L HAL_GPIO_WritePin(SPI_MOSI_GPIO_PORT, SPI_MOSI_PIN, GPIO_PIN_RESET)
- #define SCK_H HAL_GPIO_WritePin(SPI_SCK_GPIO_PORT, SPI_SCK_PIN, GPIO_PIN_SET)
- #define SCK_L HAL_GPIO_WritePin(SPI_SCK_GPIO_PORT, SPI_SCK_PIN, GPIO_PIN_RESET)
- #define MISO HAL_GPIO_ReadPin(SPI_MISO_GPIO_PORT, SPI_MISO_PIN)
- #define NSS_H HAL_GPIO_WritePin(SPI_NSS_GPIO_PORT, SPI_NSS_PIN, GPIO_PIN_SET)
- #define NSS_L HAL_GPIO_WritePin(SPI_NSS_GPIO_PORT, SPI_NSS_PIN, GPIO_PIN_RESET)
- #define EEPROM_DAC_START_ADDR DATA_EEPROM_BASE+6 /* Start @ of user EEPROM area */
- #define EEPROM_DAC_END_ADDR (EEPROM_BIAS_START_ADDR + 16) /* End @ of user EEPROM area */
- #define IS_DAC_DATA_ADDRESS(__ADDRESS__) (((__ADDRESS__) >= EEPROM_DAC_START_ADDR) && ((__ADDRESS__) <= EEPROM_DAC_END_ADDR))
- #define IS_DAC_CH_ADDRESS(__ADDRESS__) (((__ADDRESS__) >= 1) && ((__ADDRESS__) <= 4))
- void SPI_Init(void);
- uint16_t SPI_ReadWrite_Byte(uint8_t cmd_addr, uint16_t data);
- #endif
复制代码
- #include "spi.h"
- #include "main.h"
- #include "stm32l0xx_hal.h"
- void SPI_Init(void)
- {
- /*##-1- Enable peripherals and GPIO Clocks #################################*/
- /* Enable GPIO TX/RX clock */
- SPI_SCK_GPIO_CLK_ENABLE();
- SPI_MISO_GPIO_CLK_ENABLE();
- SPI_MOSI_GPIO_CLK_ENABLE();
- SPI_NSS_GPIO_CLK_ENABLE();
- SPI_RESET_GPIO_CLK_ENABLE();
- /*##-2- Configure peripheral GPIO ##########################################*/
- /* SPI SCK GPIO pin configuration */
- GPIO_InitTypeDef GPIO_InitStruct;
-
- GPIO_InitStruct.Pin = SPI_SCK_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- //GPIO_InitStruct.Pull = GPIO_PULLDOWN;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- HAL_GPIO_Init(SPI_SCK_GPIO_PORT, &GPIO_InitStruct);
- HAL_GPIO_WritePin(SPI_SCK_GPIO_PORT, SPI_SCK_PIN, GPIO_PIN_SET);
- /* SPI MISO GPIO pin configuration */
- GPIO_InitStruct.Pin = SPI_MISO_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- HAL_GPIO_Init(SPI_MISO_GPIO_PORT, &GPIO_InitStruct);
- /* SPI MOSI GPIO pin configuration */
- GPIO_InitStruct.Pin = SPI_MOSI_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- HAL_GPIO_Init(SPI_MOSI_GPIO_PORT, &GPIO_InitStruct);
- HAL_GPIO_WritePin(SPI_MOSI_GPIO_PORT, SPI_MOSI_PIN, GPIO_PIN_SET);
-
- GPIO_InitStruct.Pin = SPI_NSS_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- HAL_GPIO_Init(SPI_NSS_GPIO_PORT, &GPIO_InitStruct);
- HAL_GPIO_WritePin(SPI_NSS_GPIO_PORT, SPI_NSS_PIN, GPIO_PIN_SET);
-
- GPIO_InitStruct.Pin = SPI_RESET_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- HAL_GPIO_Init(SPI_RESET_GPIO_PORT, &GPIO_InitStruct);
- HAL_GPIO_WritePin(SPI_RESET_GPIO_PORT, SPI_RESET_PIN, GPIO_PIN_SET);
- }
- uint16_t SPI_ReadWrite_Byte(uint8_t cmd_addr, uint16_t data)
- {
- uint16_t temp=0;
- SPI_Init();
- NSS_L;
- SCK_H;
- __NOP(); /*读取第一bit数据 等待数据稳定 根据实际时钟调整*/
- for(uint8_t i=0;i<8;i++)
- {
- if(cmd_addr&0x80)
- {
- MOSI_H; /*若最高位为高,则输出高*/
- }
- else
- {
- MOSI_L; /*若最高位为低,则输出低*/
- }
- __NOP();
- cmd_addr <<= 1;
- SCK_L;
- temp <<= 1; /*数据左移*/
- if(MISO)
- {
- temp++; /*若从从机接收到高电平,数据自加一*/
- }
- SCK_H;
- }
-
- data <<= 6;
-
- for(uint8_t i=0;i<16;i++)
- {
- if(data&0x8000)
- {
- MOSI_H; /*若最高位为高,则输出高*/
- }
- else
- {
- MOSI_L; /*若最高位为低,则输出低*/
- }
- __NOP();
- data <<= 1;
- SCK_L;
- temp <<= 1; /*数据左移*/
- if(MISO)
- {
- temp++; /*若从从机接收到高电平,数据自加一*/
- }
- SCK_H;
- }
- NSS_H;
- MOSI_H;
- return temp;
- }
复制代码
|
在MCU STM32L073RZ上。移植的话,需要简单修改下SPI_ReadWrite_Byte函数,例子里面是按32bit为一个数据包发送的。