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

 
 
> Прошу помощи в инициализации SPI2 в STM32F100, в STM32F100
allsettingsdone
сообщение May 29 2013, 20:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284



Суть проблемы в том что у меня не получается завести как в режиме мастера, так и в режиме слейва SPI2 на отладочной плате 32F100DISCOVERY.
Самое интересное то, что SPI1 я смог настроить и передавал/принимал данные через него, но при такой же инициализации SPI2 (с учетом того что он тактируется уже от APB1) я получаю полное молчание.
Пробовал и с программной реализацией NSS и с аппаратной - результата нет вообще. Я больше чем уверен в том что я чего то не учел и не прописал.
Вот код (а также прикреплен весь проект в Keil):
CODE
void init_spi2(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //включаем тактирование порта B
RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //включаем тактирование SPI2

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //выбераем режим - альтернативная функция с Push-Pull
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;//PB.13 - SCK, PB.14 - MISO, PB.15 - MOSI
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //выбераем режим - с открытым стоком
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; //PB.12 - NSS
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);



SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //режим - полный дуплекс
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //размер пакета - 8 бит
//===========================нулевой ражим работы SPI===========================
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //настройка нормального состояния на SCK (SCK опущена - когда ничего не передается/принимается)
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //передача/считывание происходит по переднему фронту на MOSI/MISO
//==============================================================================
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //управлять состоянием NSS програмно
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
//предделитель SCK = 32 (при 8 МГц, скорость SPI = 1/((8000000/32)/8)= 1 байт в 32 мкс)
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //первым отправляется старший бит
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //режим - master
SPI_Init(SPI2, &SPI_InitStructure); //функция инициализации SPI2 с заданной структурой

//SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE); //включаем прерывание по приему байта

SPI_Cmd(SPI2, ENABLE); //включаем модуль SPI2

//SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);

//NVIC_EnableIRQ(SPI2_IRQn); //разрешаем прерывания от SPI2
}


Сообщение отредактировал IgorKossak - May 30 2013, 07:23
Прикрепленные файлы
Прикрепленный файл  test7_nRF24L01_.rar ( 1.91 мегабайт ) Кол-во скачиваний: 18
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Genadi Zawidowsk...
сообщение May 29 2013, 20:57
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



А что в этот момент делает I2C? У STM32F10X есть бага, что не отключается один из сигналов SM BUS (даже при работе в I2C) - и он, возможно, и занят SPI? workaround - на время работы с SPI выключать I2C.
Go to the top of the page
 
+Quote Post
Mareng
сообщение May 30 2013, 00:59
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



проблема в RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE), правильно так RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
Go to the top of the page
 
+Quote Post
allsettingsdone
сообщение May 30 2013, 16:40
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284



Ура, всё работает. Спасибо ребята.
Go to the top of the page
 
+Quote Post
allsettingsdone
сообщение May 30 2013, 18:14
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284



А вот непонятность в случае если наш МК работает как Slave: и нам надо передать мастеру байт, сами мы не может начать обмен с мастером и ждем пока он опустит нашу NSS в ноль. И что дальше ? Для автоматической отправки ему нашего байта, его надо просто загрузить в "SPI1(или 2)->DR" и ждать? Правильно ли я думаю что для этого у нас должно быть настроено прерывание по приёму от мастера?

Сообщение отредактировал allsettingsdone - May 30 2013, 18:17
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 12:02
Рейтинг@Mail.ru


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