Передача ведется на частоте 1 МГц.
CODE
void init(void) {
GPIO_InitTypeDef gpio_init;
SPI_InitTypeDef spi_init;
DMA_InitTypeDef dma_init;
NVIC_InitTypeDef nvic_init;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
gpio_init.GPIO_Mode = GPIO_Mode_AF;
gpio_init.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_init.GPIO_OType = GPIO_OType_PP;
gpio_init.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &gpio_init);
gpio_init.GPIO_PuPd = GPIO_PuPd_DOWN;
gpio_init.GPIO_Pin = GPIO_Pin_12; //NSS
GPIO_Init(GPIOB, &gpio_init);
nvic_init.NVIC_IRQChannel = SPI2_IRQn;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
nvic_init.NVIC_IRQChannelSubPriority = 1;
nvic_init.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&nvic_init);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
SPI_StructInit(&spi_init);
spi_init.SPI_Mode = SPI_Mode_Slave;
spi_init.SPI_CPHA = SPI_CPHA_1Edge;
spi_init.SPI_CPOL = SPI_CPOL_Low;
spi_init.SPI_FirstBit = SPI_FirstBit_MSB;
spi_init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi_init.SPI_NSS = SPI_NSS_Hard;
SPI_Init(SPI2, &spi_init);
SPI_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Reset);
SPI_Cmd(SPI2, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
DMA_DeInit(DMA1_Stream3);
dma_init.DMA_Channel = DMA_Channel_0;
dma_init.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma_init.DMA_FIFOMode = DMA_FIFOMode_Disable;
dma_init.DMA_Mode = DMA_Mode_Normal;
dma_init.DMA_Priority = DMA_Priority_High;
dma_init.DMA_Memory0BaseAddr = (uint32_t)&data;
dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma_init.DMA_MemoryBurst = DMA_MemoryBurst_Single;
dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma_init.DMA_PeripheralBaseAddr = (uint32_t)(SPI2_BASE + 0x0C);
dma_init.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_Init(DMA1_Stream3, &dma_init);
DMA_Cmd(DMA1_Stream3, ENABLE);
}
GPIO_InitTypeDef gpio_init;
SPI_InitTypeDef spi_init;
DMA_InitTypeDef dma_init;
NVIC_InitTypeDef nvic_init;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
gpio_init.GPIO_Mode = GPIO_Mode_AF;
gpio_init.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_init.GPIO_OType = GPIO_OType_PP;
gpio_init.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &gpio_init);
gpio_init.GPIO_PuPd = GPIO_PuPd_DOWN;
gpio_init.GPIO_Pin = GPIO_Pin_12; //NSS
GPIO_Init(GPIOB, &gpio_init);
nvic_init.NVIC_IRQChannel = SPI2_IRQn;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
nvic_init.NVIC_IRQChannelSubPriority = 1;
nvic_init.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&nvic_init);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
SPI_StructInit(&spi_init);
spi_init.SPI_Mode = SPI_Mode_Slave;
spi_init.SPI_CPHA = SPI_CPHA_1Edge;
spi_init.SPI_CPOL = SPI_CPOL_Low;
spi_init.SPI_FirstBit = SPI_FirstBit_MSB;
spi_init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi_init.SPI_NSS = SPI_NSS_Hard;
SPI_Init(SPI2, &spi_init);
SPI_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Reset);
SPI_Cmd(SPI2, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
DMA_DeInit(DMA1_Stream3);
dma_init.DMA_Channel = DMA_Channel_0;
dma_init.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma_init.DMA_FIFOMode = DMA_FIFOMode_Disable;
dma_init.DMA_Mode = DMA_Mode_Normal;
dma_init.DMA_Priority = DMA_Priority_High;
dma_init.DMA_Memory0BaseAddr = (uint32_t)&data;
dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma_init.DMA_MemoryBurst = DMA_MemoryBurst_Single;
dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma_init.DMA_PeripheralBaseAddr = (uint32_t)(SPI2_BASE + 0x0C);
dma_init.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_Init(DMA1_Stream3, &dma_init);
DMA_Cmd(DMA1_Stream3, ENABLE);
}
В чем может быть ошибка?