Доброго времени суток!
Возникла следующая проблема: при работе с гироскопом L3GD20, установленным на плате не получается правильно считать по SPI значение ускорения. В ответ приходит одно и тоже число и не меняется ни при каких обстоятельствах. Причем данные с регистра WHO_AM_I считываются корректно, что свидетельствует о корректной настройке и работе SPI. Может быть у кого-то тоже возникала такая проблема или кто-то увидит косяк в программе. Код программы приведен ниже. Спасибо!
#include "stm32f30x.h"
uint8_t SendData(uint8_t);
uint8_t xAng[3];
int main(void)
{
RCC->AHBENR|=RCC_AHBENR_GPIOAEN|RCC_AHBENR_GPIOEEN;//включение тактирования портов А и Е
GPIOA->MODER|=GPIO_MODER_MODER4_1|GPIO_MODER_MODER5_1|GPIO_MODER_MODER6_1|GPIO_MODER_MODER7_1;//4,5,6,7 пины порта А на альтернативную функцию
GPIOA->AFR[0]|=(GPIO_AFRL_AFRL4 & ~0xA0000);//включаем
GPIOA->AFR[0]|=(GPIO_AFRL_AFRL5 & ~0xA00000);//5-ю
GPIOA->AFR[0]|=(GPIO_AFRL_AFRL6 & ~0xA000000);//альтернативную
GPIOA->AFR[0]|=(GPIO_AFRL_AFRL7 & ~0xA0000000);//функцию (SPI1)
GPIOA->OSPEEDR=0xffffffff;//включаем максимальную скорость порта А
GPIOE->MODER=0x55555555;//порт Е на выход (светодиоды и CS)
GPIOE->BSRR|=GPIO_BSRR_BS_3;//устанавливаем высокий уровень на CS
RCC->APB2ENR|=RCC_APB2ENR_SPI1EN;//включаем тактирование SPI1
SPI1->CR1|=SPI_CR1_BR_1;//предделитель скорости передачи 8
SPI1->CR1|=SPI_CR1_CPOL|SPI_CR1_CPHA;//настройки полярности и фронтов тактирующего сигнала SPI
SPI1->CR2|=SPI_CR2_DS_2|SPI_CR2_DS_1|SPI_CR2_DS_0;//размер пакета 8 бит
SPI1->CR1|=SPI_CR1_SSM|SPI_CR1_SSI;//программное управление NSS
SPI1->CR2|=SPI_CR2_FRXTH;//FIFO на 8 бит
SPI1->CR1|=SPI_CR1_MSTR;//режим ведущего
SPI1->CR1|=SPI_CR1_SPE;//включение SPI
GPIOE->BSRR|=GPIO_BSRR_BR_3;//устанавливаем низкий уровень на CS, разрешаем работу гироскопа
SendData(0x20);//обращаемся к регистру CTRL_REG1
SendData(0x0F);//Отправляем 0b00001111=0x0F, то есть включаем гироскоп
SendData(0x23);
SendData(0x30);
GPIOE->BSRR|=GPIO_BSRR_BS_3;//отключаем CS
while(1)
{
GPIOE->BSRR|=GPIO_BSRR_BR_3;//включаем передачу (CS)
SendData(0xE8); //отправляем адрес регистра OUT_X с запросом на чтение и инкремент адреса
xAng[0]=SendData(0x00);//считываем данные регистра OUT_X
xAng[1]=SendData(0x00);
GPIOE->BSRR|=GPIO_BSRR_BS_3;//выключаем передачу (CS)
for (unsigned int i=0; i<300000; i++);//делаем задержку
}
}
uint8_t SendData(uint8_t data)
{
while (!(SPI1->SR & SPI_SR_TXE));
SPI1->DR=(uint8_t)data;
while (!(SPI1->SR & SPI_SR_RXNE));
return *(__IO uint8_t *)((uint32_t)&(SPI1->DR));
}