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

 
 
> STM32F4Discovery, SPI2 (PB12 - PB15) Необъяснимое явление
Vladislav_Minsk
сообщение Nov 30 2012, 12:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 7-08-12
Пользователь №: 73 054



Доброго времени суток.
Поковырялся с 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)wink.gif // delay while receiving to ended
{
}
SPI2->DR = USART3->DR; // spi2 data output from j register
for(;((SPI2->SR & 0x02) == 0x00)wink.gif
{
}
for(;((USART3->SR & 0x0080) == 0x0000)wink.gif // 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] - для короткого!!!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:22
Рейтинг@Mail.ru


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