Перерыл интернет и даташит до тошноты.
Не пойму что не так:
CODE
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // Разрешить тактирование порта B.
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // Тактирование альтернативных функций GPIO.
//Настройки GPIO
GPIOB->CRH |= GPIO_CRH_MODE15_1; // Выход MOSI PB.15
GPIOB->CRH &= ~GPIO_CRH_MODE15_0; // 2MHz
GPIOB->CRH &= ~GPIO_CRH_CNF15; // Push-Pull
GPIOB->CRH &= ~GPIO_CRH_MODE14; // Вход MISO PB.14
GPIOB->CRH &= ~GPIO_CRH_CNF14_0; //
GPIOB->CRH |= GPIO_CRH_CNF14_1; // Pull-Up
GPIOB->ODR |= GPIO_ODR_ODR14; //
GPIOB->CRH |= GPIO_CRH_MODE13_1; // Выход SCK PB.13
GPIOB->CRH &= ~GPIO_CRH_MODE13_0; // 2MHz
GPIOB->CRH &= ~GPIO_CRH_CNF13; // Push-Pull
GPIOB->CRH &= ~GPIO_CRH_MODE12; // Вход NSS PB.12
GPIOB->CRH &= ~GPIO_CRH_CNF12_0; //
GPIOB->CRH |= GPIO_CRH_CNF12_1; // Pull-Up
GPIOB->ODR |= GPIO_ODR_ODR12;
//Настройки SPI2
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; //Разрешаем тактирование SPI2
SPI2->CR1 &= ~SPI_CR1_SPE; //Отключаем SPI перед изменением настроек
SPI2->CR1 |= SPI_CR1_BR_0; //Задаем скорость
SPI2->CR1 |= SPI_CR1_BR_1; //
SPI2->CR1 |= SPI_CR1_CPOL; //Задаем режим
SPI2->CR1 |= SPI_CR1_CPHA; //
SPI2->CR1 &= ~SPI_CR1_DFF; //Формат данных 8 бит
SPI2->CR1 &= ~SPI_CR1_CRCEN; //Запрет CRC
SPI2->CR1 &= ~SPI_CR1_CRCNEXT; //Отключение передачи CRC
SPI2->CR1 &= ~SPI_CR1_RXONLY; //и прочих не fullduplex настроек
SPI2->CR1 &= ~SPI_CR1_SSM; //на всякий случай..
SPI2->CR1 &= ~SPI_CR1_SSI; //
SPI2->CR1 &= ~SPI_CR1_LSBFIRST; //MSB вперед
SPI2->CR1 |= SPI_CR1_MSTR; //В режиме Мастер
SPI2->CR1 &= ~SPI_CR1_BIDIMODE;//
SPI2->CR1 &= ~SPI_CR1_BIDIOE; //
SPI2->CR2 &= ~SPI_CR2_SSOE; // Запретить выход SS
// (на входе задан высокий уровень)
SPI2->CR1 |= SPI_CR1_SPE; // Включаем SPI
.....
//Пробная прием-передача
u8 temp;
while (SPI2->SR & SPI_SR_BSY);
while (!(SPI2->SR & SPI_SR_TXE));
SPI2->DR = 0x55; // Передача данных
while (SPI2->SR & SPI_SR_BSY);
while (!(SPI2->SR & SPI_SR_RXNE));
temp = SPI2->DR; // Чтение принятых данных
.......
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // Тактирование альтернативных функций GPIO.
//Настройки GPIO
GPIOB->CRH |= GPIO_CRH_MODE15_1; // Выход MOSI PB.15
GPIOB->CRH &= ~GPIO_CRH_MODE15_0; // 2MHz
GPIOB->CRH &= ~GPIO_CRH_CNF15; // Push-Pull
GPIOB->CRH &= ~GPIO_CRH_MODE14; // Вход MISO PB.14
GPIOB->CRH &= ~GPIO_CRH_CNF14_0; //
GPIOB->CRH |= GPIO_CRH_CNF14_1; // Pull-Up
GPIOB->ODR |= GPIO_ODR_ODR14; //
GPIOB->CRH |= GPIO_CRH_MODE13_1; // Выход SCK PB.13
GPIOB->CRH &= ~GPIO_CRH_MODE13_0; // 2MHz
GPIOB->CRH &= ~GPIO_CRH_CNF13; // Push-Pull
GPIOB->CRH &= ~GPIO_CRH_MODE12; // Вход NSS PB.12
GPIOB->CRH &= ~GPIO_CRH_CNF12_0; //
GPIOB->CRH |= GPIO_CRH_CNF12_1; // Pull-Up
GPIOB->ODR |= GPIO_ODR_ODR12;
//Настройки SPI2
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; //Разрешаем тактирование SPI2
SPI2->CR1 &= ~SPI_CR1_SPE; //Отключаем SPI перед изменением настроек
SPI2->CR1 |= SPI_CR1_BR_0; //Задаем скорость
SPI2->CR1 |= SPI_CR1_BR_1; //
SPI2->CR1 |= SPI_CR1_CPOL; //Задаем режим
SPI2->CR1 |= SPI_CR1_CPHA; //
SPI2->CR1 &= ~SPI_CR1_DFF; //Формат данных 8 бит
SPI2->CR1 &= ~SPI_CR1_CRCEN; //Запрет CRC
SPI2->CR1 &= ~SPI_CR1_CRCNEXT; //Отключение передачи CRC
SPI2->CR1 &= ~SPI_CR1_RXONLY; //и прочих не fullduplex настроек
SPI2->CR1 &= ~SPI_CR1_SSM; //на всякий случай..
SPI2->CR1 &= ~SPI_CR1_SSI; //
SPI2->CR1 &= ~SPI_CR1_LSBFIRST; //MSB вперед
SPI2->CR1 |= SPI_CR1_MSTR; //В режиме Мастер
SPI2->CR1 &= ~SPI_CR1_BIDIMODE;//
SPI2->CR1 &= ~SPI_CR1_BIDIOE; //
SPI2->CR2 &= ~SPI_CR2_SSOE; // Запретить выход SS
// (на входе задан высокий уровень)
SPI2->CR1 |= SPI_CR1_SPE; // Включаем SPI
.....
//Пробная прием-передача
u8 temp;
while (SPI2->SR & SPI_SR_BSY);
while (!(SPI2->SR & SPI_SR_TXE));
SPI2->DR = 0x55; // Передача данных
while (SPI2->SR & SPI_SR_BSY);
while (!(SPI2->SR & SPI_SR_RXNE));
temp = SPI2->DR; // Чтение принятых данных
.......
При отладке видно, что все настройки устанавливаются как прописано в коде,
а в регистр DR данные 0x55 так и не записывается. На ногах процессора молчок.
Тоже самое делал и для SPI1 с учетом бита альтернативной распиновки.
Наверное, если взять библиотеку с функциями инициализации все бы заработало,
но хочу вот так через "stm32f10x.h".
Помогите пожалуйста разобраться.