Доброго времени
Пытаюсь настроить сабж:
Код
// 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 дергается для каждой посылки корректно