STM32 SPI CMSIS зарегистрировать запись - PullRequest
0 голосов
/ 13 апреля 2020

Я использую SMT32F103C8 и хочу подключиться к MPU9250, у меня нет других SPI-устройств. Только MPU9250.

Я установил 72MHz для SMT32F103C8, вот мои функции инициализации и чтения / записи.

void    SPI_init()
{ 
     RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
     RCC->APB2ENR |= RCC_APB2ENR_SPI1EN | RCC_APB2ENR_IOPAEN;

     GPIOA->CRL &= ~(GPIO_CRL_CNF5 | GPIO_CRL_MODE5 |
                GPIO_CRL_CNF6 | GPIO_CRL_MODE6 |
                GPIO_CRL_CNF7 | GPIO_CRL_MODE7);

      // setup SCK PA5 pin, Mode(11b), Cnf(10b)
     GPIOA->CRL |= (GPIO_CRL_MODE5 | GPIO_CRL_CNF5_1);

     // setup MOSI PA7 pin, Mode(11b), Cnf(10b)
     GPIOA->CRL |= (GPIO_CRL_MODE7 | GPIO_CRL_CNF7_1);

     // setup MISO PA6 pin, Mode(00b), Cnf(01b)
     GPIOA->CRL |= GPIO_CRL_CNF6_0;

     // setup SS
     GPIOA->CRL   |=  GPIO_CRL_MODE4;
     GPIOA->CRL   &= ~GPIO_CRL_CNF4;

     SPI1->CR1     = 0x0000;
     SPI1->CR2     = 0x0000;

     // set SPI 8bit
     SPI1->CR1 &= ~SPI_CR1_DFF;

     // set MSB first
     SPI1->CR1 &= ~SPI_CR1_LSBFIRST;
     SPI1->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI;
     SPI1->CR1 |= SPI_CR1_BR_0| SPI_CR1_BR_2;
     SPI1->CR1 |= SPI_CR1_MSTR; 

     SPI1->CR1 |= SPI_CR1_CPHA;
     SPI1->CR1 |= SPI_CR1_CPOL;

     // enable SPI
     SPI1->CR1 |= SPI_CR1_SPE;
}


uint8_t SPI_ReadWrite8(const uint8_t &data)
{
     while(!(SPI1 -> SR & SPI_SR_TXE));

     *(volatile uint8_t *)&SPI1->DR = data;

     while (!(SPI1 -> SR & SPI_SR_RXNE));

     while(SPI1->SR & SPI_SR_BSY){}

     return *(volatile uint8_t *)&SPI1-> DR;
}

Так в чем моя проблема. Если я хочу прочитать какой-либо регистр, например, 0x75 (WHO_AM_I), то

ReadWrite8(0x1B|0x80);   // 0x80 means that 7th bit is 1 i.e Read mode for MPU9250.
data = ReadWrite8(0x00); // send dummy byte

дает мне значение 0x71, и все в порядке, НО, если я хочу записать в другой регистр, тогда чтение не за работой. Другими словами, ТОЛЬКО Чтение работает. Например:

// low
GPIOA->BSRR = GPIO_BSRR_BR4;

ReadWrite8(0x1B); // GYRSCOPE configure register
ReadWrite8(0x18); // set GYRO_FS_SEL bits

data = ReadWrite8(0x1B|0x80); // READ GYRSCOPE configure register
data = ReadWrite8(0x00);

// high
GPIOA->BSRR = GPIO_BSRR_BS4;

Я получаю 0x00. Пожалуйста, скажите мне, что я делаю не так.

...