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

 
 
> SPI на STM32F0
Влад Р.
сообщение Oct 2 2012, 16:49
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Всем доброго времени суток!

Пытаюсь настроить модуль SPI на STM32F0 для работы в режиме передачи мастером (полудуплекс): BIDIMODE=1 и BIDIOE=1. Данный режим в теории должен задействовать только один пин данных - MOSI. Также пытаюсь включить аппартное управление пином NSS для выбора единственного ведомого. В итоге нормальная передача не происходит, а пин NSS вообще в 1. Помогите разобраться где накосячил. Вот код функций:
Код
void SPI_Init(void)
{
  /* Включаем на выводах SPI - NSS, SCK и MOSI - режим альтернативной функции */
  GPIOA->MODER &= ~(GPIO_MODER_MODER4 | GPIO_MODER_MODER5 | GPIO_MODER_MODER7);
  GPIOA->MODER |= GPIO_MODER_MODER4_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER7_1;
  GPIOA->AFR[0] &= ~(GPIO_AFRL_AFRL4 | GPIO_AFRL_AFRL5 | GPIO_AFRL_AFRL7);

  /* Тактируем модуль SPI */
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
  
  /* Конфигурируем SPI */
  SPI1->CR1 |= SPI_CR1_BR;                                    // задаем частоту обмена
  SPI1->CR1 |= SPI_CR1_CPOL | SPI_CR1_CPHA;                   // задаем режим работы SPI (полярность и фазу)
  SPI1->CR1 |= SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE;             // задаем режим передачи
  SPI1->CR2 |= SPI_CR2_DS_0 | SPI_CR2_DS_1 | SPI_CR2_DS_2;    // задаем формат данных (разрядность)
  SPI1->CR1 &= ~SPI_CR1_LSBFIRST;                             // задаем способ передачи (формат фрейма)
  SPI1->CR1 &= ~SPI_CR1_SSM;                                  // задаем режим управления NSS (аппаратное или программное)
  SPI1->CR2 |= SPI_CR2_SSOE;                                  // задаем режим внешнего вывода NSS
  SPI1->CR1 |= SPI_CR1_MSTR;                                  // задаем режим работы модуля SPI (ведущий или ведомый)
  SPI1->CR1 |= SPI_CR1_SPE;                                   // включаем модуль SPI
}

void SPI_Transfer(uint8_t data)
{
  /* Помещаем данные на передачу */
  SPI1->DR = data;
  
  /* Ждем окончания передачи */
  while (!(SPI1->SR & SPI_SR_TXE));
  while (SPI1->SR & SPI_SR_BSY);
}


З.Ы. Само собой порт A предварительно тактирован.
Go to the top of the page
 
+Quote Post



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

 


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


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