Здравствуйте. Пытаюсь связать LIS3DH и STM32F100 по SPI. Использую Software режим, fullduplex. Проблема в том, что на выходе SCK нет такта - все время висит высокий или низкий уровень в зависимости от CPOL. Не выставляются флаги Busy и RXNE, не сбрасывается флаг TXE. Ниже приведен код, проект собран в Keil. Проект испытывал на собранной плате, на STM32F0 DISCOVERY. Также пробовал загружать пример от STM на плату STM32F4 (MEMS акселерометр). Везде одна и та же проблема - SPI мертв. Видимо упускаю что-то системное, что то общее для всех 3х плат, но у меня уже нет идей, что это может быть. Прошу помощи.
#include "stm32f10x.h" #include "stm32f10x_spi.h"
void init(); void spi();
void main() { init(); while(1) { spi();
} }
void init() {
RCC->APB2ENR^=(1<<0 | 1<<2 | 1<<3 | 1<<5 | 1<<12 ); // spi1, GPIO clock enable GPIOA->CRL&=0x000000ff; // port A config to spi GPIOA->CRL^=0xb4b34b00;
SPI1->CR1=(1<<0|1<<1|1<<5|1<<8|1<<9); // spi config }
void spi() { unsigned char ax=0; unsigned char ay=0; unsigned char az=0; unsigned char temp; temp=0xE8; SPI1->CR1^=(1<<2|1<<6); // SPI enable
while (!(SPI1->SR & SPI_SR_TXE)); // if tx empty then transfer SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); ax= SPI1->DR; SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); // wait before reiceve ends ay = SPI1->DR; SPI1->DR = temp; while (!(SPI1->SR & SPI_SR_RXNE)); // wait before reiceve ends az= SPI1->DR; SPI1->CR1^=(1<<6); // SPI disable }
|