#include "spi10.h" void SPI10_Initialization(uint32_t speed, SPI10_MODE mode, bool lsbFirst) { USART1n_CFG_Type USART1n_Config; /* * Initialize USART10 */ HAL_GPIO_ConfigOutput( ( Pn_Type* )PB, 0, ALTERN_FUNC ); HAL_GPIO_ConfigFunction( ( Pn_Type* )PB, 0, AFSRx_AF2 ); HAL_GPIO_ConfigOutput( ( Pn_Type* )PB, 1, ALTERN_FUNC ); HAL_GPIO_ConfigFunction( ( Pn_Type* )PB, 1, AFSRx_AF2 ); HAL_GPIO_ConfigOutput( ( Pn_Type* )PB, 2, ALTERN_FUNC ); HAL_GPIO_ConfigFunction( ( Pn_Type* )PB, 2, AFSRx_AF2 ); HAL_GPIO_ConfigOutput((Pn_Type*)SPI10_CS_PORT, SPI10_CS_PIN, PUSH_PULL_OUTPUT ); HAL_GPIO_ConfigPullup((Pn_Type*)SPI10_CS_PORT, SPI10_CS_PIN, PUPDx_EnablePU ); SPI10_CS_HIGH; // default: 38400-8-N-1 HAL_USART_SPI_Mode_Config( &USART1n_Config ); USART1n_Config.Mode = USART1n_SPI_MODE; USART1n_Config.Baudrate = speed; USART1n_Config.Databits = USART1n_DATA_BIT_8; USART1n_Config.Parity = USART1n_PARITY_BIT_NONE; USART1n_Config.Stopbits = USART1n_STOP_BIT_1; if(lsbFirst == true) USART1n_Config.Order = USART1n_SPI_LSB; else USART1n_Config.Order = USART1n_SPI_MSB; switch(mode) { case SPI10_MODE0: USART1n_Config.ACK = USART1n_SPI_TX_RISING; USART1n_Config.Edge = USART1n_SPI_TX_LEADEDGE_SAMPLE; break; case SPI10_MODE1: USART1n_Config.ACK = USART1n_SPI_TX_RISING; USART1n_Config.Edge = USART1n_SPI_TX_LEADEDGE_SETUP; break; case SPI10_MODE2: USART1n_Config.ACK = USART1n_SPI_TX_FALLING; USART1n_Config.Edge = USART1n_SPI_TX_LEADEDGE_SAMPLE; break; case SPI10_MODE3: USART1n_Config.ACK = USART1n_SPI_TX_FALLING; USART1n_Config.Edge = USART1n_SPI_TX_LEADEDGE_SETUP; break; } HAL_USART_Init( ( USART1n_Type* )USART10, &USART1n_Config ); // SPI Master HAL_USART_DataControlConfig( ( USART1n_Type* )USART10, USART1n_CONTROL_MASTER, ENABLE ); // ENABLE HAL_USART_Enable( ( USART1n_Type* )USART10, ENABLE ); } void SPI10_Transmit(uint8_t* pTxData, uint32_t Tx_Len) { uint32_t i; for(i = 0 ; i < Tx_Len ; i++) { USART10->DR = pTxData[i]; while((USART10->ST & 0x40)==0x00){} // transmit complete flag wait while((USART10->ST & 0x20)==0x00){} // receive complete flag wait uint8_t temp = USART10->DR; } } void SPI10_SendRecv(uint8_t* pTxByte, uint8_t* pRxByte, uint32_t TRx_Len) { uint32_t i; for(i = 0 ; i < TRx_Len ; i++) { USART10->DR = pTxByte[i]; while((USART10->ST & 0x40)==0x00){} // transmit complete flag wait while((USART10->ST & 0x20)==0x00){} // receive complete flag wait pRxByte[i] = USART10->DR; } } uint8_t SPI10_SendReceiveByte(uint8_t SendByte) { uint8_t recvByte; USART10->DR = SendByte; while((USART10->ST & 0x40)==0x00){} // transmit complete flag wait while((USART10->ST & 0x20)==0x00){} // receive complete flag wait recvByte = USART10->DR; return recvByte; }