Stalker0393

Members
  • Публикации

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

  • Посещение

Репутация

1 Обычный

О Stalker0393

  • Звание
    Новенький
  • День рождения 09.03.1993

Информация

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

Электроника

  • Стаж в электронике
    3-5 лет
  1. Stm32F3Discovery Проблема Со Связью С Гироскопом По Spi

    Да читал. И делал на основе примера из интернета. Только там на 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. Ацп В Stm32F303

    Спасибо за совет! Но это скорее в академических целях - писать код и параллельно во всем разбираться.))) В будущем возможно посмотрю в сторону оптимизации процесса программирования.
  4. Ацп В Stm32F303

    Всё, я разобрался! Надо было еще тактовую частоту АЦП задать. RCC->CFGR2|=RCC_CFGR2_ADCPRE12_DIV2; Ну и так по мелочи еще ошибки были, но это главная причина.
  5. Ацп В Stm32F303

    Чтобы не ошибиться с переводом скину в виде картинок
  6. Ацп В Stm32F303

    Там по умолчанию стоит программный запуск как я понял.
  7. Ацп В Stm32F303

    залипает(
  8. Ацп В Stm32F303

    Дело в том, что на f100 у меня тоже все работает, но в 100 и 300 сериях АЦП немного отличаются как я понял. А по отладчику я смотрел - регистр данных нулю равен всегда.
  9. Ацп В Stm32F303

    Ничего не происходит. У меня такое чувство, что флаг окончания преобразования не выставляется, т е оно не заканчивается. Я по разному пытался сделать уже, но почему то ничего не происходит всё равно.
  10. Ацп В Stm32F303

    Доброго времени суток! Пытаюсь разобраться с АЦП в 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; } } Заранее спасибо!
  11. Спасибо! Ошибка по невнимательности.
  12. Доброго всем времени суток! Проблема заключается в следующем: работаю с 7-сегментным индикатором и при выводе зажигаются не все сегменты. Если зажигаю сегменты по одному или все вместе через регистр BSRR, то всё работает нормально. Если же пытаюсь вывести через регистр ODR, записав в него число, то ничего не выходит. Во всех цифрах зажигается только два сегмента. Что я мог сделать не так? Микроконтроллер STM32F303, плата STM32F3DISCOVERY. #include "stm32f30x.h" unsigned long int led[11]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111}; int j=0; int main(void) { RCC->AHBENR|=RCC_AHBENR_GPIOAEN; GPIOA->MODER=0x01010101010101010101010101010101; while(1) { GPIOA -> ODR = led[j]; for (unsigned int i=0; i<3000000; i++) {} // ждем j++; if (j>=10) {j=0;} } }
  13. Опознание Шаговых Двигателей

    Жек@ Спасибо! Буду пробовать.
  14. Доброго времени суток! Недавно перебирал свой хлам и нашел два шаговых двигателя (насколько помню из старых дисководов). К сожалению не удалось найти на них документацию. Так вот вопрос таков: можно ли каким либо образом определить их обмотки, тип и т.д. чтобы можно было пустить их в дело? Или может у кого то есть на них описание. Фото двигателей во вложении. Заранее спасибо!
  15. Осциллограф Омл-3М

    Спасибо большое! Буду смотреть, пробовать когда время будет. Нет, там не вилка, нормальный вход.