Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прошу помощи в инициализации SPI2 в STM32F100
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
allsettingsdone
Суть проблемы в том что у меня не получается завести как в режиме мастера, так и в режиме слейва 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
}
Genadi Zawidowski
А что в этот момент делает I2C? У STM32F10X есть бага, что не отключается один из сигналов SM BUS (даже при работе в I2C) - и он, возможно, и занят SPI? workaround - на время работы с SPI выключать I2C.
Mareng
проблема в RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE), правильно так RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
allsettingsdone
Ура, всё работает. Спасибо ребята.
allsettingsdone
А вот непонятность в случае если наш МК работает как Slave: и нам надо передать мастеру байт, сами мы не может начать обмен с мастером и ждем пока он опустит нашу NSS в ноль. И что дальше ? Для автоматической отправки ему нашего байта, его надо просто загрузить в "SPI1(или 2)->DR" и ждать? Правильно ли я думаю что для этого у нас должно быть настроено прерывание по приёму от мастера?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.