Перейти к содержанию

Stalker0393

Members
  • Постов

    33
  • Зарегистрирован

  • Посещение

Информация о Stalker0393

  • День рождения 09.03.1993

Информация

  • Пол
    Мужчина
  • Город
    Уфа

Электроника

  • Стаж в электронике
    3-5 лет

Достижения Stalker0393

Новобранец

Новобранец (2/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме
  • 10 лет  на форуме

Последние значки

1

Репутация

  1. Да читал. И делал на основе примера из интернета. Только там на SPL было сделано и вроде как пример тот работал.
  2. Доброго времени суток! Возникла следующая проблема: при работе с гироскопом 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)); }
×
×
  • Создать...