You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.0 KiB

6 months ago
#include "spi13.h"
void SPI13_Initialization(uint32_t speed, SPI13_MODE mode, bool lsbFirst)
{
USART1n_CFG_Type USART1n_Config;
/*
* Initialize USART13
*/
// MOSI
HAL_GPIO_ConfigOutput( ( Pn_Type* )PE, 8, ALTERN_FUNC );
HAL_GPIO_ConfigFunction( ( Pn_Type* )PE, 8, AFSRx_AF2 );
// MISO
//HAL_GPIO_ConfigOutput( ( Pn_Type* )PB, 1, ALTERN_FUNC );
//HAL_GPIO_ConfigFunction( ( Pn_Type* )PB, 1, AFSRx_AF2 );
// SCK
HAL_GPIO_ConfigOutput( ( Pn_Type* )PE, 10, ALTERN_FUNC );
HAL_GPIO_ConfigFunction( ( Pn_Type* )PE, 10, AFSRx_AF2 );
// 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 SPI13_MODE0:
USART1n_Config.ACK = USART1n_SPI_TX_RISING;
USART1n_Config.Edge = USART1n_SPI_TX_LEADEDGE_SAMPLE;
break;
case SPI13_MODE1:
USART1n_Config.ACK = USART1n_SPI_TX_RISING;
USART1n_Config.Edge = USART1n_SPI_TX_LEADEDGE_SETUP;
break;
case SPI13_MODE2:
USART1n_Config.ACK = USART1n_SPI_TX_FALLING;
USART1n_Config.Edge = USART1n_SPI_TX_LEADEDGE_SAMPLE;
break;
case SPI13_MODE3:
USART1n_Config.ACK = USART1n_SPI_TX_FALLING;
USART1n_Config.Edge = USART1n_SPI_TX_LEADEDGE_SETUP;
break;
}
HAL_USART_Init( ( USART1n_Type* )USART13, &USART1n_Config );
// SPI Master
HAL_USART_DataControlConfig( ( USART1n_Type* )USART13, USART1n_CONTROL_MASTER, ENABLE );
// ENABLE
HAL_USART_Enable( ( USART1n_Type* )USART13, ENABLE );
}
void SPI13_Transmit(uint8_t* pTxData, uint32_t Tx_Len)
{
uint32_t i;
for(i = 0 ; i < Tx_Len ; i++)
{
USART13->DR = pTxData[i];
while((USART13->ST & 0x40)==0x00){} // transmit complete flag wait
while((USART13->ST & 0x20)==0x00){} // receive complete flag wait
uint8_t temp = USART13->DR;
}
}
void SPI13_SendRecv(uint8_t* pTxByte, uint8_t* pRxByte, uint32_t TRx_Len)
{
uint32_t i;
for(i = 0 ; i < TRx_Len ; i++)
{
USART13->DR = pTxByte[i];
while((USART13->ST & 0x40)==0x00){} // transmit complete flag wait
while((USART13->ST & 0x20)==0x00){} // receive complete flag wait
pRxByte[i] = USART13->DR;
}
}
uint8_t SPI13_SendReceiveByte(uint8_t SendByte)
{
uint8_t recvByte;
USART13->DR = SendByte;
while((USART13->ST & 0x40)==0x00){} // transmit complete flag wait
while((USART13->ST & 0x20)==0x00){} // receive complete flag wait
recvByte = USART13->DR;
return recvByte;
}