Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F0 и SPI
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
toweroff
Доброго времени

Пытаюсь настроить сабж:
Код
    // Configure SPI2 pins
    
    // Enable PORTB and PORTA clock
    RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
    // Configure pins
    GPIOB->MODER &= ~(GPIO_MODER_MODER12 | GPIO_MODER_MODER13 | GPIO_MODER_MODER14 | GPIO_MODER_MODER15); // Clear to default function pins
    // Set alternate function pins mode
    GPIOB->MODER |= GPIO_MODER_MODER12_1 | GPIO_MODER_MODER13_1 | GPIO_MODER_MODER14_1 | GPIO_MODER_MODER15_1;
    
    // Set port speed to HIGH
    GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR12 | GPIO_OSPEEDR_OSPEEDR13 | GPIO_OSPEEDR_OSPEEDR14 | GPIO_OSPEEDR_OSPEEDR15;
    
    // Set pulldown for SCK and none for other
    GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPDR12 | GPIO_PUPDR_PUPDR13 | GPIO_PUPDR_PUPDR14 | GPIO_PUPDR_PUPDR15);
    
    GPIOB->PUPDR |= GPIO_PUPDR_PUPDR13_1;
    
    // Set alternate functions to pins
    GPIOB->AFR[1] &= ~(GPIO_AFRH_AFR12 | GPIO_AFRH_AFR13 | GPIO_AFRH_AFR14 | GPIO_AFRH_AFR14); // Clear to default (SPI2_NSS, SPI2_SCK, SPI2_MISO, SPI2_MOSI
    GPIOB->AFR[1] |= (GPIO_AFRH_AFR12_(0) | GPIO_AFRH_AFR13_(0) | GPIO_AFRH_AFR14_(0) | GPIO_AFRH_AFR15_(0)); // Set to AltFunc 0 (SPI2_NSS, SPI2_SCK, SPI2_MISO, SPI2_MOSI

    SPI2->CR1 = SPI_CR1_BR_0 | SPI_CR1_BR_1; // FPCLK/16, CPOL=0, CPHA=0
    SPI2->CR2 = SPI_CR2_DS_0| SPI_CR2_DS_1 | SPI_CR2_DS_2 | SPI_CR2_NSSP; // 8 bits, NSS enabled
    SPI2->I2SCFGR = 0UL; // SPI selected, I2S disabled
    SPI2->CR1 |= SPI_CR1_SPE; // SPI enable


и отправляю в цикле вот такой функцией:
Код
void spi_update(uint8_t data)
{
    while(SPI2->SR & SPI_SR_BSY);
    SPI2->DR = data;
    while(SPI2->SR & SPI_SR_BSY);
    while (!(SPI2->SR & SPI_SR_RXNE));
    spi_in = SPI2->DR;
}


отправляю байт с одной единичкой. В результате - посылка из необходимых 8 бит состоит из 2х - 8+8 бит. Между ними - промежуток в 5 длин положительного клока, потом опять две посылки и т.д.
В первой посылке - моя единичка, во второй - нули
Что за фигня? NSS дергается для каждой посылки корректно
adnega
Цитата(toweroff @ Sep 2 2015, 22:03) *
Что за фигня?

Попробуйте типа
Код
*((unsigned char *)&SPI2->DR) = data;

В регистр SPIx->DR нужно писать/читать байтами, если число бит в посылке <=8 и полусловами, если больше.
toweroff
Цитата(adnega @ Sep 2 2015, 22:55) *
Попробуйте типа
Код
*((unsigned char *)&SPI2->DR) = data;

В регистр SPIx->DR нужно писать/читать байтами, если число бит в посылке <=8 и полусловами, если больше.

да, это нашел

также замыленный глаз упустил 2 важные вещи - бит мастера (SPI_CR1_MSTR) и бит наличия данных в очереди на четверть длины - 8 бит (SPI_CR2_FRXTH)

с последним еще как-то можно было упустить, но вот мастера не включить... точно уже спать пора sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.