Доброго времени суток.
Поковырялся с SPI2 с пинов PB12 - PB15.
Вот кусок программы поясняющий настройки:
CODE
RCC->AHB1ENR |= (1<<1); // port B clock enable
RCC->APB1ENR |= (1<<14); // enable clock SPI2
/* Set I/O mode for port B */
GPIOB->MODER = 0xAA555555; // port B OUT PB12 - PB15 how to alternative function
GPIOB->OSPEEDR = 0xAA555555; // 50 MHz for SPI2 25 MHz speed for others pins
GPIOB->PUPDR = 0x11000000; // pull-up PB12 and PB14
GPIOB->AFR[1] |= (0x5<<16); // PB12 how to alternative function AF5 how SPI2_NSS
GPIOB->AFR[1] |= (0x5<<20); // PB13 how to alternative function AF5 how SPI2_SCK
GPIOB->AFR[1] |= (0x5<<24); // PB14 how to alternative function AF5 how SPI2_MISO
GPIOB->AFR[1] |= (0x5<<28); // PB15 how to alternative function AF5 how SPI2_MOSI
/* SPI2 configuration set */
SPI2->CR1 |= (1<<9); // SPI2 software slave management enabled
SPI2->CR1 |= (1<<8); // SPI2 internal slave select
SPI2->CR1 |= (1<<4); // SPI2 speed 16 MHz/8
SPI2->CR1 |= (1<<2); // SPI2 master configuration
SPI2->CR1 |= (1<<6); // SPI2 On
/* Program for indication */
ind:
for(;((USART3->SR & 0x0020) == 0x0000)

// delay while receiving to ended
{
}
SPI2->DR = USART3->DR; // spi2 data output from j register
for(;((SPI2->SR & 0x02) == 0x00)

{
}
for(;((USART3->SR & 0x0080) == 0x0000)

// delay while transmiting to ended
{
}
// USART3->DR |= (SPI2->DR<<8); // usart3 data output from register spi2
USART3->DR = SPI2->DR; // usart3 data output from register spi2
Лишние куски программы убрал, чтобы не мешали. Смысл программы в следующем. Отправляю символ с компа по USART3 (2Mb) на плату, затем принятая комбинация отправляется на SPI2 (линии мисо и моси закорочены), затем из буфера SPI2 принятую комбинацию отправляю обратно по USART3. В принципе работает, ответ приходит, но на скоростях НИЖЕ 4 МГц при тактовой в 16 МГц странное явление наблюдается. А именно, ответ по USART3 приходит с задержкой на один байт... То есть отправил 0х30, приехало 0х00, отправляю 0х31, приехало 0х30, отправил 0х32, приехало 0х31 и т.д.
Опытным путём догадался сдвигать буфер SPI2 на 8 бит (как показано в закомменченой предпоследней строчке).
В буфере SPI2 принятая комбинация (вижу в отладчике) всегда записывается в младшие биты 0x0032. Но на низких скоростях почему-то по USART отправляется старшие биты буфера, которые потом сдвигаются отправляя следующую правильную комбинацию...
Причём вот такая комбинация на максимальной скорости 8 при 16 тактовой тоже работает:
Код
USART3->DR |= (SPI2->DR<<8); // usart3 data output from register spi2
// USART3->DR = SPI2->DR; // usart3 data output from register spi2
Экспериментально удостоверился, что от скорости USART-а не зависит...
В общем, такая странность...
Нашёл причину... Строчка
Код
for(;((SPI2->SR & 0x02) == 0x00);)
{
}
в которой проверял опустошение выходного буфера...
Попробовал проверить заполнение входного:
Код
for(;((SPI2->SR & 0x01) == 0x00);)
{
}
и всё заработало на разных скоростях...
Сообщение отредактировал IgorKossak - Nov 30 2012, 13:56
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!