CODE
#define CS_SET1 GPIOE->BSRRL=GPIO_BSRR_BS_9 /*CS1*/
#define CS_SET0 GPIOE->BSRRH=GPIO_BSRR_BS_9 /*CS0*/
void SPI_Init(void){
RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN; //Тактирование PORTC
//-----------------------------------------------------------------------------------------
//*Конфигурация PC10 на альтернативную функцию SPI3_SCK
//-----------------------------------------------------------------------------------------
GPIOC->OTYPER&=~GPIO_OTYPER_OT_10; //Режим работы push-pull
GPIOC->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR10_1; //Скорость 50 МГц
GPIOC->MODER|=GPIO_MODER_MODER10_1; //Настраиваем PC10 на альтернативную функцию
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3); //Выбираем альтернативную функцию для PC10
//-----------------------------------------------------------------------------------------
//*Конфигурация PC11 на альтернативную функцию SPI3_MISO
//-----------------------------------------------------------------------------------------
GPIOC->OTYPER&=~GPIO_OTYPER_OT_11; //Режим работы push-pull
GPIOC->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR11_1; //Скорость 50 МГц
GPIOC->MODER|=GPIO_MODER_MODER11_1; //Настраиваем PC11 на альтернативную функцию
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3); //Выбираем альтернативную функцию для PC11
//-----------------------------------------------------------------------------------------
//*Конфигурация PC12 на альтернативную функцию SPI3_MOSI
//-----------------------------------------------------------------------------------------
GPIOC->OTYPER&=~GPIO_OTYPER_OT_12; //Режим работы push-pull
GPIOC->OSPEEDR|=GPIO_OSPEEDER_OSPEEDR12_1; //Скорость 50 МГц
GPIOC->MODER|=GPIO_MODER_MODER12_1; //Настраиваем PC12 на альтернативную функцию
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3); //Выбираем альтернативную функцию для PC12
//-----------------------------------------------------------------------------------------
//*Конфигурация PC9 для NSS (CS)
//-----------------------------------------------------------------------------------------
GPIOC->MODER|=GPIO_MODER_MODER9_0; //PC9 output mode
GPIOC->OTYPER&=~GPIO_OTYPER_OT_9; //PC9 push-pull mode
CS_SET1; //CS=1 SPI отключен
//********************************************************************************
*********
//*Конфигурация SPI3
//********************************************************************************
*********
RCC->APB1ENR|=RCC_APB1ENR_SPI3EN; //Тактирование SPI3
SPI3->CR1|=SPI_CR1_BR_2
|SPI_CR1_BR_1
|SPI_CR1_BR_0 //Скорость Fpclk/256 84 МГц/256=328,125 кГц
|SPI_CR1_LSBFIRST //LSB передается вперед
|SPI_CR1_SSM //NSS управляется програмно
|SPI_CR1_SSI; //NSS=1
SPI3->CR2|=SPI_CR2_SSOE;
/*CPOL=0 (clock polarity) CK to 0 when idle; CPHA=0 (clock phase)
the first clock transition is the first data capture edge
DFF=0 (data frame format) 8-bit data format*/
SPI3->CR2|=SPI_CR2_TXEIE
|SPI_CR2_RXNEIE; //Прерывания по окончанию приема и передачи
NVIC_SetPriority(SPI3_IRQn, 3); //Прерывание SPI3 третье по приоритету
NVIC_EnableIRQ (SPI3_IRQn); //Разрешаем прерывния SPI3
SPI3->CR1|=SPI_CR1_MSTR; //SPI3 режим мастера
SPI3->CR1|=SPI_CR1_SPE; //Разрешаем работу SPI3
}
void SPI3_IRQHandler (void){
static int i;
if(SPI3->SR&SPI_SR_RXNE){
i=SPI3->DR;
}
if(SPI3->SR&SPI_SR_TXE){
i=1;
}
}
Для контроля окончания/начала приема/передачи использую прерывания - с этим и возникла проблема. Не совсем понятно почему флаг TXE все время установлен и соответственно я зацикливаюсь в прерывании SPI3_IRQHandler. Хотя я еще ничего не передавал. И совсем не понятно почему нельзя сбрасывать флаги RXNE/TXE.