191 lines
6.1 KiB
C
191 lines
6.1 KiB
C
|
|
//<2F><><EFBFBD><EFBFBD> HAL <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0> SPI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
#include "spi.h"
|
|||
|
|
|
|||
|
|
/**************************************** SPI2 ****************************************/
|
|||
|
|
//SPI2 <20><><EFBFBD><EFBFBD> LCD <20><>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
SPI_HandleTypeDef SPI2_Handler;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void SPI2_Init(void)
|
|||
|
|
{
|
|||
|
|
SPI2_Handler.Instance = SPI2; //SPI2
|
|||
|
|
SPI2_Handler.Init.Mode = SPI_MODE_MASTER; //<2F><><EFBFBD><EFBFBD> SPI <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ģʽ
|
|||
|
|
SPI2_Handler.Init.Direction = SPI_DIRECTION_2LINES; //<2F><><EFBFBD><EFBFBD> SPI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>SPI <20><><EFBFBD><EFBFBD>Ϊ˫<CEAA><CBAB>ģʽ
|
|||
|
|
SPI2_Handler.Init.DataSize = SPI_DATASIZE_8BIT; //<2F><><EFBFBD><EFBFBD> SPI <20><><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С<EFBFBD><D0A1>SPI <20><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD> 8 λ֡<CEBB>ṹ
|
|||
|
|
SPI2_Handler.Init.CLKPolarity = SPI_POLARITY_HIGH; //<2F><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĿ<D3B5><C4BF><EFBFBD>״̬Ϊ<CCAC>ߵ<EFBFBD>ƽ
|
|||
|
|
SPI2_Handler.Init.CLKPhase = SPI_PHASE_2EDGE; //<2F><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ʱ<EFBFBD>ӵĵڶ<C4B5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SPI2_Handler.Init.NSS = SPI_NSS_SOFT; //NSS <20>ź<EFBFBD><C5BA><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>NSS <20>ܽţ<DCBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> SSI λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD> NSS <20>ź<EFBFBD><C5BA><EFBFBD> SSI λ<><CEBB><EFBFBD><EFBFBD>
|
|||
|
|
SPI2_Handler.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; //NSS <20>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
|
SPI2_Handler.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; //SPI <20><>ģʽ IO ״̬<D7B4><CCAC><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
|||
|
|
SPI2_Handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; //<2F><><EFBFBD>岨<EFBFBD><E5B2A8><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>Ƶ<EFBFBD><C6B5>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>ƵֵΪ 256
|
|||
|
|
SPI2_Handler.Init.FirstBit = SPI_FIRSTBIT_MSB; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD> MSB λ<><CEBB><EFBFBD><EFBFBD> LSB λ<><CEBB>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD> MSB λ<><CEBB>ʼ
|
|||
|
|
SPI2_Handler.Init.TIMode = SPI_TIMODE_DISABLE; //<2F>ر<EFBFBD> TI ģʽ
|
|||
|
|
SPI2_Handler.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; //<2F>ر<EFBFBD>Ӳ<EFBFBD><D3B2> CRC У<><D0A3>
|
|||
|
|
SPI2_Handler.Init.CRCPolynomial = 7; //CRC ֵ<><D6B5><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>ʽ
|
|||
|
|
HAL_SPI_Init(&SPI2_Handler);
|
|||
|
|
|
|||
|
|
__HAL_SPI_ENABLE(&SPI2_Handler); //ʹ<><CAB9> SPI2
|
|||
|
|
SPI2_ReadWrite8Bits(0Xff); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI <EFBFBD>ײ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD> HAL_SPI_Init() <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param hspi: pointer to a SPI_HandleTypeDef structure that contains
|
|||
|
|
* the configuration information for SPI module.
|
|||
|
|
*/
|
|||
|
|
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
|
|||
|
|
{
|
|||
|
|
GPIO_InitTypeDef GPIO_Initure;
|
|||
|
|
RCC_PeriphCLKInitTypeDef SPI2ClkInit;
|
|||
|
|
|
|||
|
|
__HAL_RCC_GPIOB_CLK_ENABLE(); //ʹ<><CAB9> GPIOB ʱ<><CAB1>
|
|||
|
|
__HAL_RCC_SPI2_CLK_ENABLE(); //ʹ<><CAB9> SPI2 ʱ<><CAB1>
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>SPI2<49><32>ʱ<EFBFBD><CAB1>Դ
|
|||
|
|
SPI2ClkInit.PeriphClockSelection = RCC_PERIPHCLK_SPI2; //<2F><><EFBFBD><EFBFBD>SPI2 ʱ<><CAB1>Դ
|
|||
|
|
SPI2ClkInit.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL; //SPI2 ʱ<><CAB1>Դʹ<D4B4><CAB9> PLL1Q
|
|||
|
|
HAL_RCCEx_PeriphCLKConfig(&SPI2ClkInit);
|
|||
|
|
|
|||
|
|
GPIO_Initure.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; //PB13 14 15
|
|||
|
|
GPIO_Initure.Mode = GPIO_MODE_AF_PP; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
GPIO_Initure.Pull = GPIO_PULLUP; //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
GPIO_Initure.Alternate = GPIO_AF5_SPI2; //<2F><><EFBFBD><EFBFBD>Ϊ SPI2
|
|||
|
|
HAL_GPIO_Init(GPIOB, &GPIO_Initure); //GPIO <20><>ʼ<EFBFBD><CABC>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 <EFBFBD>ٶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* SPI <EFBFBD>ٶ<EFBFBD> = PLL1Q / <EFBFBD><EFBFBD>Ƶϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* PLL1Q һ<EFBFBD><EFBFBD>Ϊ 200MHz
|
|||
|
|
* @param SPI_BaudRatePrescaler: SPI_BaudRate_Prescaler SPI BaudRate Prescaler. <EFBFBD><EFBFBD><EFBFBD>磺SPI_BAUDRATEPRESCALER_4
|
|||
|
|
*/
|
|||
|
|
void SPI2_SetSpeed(uint32_t SPI_BaudRatePrescaler)
|
|||
|
|
{
|
|||
|
|
__HAL_SPI_DISABLE(&SPI2_Handler); //<2F>ر<EFBFBD> SPI
|
|||
|
|
SPI2_Handler.Instance->CFG1 &= ~(0X7 << 28); //λ 30-28 <20><><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SPI2_Handler.Instance->CFG1 |= SPI_BaudRatePrescaler; //<2F><><EFBFBD><EFBFBD> SPI <20>ٶ<EFBFBD>
|
|||
|
|
__HAL_SPI_ENABLE(&SPI2_Handler); //ʹ<><CAB9> SPI
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 <EFBFBD><EFBFBD>д 8 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param TxData: Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
uint8_t SPI2_ReadWrite8Bits(uint8_t TxData)
|
|||
|
|
{
|
|||
|
|
uint8_t Rxdata = 0xff;
|
|||
|
|
HAL_SPI_TransmitReceive(&SPI2_Handler, &TxData, &Rxdata, 1, 1000);
|
|||
|
|
|
|||
|
|
return Rxdata;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param pTxData: ָ<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param pRxData: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param Count: <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD> 8 λ<EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ 0xffff (65535)
|
|||
|
|
*/
|
|||
|
|
void SPI2_ReadWriteBytes(uint8_t *pTxData, uint8_t *pRxData, uint32_t Count)
|
|||
|
|
{
|
|||
|
|
while (Count > 0xffff)
|
|||
|
|
{
|
|||
|
|
HAL_SPI_TransmitReceive(&SPI2_Handler, pTxData, pRxData, 0xffff, 0xffff);
|
|||
|
|
Count -= 0xffff;
|
|||
|
|
pTxData += 0xffff;
|
|||
|
|
pRxData += 0xffff;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
HAL_SPI_TransmitReceive(&SPI2_Handler, pTxData, pRxData, Count, 0xffff);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 д 8 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param Data: Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void SPI2_Write8Bits(uint8_t Data)
|
|||
|
|
{
|
|||
|
|
HAL_SPI_Transmit(&SPI2_Handler, &Data, 1, 0xffff);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 д 16 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param Data: Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void SPI2_Write16Bits(uint16_t Data)
|
|||
|
|
{
|
|||
|
|
uint8_t temp[2];
|
|||
|
|
temp[0] = Data >> 8;
|
|||
|
|
temp[1] = Data;
|
|||
|
|
|
|||
|
|
HAL_SPI_Transmit(&SPI2_Handler, &temp, 2, 0xffff);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 д 32 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param Data: Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 32 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void SPI2_Write32Bits(uint32_t Data)
|
|||
|
|
{
|
|||
|
|
uint8_t temp[4];
|
|||
|
|
temp[0] = Data >> 24;
|
|||
|
|
temp[1] = Data >> 16;
|
|||
|
|
temp[2] = Data >> 8;
|
|||
|
|
temp[3] = Data;
|
|||
|
|
|
|||
|
|
HAL_SPI_Transmit(&SPI2_Handler, &temp, 4, 0xffff);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param pData: ָ<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param Count: <EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void SPI2_WriteBytes(uint8_t *pData, uint32_t Count)
|
|||
|
|
{
|
|||
|
|
while (Count > 0xffff)
|
|||
|
|
{
|
|||
|
|
HAL_SPI_Transmit(&SPI2_Handler, pData, 0xffff, 0xffff);
|
|||
|
|
Count -= 0xffff;
|
|||
|
|
pData += 0xffff;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
HAL_SPI_Transmit(&SPI2_Handler, pData, Count, 0xffff);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 <EFBFBD><EFBFBD> 8 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
uint8_t SPI2_Read8Bits(void)
|
|||
|
|
{
|
|||
|
|
uint8_t data;
|
|||
|
|
HAL_SPI_Receive(&SPI2_Handler, &data, 1, 0xffff);
|
|||
|
|
|
|||
|
|
return data;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief SPI2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param pData: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param Count: <EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void SPI2_ReadBytes(uint8_t *pData, uint32_t Count)
|
|||
|
|
{
|
|||
|
|
while (Count > 0xffff)
|
|||
|
|
{
|
|||
|
|
HAL_SPI_Receive(&SPI2_Handler, pData, 0xffff, 0xffff);
|
|||
|
|
Count -= 0xffff;
|
|||
|
|
pData += 0xffff;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
HAL_SPI_Receive(&SPI2_Handler, pData, Count, 0xffff);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*************************************************************************************/
|