реклама на сайте
подробности

 
 
> STM32F4, непонятное поведение SPI
sidy
сообщение Dec 13 2012, 12:17
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Здравствуйте, уважаемые форумчане. Хочу использовать в проекте на STM32F4 SPI3. Пин NSS использую не аппаратный а, программный. Ниже привожу кусок инициализации портов для SCK, MISO, MOSI и SPI3.
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.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01344 секунд с 7
ELECTRONIX ©2004-2016