Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4Discovery
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vladislav_Minsk
Доброго времени суток.
Поковырялся с 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);)
    {
    }
и всё заработало на разных скоростях...
scifi
Вот тут коллега хотел разогнать UART и обнаружил, что предел скорости наступает раньше, чем он думал. У вас точно не нарушается это ограничение?
Vladislav_Minsk
Ограничение скорости обнаружил в преобразователе (FT232BL)3 Mb/с... Но причина была не в этом... Флаг освобождения буфера передатчика срабатывает не так как у приёмника, это я увидел в осциллограммах в документе на контроллер... Поэтому определился и использую скорость 2 Mb/с. Работает исправно, без ошибок...)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.