Самое интересное то, что 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
}
{
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
}