parent
7eeae6e673
commit
a7079b7124
@ -0,0 +1,95 @@ |
||||
#ifndef __BSP_SPI_H |
||||
#define __BSP_SPI_H |
||||
|
||||
#include "stm32f4xx_hal.h" |
||||
#include "main.h" |
||||
// #include "sys.h"
|
||||
|
||||
typedef enum
|
||||
{ |
||||
SPI_Trans_Polling = 0x00U, |
||||
SPI_Trans_IT = 0x01U, |
||||
SPI_Trans_DMA = 0x02U, |
||||
} SPI_Transmode_TypeDef; |
||||
|
||||
typedef enum
|
||||
{ |
||||
SPI_WORKMODE_RX_TX = 0x00U, |
||||
SPI_WORKMODE_TX = 0x01U, |
||||
SPI_WORKMODE_RX = 0x02U, |
||||
} SPI_WORKMODE_RX_TX_TypeDef; |
||||
|
||||
|
||||
typedef void ( *enable_func_gpio) (void); |
||||
typedef int ( *callback_fun) (void *obj, void *buf, uint16_t size); |
||||
|
||||
typedef struct
|
||||
{ |
||||
SPI_HandleTypeDef *hspi; |
||||
|
||||
volatile SPI_WORKMODE_RX_TX_TypeDef rx_tx; |
||||
|
||||
SPI_Transmode_TypeDef trans_mode; /* 0 :polling, 1: IT 2: DMA*/ |
||||
SPI_Transmode_TypeDef rcv_mode; /* 0 :polling, 1: IT 2: DMA*/ |
||||
|
||||
// Record_Trans_Rcv_TypeDef *trans_record;
|
||||
// Record_Trans_Rcv_TypeDef *rcv_record;
|
||||
|
||||
uint8_t *trans_buf; |
||||
uint16_t trans_size; |
||||
uint8_t *rcv_buf; |
||||
uint16_t rcv_size; |
||||
|
||||
volatile uint8_t transferring; |
||||
uint32_t timebase; |
||||
|
||||
// enable_func_gpio enable_trans_gpio;
|
||||
// enable_func_gpio enable_trans_cplt_gpio;
|
||||
|
||||
void * obj; |
||||
callback_fun callback; |
||||
|
||||
|
||||
}SPI_HELPER_TypeDef; |
||||
|
||||
extern SPI_HELPER_TypeDef *spihelper; |
||||
|
||||
SPI_HELPER_TypeDef * SPI_HELPER_Init( ); |
||||
void SPI_HELPER_Set_Huart(SPI_HELPER_TypeDef * spihelper, SPI_HELPER_TypeDef *hspi); |
||||
|
||||
|
||||
int SPI_HELPER_Setup_Trans_mode( SPI_HELPER_TypeDef * spihelper, uint8_t trans_mode ); |
||||
int SPI_HELPER_Setup_Rcv_mode( SPI_HELPER_TypeDef * spihelper, uint8_t rcv_mode ); |
||||
|
||||
int SPI_HELPER_Set_Rcv_Buf( SPI_HELPER_TypeDef * spihelper, uint8_t * buf, uint16_t size); |
||||
int SPI_HELPER_Set_Trans_Buf( SPI_HELPER_TypeDef * spihelper, uint8_t * buf, uint16_t size); |
||||
|
||||
int SPI_HELPER_Setup_WokMode_RX_TX( SPI_HELPER_TypeDef * spihelper, uint8_t rx_tx ); |
||||
|
||||
int SPI_HELPER_Set_Callback( SPI_HELPER_TypeDef * spihelper, void *obj, callback_fun func); |
||||
|
||||
int SPI_HELPER_Trans(SPI_HELPER_TypeDef * spihelper, uint8_t *buf, uint16_t size); |
||||
int SPI_HELPER_Trans_TxCplt_Callback( SPI_HELPER_TypeDef * spihelper ); |
||||
|
||||
int SPI_HELPER_Start_Rcv(SPI_HELPER_TypeDef * spihelper, uint8_t *buf, uint16_t size); |
||||
int SPI_HELPER_RCV_Cplt_Callback( SPI_HELPER_TypeDef * spihelper ); |
||||
|
||||
int SPI_HELPER_Start_Trans_Rcv(SPI_HELPER_TypeDef * spihelper, uint8_t *txbuf ,uint8_t *rxbuf, uint16_t size); |
||||
int SPI_HELPER_Trans_RCV_Cplt_Callback( SPI_HELPER_TypeDef * spihelper ); |
||||
|
||||
void SPI_HELPER_Test(void) ; |
||||
void SPI_HELPER_TransmitReceive(uint8_t* txData, uint8_t* rxData, uint16_t size) ; |
||||
|
||||
#endif |
||||
|
||||
/*
|
||||
void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); |
||||
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); |
||||
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); |
||||
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi); |
||||
void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi); |
||||
void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi); |
||||
void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi); |
||||
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); |
||||
void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi); |
||||
*/ |
@ -0,0 +1,151 @@ |
||||
#include "bsp_spi.h" |
||||
#include "elog.h" |
||||
// #include "delay.h"
|
||||
|
||||
extern SPI_HandleTypeDef hspi5; |
||||
SPI_HandleTypeDef *testSPIHandle = &hspi5; |
||||
|
||||
|
||||
SPI_HELPER_TypeDef * SPI_HELPER_Init( ) |
||||
{ |
||||
SPI_HELPER_TypeDef *Handle = (SPI_HELPER_TypeDef *)malloc(sizeof(SPI_HELPER_TypeDef)); |
||||
if (Handle == NULL) |
||||
{ |
||||
return NULL; |
||||
} |
||||
|
||||
Handle->hspi = NULL; |
||||
Handle->rx_tx = SPI_WORKMODE_RX_TX; |
||||
Handle->trans_mode = SPI_Trans_Polling; |
||||
Handle->rcv_mode = SPI_Trans_Polling; |
||||
|
||||
Handle->transferring = 0; |
||||
|
||||
|
||||
Handle->obj =NULL; |
||||
Handle->callback =NULL; |
||||
return Handle; |
||||
} |
||||
|
||||
|
||||
int SPI_HELPER_Setup_Trans_mode( SPI_HELPER_TypeDef * spihelper, uint8_t trans_mode ) |
||||
{ |
||||
spihelper->trans_mode =trans_mode; |
||||
spihelper->rcv_mode =trans_mode; |
||||
return 0; |
||||
} |
||||
int SPI_HELPER_Setup_Rcv_mode( SPI_HELPER_TypeDef * spihelper, uint8_t rcv_mode ) |
||||
{ |
||||
spihelper->rcv_mode =rcv_mode; |
||||
return 0; |
||||
} |
||||
|
||||
int SPI_HELPER_Setup_WokMode_RX_TX( SPI_HELPER_TypeDef * spihelper, uint8_t rx_tx ) |
||||
{ |
||||
spihelper->rx_tx =rx_tx; |
||||
return 0; |
||||
} |
||||
|
||||
int SPI_HELPER_Set_Rcv_Buf( SPI_HELPER_TypeDef * spihelper, uint8_t * buf, uint16_t size) |
||||
{ |
||||
spihelper->rcv_buf = buf; |
||||
spihelper->rcv_size = size; |
||||
return 0; |
||||
} |
||||
int SPI_HELPER_Set_Trans_Buf( SPI_HELPER_TypeDef * spihelper, uint8_t * buf, uint16_t size) |
||||
{ |
||||
spihelper->trans_buf = buf; |
||||
spihelper->trans_size = size; |
||||
return 0; |
||||
} |
||||
|
||||
int SPI_HELPER_Set_Callback( SPI_HELPER_TypeDef * spihelper, void *obj, callback_fun func) |
||||
{ |
||||
spihelper->obj = obj; |
||||
spihelper->callback = func; |
||||
return 0; |
||||
} |
||||
|
||||
void SPI_Test(void)
|
||||
{
|
||||
uint8_t txData[4] = {0x9F, 0x00, 0x00, 0x00};
|
||||
uint8_t rxData[4] = {0}; //
|
||||
SPI_TransmitReceive(txData, rxData, 4);
|
||||
log_i("Manufacturer ID: 0x%02X\n", rxData[1]); // EF
|
||||
log_i("Memory Type: 0x%02X\n", rxData[2]); // 40
|
||||
log_i("Capacity: 0x%02X\n", rxData[3]); // 19
|
||||
}
|
||||
|
||||
|
||||
void SPI_TransmitReceive(uint8_t* txData, uint8_t* rxData, uint16_t size)
|
||||
{
|
||||
HAL_GPIO_WritePin(SPI5_CS_GPIO_Port, SPI5_CS_Pin, GPIO_PIN_RESET);
|
||||
HAL_SPI_TransmitReceive(testSPIHandle, txData, rxData, size, HAL_MAX_DELAY);
|
||||
HAL_GPIO_WritePin(SPI5_CS_GPIO_Port, SPI5_CS_Pin, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
// void SPI_Init(const SPI_SOFT_TypeDef *pSoftSPI)
|
||||
// {
|
||||
// GPIO_InitTypeDef GPIO_InitStructure;
|
||||
// __HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟
|
||||
|
||||
// // //PB6 SCL PB7初始化设置
|
||||
// // GPIO_Initure.Pin = pSoftIIC->scl_pin ;
|
||||
// // GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
|
||||
// // GPIO_Initure.Pull = GPIO_PULLUP; // 上拉
|
||||
// // GPIO_Initure.Speed = GPIO_SPEED_FAST; // 快速
|
||||
// // HAL_GPIO_Init( pSoftIIC->scl_port, &GPIO_Initure );
|
||||
|
||||
// // // SDA PB7 初始化设置
|
||||
// // GPIO_Initure.Pin = pSoftIIC->sda_pin;
|
||||
// // HAL_GPIO_Init( pSoftIIC->sda_port, &GPIO_Initure );
|
||||
|
||||
// // GPIO_WRITE_PIN(pSoftIIC->sda_port, pSoftIIC->sda_pin, 1);
|
||||
// // GPIO_WRITE_PIN(pSoftIIC->scl_port, pSoftIIC->scl_pin, 1);
|
||||
|
||||
|
||||
// // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
|
||||
// // GPIO_InitTypeDef GPIO_InitStructure;
|
||||
// // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //457引脚配置为推挽输出
|
||||
// // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7;//457引脚配置为推挽输出
|
||||
// // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
// // GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||
|
||||
// // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//pin6是MISO,对于STM32来说是输入,配置为上拉输入
|
||||
// // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//pin6是MISO,对于STM32来说是输入,配置为上拉输入
|
||||
// // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
// // GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||||
|
||||
// // //CS引脚初始化
|
||||
// GPIO_InitStructure.Pin = pSoftSPI->cs_pin;
|
||||
// GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ; //推挽输出
|
||||
// GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
// HAL_GPIO_Init(pSoftSPI->cs_port, &GPIO_InitStructure);
|
||||
|
||||
// //SCK和MOSI引脚初始化
|
||||
// GPIO_InitStructure.Pin = pSoftSPI->sclk_pin ;
|
||||
// GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ; //推挽输出
|
||||
// GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
// HAL_GPIO_Init(pSoftSPI->sclk_port, &GPIO_InitStructure);
|
||||
|
||||
|
||||
// //MISO引脚初始化
|
||||
// GPIO_InitStructure.Pin = pSoftSPI->miso_pin;
|
||||
// // GPIO_InitStructure.Mode = GPIO_Mode_IPU ; //浮空输入
|
||||
// GPIO_InitStructure.Mode = GPIO_MODE_INPUT ; //浮空输入
|
||||
// GPIO_InitStructure.Pull = GPIO_PULLUP;
|
||||
// HAL_GPIO_Init(pSoftSPI->miso_pin, &GPIO_InitStructure);
|
||||
|
||||
// // MOSI引脚初始化
|
||||
// GPIO_InitStructure.Pin = pSoftSPI->mosi_pin;
|
||||
// GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ; //推挽输出
|
||||
// GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
// HAL_GPIO_Init(pSoftSPI->mosi_port, &GPIO_InitStructure);
|
||||
|
||||
// // 初始化
|
||||
// HAL_GPIO_WritePin(pSoftSPI->mosi_port, pSoftSPI->mosi_pin, GPIO_PIN_RESET);
|
||||
// HAL_GPIO_WritePin(pSoftSPI->cs_port, pSoftSPI->cs_pin, GPIO_PIN_SET);
|
||||
// HAL_GPIO_WritePin(pSoftSPI->mosi_port, pSoftSPI->mosi_pin, GPIO_PIN_SET);
|
||||
// }
|
||||
|
||||
|
Loading…
Reference in new issue