Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sidy
Здравствуйте, уважаемые форумчане. Хочу использовать в проекте на 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.
nx6310
Флаг TXE можно сбросить только записав в SPI->DR байт. RXNE сбрасывается только при чтении байта из SPI->DR. Перед передачей надо разрешать прерывание и после последнего отправленного байта надо прерывание запрещать. Можно также использовать флаг TC.
nx6310
Флаг TXE можно сбросить только записав в SPI->DR байт. RXNE сбрасывается только при чтении байта из SPI->DR. Перед передачей надо разрешать прерывание и после последнего отправленного байта надо прерывание запрещать. Можно также использовать флаг TC.

Флаг TXE можно сбросить только записав в SPI->DR байт. RXNE сбрасывается только при чтении байта из SPI->DR. Перед передачей надо разрешать прерывание и после последнего отправленного байта надо прерывание запрещать. Можно также использовать флаг TC.
nx6310
Флаг TXE можно сбросить только записав в SPI->DR байт. RXNE сбрасывается только при чтении байта из SPI->DR. Перед передачей надо разрешать прерывание и после последнего отправленного байта надо прерывание запрещать. Можно также использовать флаг TC.
sidy
Цитата(nx6310 @ Dec 13 2012, 17:52) *
Можно также использовать флаг TC.

В SPI нет флага TC.
nx6310
Правильно.У spi флага ТС нету. Попутал с usart. Извиняюсь за дезинформацию.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.