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.

115 lines
3.1 KiB

6 months ago
#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;
}