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

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)); }
  3. Спасибо за совет! Но это скорее в академических целях - писать код и параллельно во всем разбираться.))) В будущем возможно посмотрю в сторону оптимизации процесса программирования.
  4. Всё, я разобрался! Надо было еще тактовую частоту АЦП задать. RCC->CFGR2|=RCC_CFGR2_ADCPRE12_DIV2; Ну и так по мелочи еще ошибки были, но это главная причина.
  5. Чтобы не ошибиться с переводом скину в виде картинок
  6. Там по умолчанию стоит программный запуск как я понял.
  7. Дело в том, что на f100 у меня тоже все работает, но в 100 и 300 сериях АЦП немного отличаются как я понял. А по отладчику я смотрел - регистр данных нулю равен всегда.
  8. Ничего не происходит. У меня такое чувство, что флаг окончания преобразования не выставляется, т е оно не заканчивается. Я по разному пытался сделать уже, но почему то ничего не происходит всё равно.
  9. Доброго времени суток! Пытаюсь разобраться с АЦП в STM32f3Discovery. Цель - просто запустить самое простое преобразование и с помощью АЦП регулировать частоту поочередного мигания двух светодиодов. Уже несколько дней пытаюсь, ничего не выходит. Вроде всё по даташиту делаю. Смотрел различные примеры в интернете и пытался сделать подобно, но тоже не работает. Ниже привожу код программы. Может я что-то еще забыл сделать? #include "stm32f30x.h" uint32_t adc_res; int main(void) { RCC->AHBENR|=RCC_AHBENR_GPIOAEN|RCC_AHBENR_GPIOEEN;//включение тактирования портов А и Е RCC->AHBENR|=RCC_AHBENR_ADC12EN;//включение тактирования АЦП 1 и 2 GPIOE->MODER=0x55555555;//порт Е на выход, там светодиоды GPIOA->MODER|=GPIO_MODER_MODER0_0;GPIO_MODER_MODER0_1;//РА0 в аналоговый режим, это первый канал АЦП1 ADC1->JSQR|=ADC_JSQR_JSQ1_1;//задаем первый канал в первом преобразовании. По умолчанию в этом регистре задано одно преобразование в последовательности. ADC1->CR|=ADC_CR_ADEN;//включаем АЦП ADC1->CR|=ADC_CR_JADSTART;//Запускаем инжектированную последовательность while(1) { while (!(ADC1->ISR & ADC_ISR_JEOC));//ждем флаг конца преобразования ADC1->ISR|=ADC_ISR_JEOC;//сбрасываем флаг конца преобразования ADC1->ISR|=ADC_ISR_JEOS;//сбрасываем флаг конца выборки adc_res=ADC1->JDR1;//считываем данные GPIOE->BSRR|=GPIO_BSRR_BS_15; GPIOE->BSRR|=GPIO_BSRR_BR_10; for (int i=0;i<=(adc_res*1000);i++);//делаем задержку в зависимости от полученных данных while (!(ADC1->ISR & ADC_ISR_JEOC));//далее аналогично меняем сведодиоды ADC1->ISR|=ADC_ISR_JEOC; ADC1->ISR|=ADC_ISR_JEOS; adc_res=ADC1->JDR1; for (int i=0;i<=(adc_res*1000);i++); GPIOE->BSRR|=GPIO_BSRR_BS_10; GPIOE->BSRR|=GPIO_BSRR_BR_15; } } Заранее спасибо!
×
×
  • Создать...