123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #include "spi.h"
- uint8_t spi1_rec_buf[SPI1_REC_LEN];
- uint8_t spi1_tx_buf[SPI1_TX_LEN];
- uint8_t spi1_rec_cnt;
- uint8_t spi1_rec_flag = 0;
- void SPI1DMA_Enable(DMA_Stream_TypeDef *DMA_Streamx, uint16_t count)
- {
- DMA_Cmd(DMA_Streamx, DISABLE);
- while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE)
- {
- }
- DMA_SetCurrDataCounter(DMA_Streamx, count);
- DMA_Cmd(DMA_Streamx, ENABLE);
- }
- void spi1_config(void)
- {
-
- SPI_InitTypeDef SPI_InitStructure;
-
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
- SPI_InitStructure.SPI_CRCPolynomial = 7;
- SPI_Init(SPI1, &SPI_InitStructure);
- SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
- SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
- }
- void spi1_dma_config(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
- DMA_DeInit(SPI1_DMA_TXCH);
- while (DMA_GetCmdStatus(SPI1_DMA_TXCH) != DISABLE)
- ;
-
- DMA_InitStructure.DMA_Channel = SPI1_DMA;
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
- DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)spi1_tx_buf;
- DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
- DMA_InitStructure.DMA_BufferSize = SPI1_TX_LEN;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
- DMA_Init(SPI1_DMA_TXCH, &DMA_InitStructure);
- DMA_DeInit(SPI1_DMA_RXCH);
- while (DMA_GetCmdStatus(SPI1_DMA_RXCH) != DISABLE)
- ;
-
- DMA_InitStructure.DMA_Channel = SPI1_DMA;
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
- DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)spi1_rec_buf;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
- DMA_InitStructure.DMA_BufferSize = SPI1_REC_LEN;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
- DMA_Init(SPI1_DMA_RXCH, &DMA_InitStructure);
- }
- void spi1_init(void)
- {
- spi1_config();
- spi1_dma_config();
- SPI_Cmd(SPI1, ENABLE);
- SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
- }
- void SPI1DMA_Trans(const uint8_t *data, uint16_t count)
- {
- DMA_Cmd(SPI1_DMA_RXCH, DISABLE);
- DMA_Cmd(SPI1_DMA_TXCH, DISABLE);
- DMA_SetCurrDataCounter(SPI1_DMA_RXCH, count);
- DMA_SetCurrDataCounter(SPI1_DMA_TXCH, count);
- SPI1->DR;
- while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
- ;
- DMA_Cmd(SPI1_DMA_RXCH, ENABLE);
- DMA_Cmd(SPI1_DMA_TXCH, ENABLE);
- while (DMA_GetFlagStatus(SPI1_DMA_RXCH, DMA_FLAG_TCIF2) != RESET)
- ;
- while (DMA_GetFlagStatus(SPI1_DMA_TXCH, DMA_FLAG_TCIF3) != RESET)
- ;
- DMA_Cmd(SPI1_DMA_RXCH, DISABLE);
- DMA_Cmd(SPI1_DMA_TXCH, DISABLE);
- DMA_ClearFlag(SPI1_DMA_RXCH, DMA_FLAG_TCIF2);
- DMA_ClearFlag(SPI1_DMA_TXCH, DMA_FLAG_TCIF3);
- }
|