Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103 SPI1. осцильником не видно нечего.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
123kill12
использую простой код.
Код
void SPI_init(void)
{
  // Òàêòèðîâàíèå àëüòåðíàòèâíûõ ôóíêöèé GPIO.
  RCC->APB2ENR  |= RCC_APB2ENR_AFIOEN;
  //âêëþ÷åíèå òàêòèðîâàíèÿ SPI1
  RCC->APB2ENR  |= RCC_APB2ENR_SPI1EN;
  
  //íàñòðîéêà âûâîäîâ
  //NSS -PA4  -out
  GPIOB->CRL |=GPIO_CRL_MODE4;//áûò ÿâëÿåòñÿ âûõîäíûì ñ ÷àñòîòîé ïåðåêëþ÷åíèÿ 50 MHz
  GPIOB->CRL &=~GPIO_CRL_CNF4;
  GPIOB->CRL |=GPIO_CRL_CNF4_1;
  //CLK -PA5  -out
  GPIOB->CRL |=GPIO_CRL_MODE5;//áûò ÿâëÿåòñÿ âûõîäíûì ñ ÷àñòîòîé ïåðåêëþ÷åíèÿ 50 MHz
  GPIOB->CRL &=~GPIO_CRL_CNF5;
  GPIOB->CRL |=GPIO_CRL_CNF5_1;
  //MISO -PA6 -in
  GPIOB->CRL &=~GPIO_CRL_MODE6;
  GPIOB->CRL &=~GPIO_CRL_CNF6;
  GPIOB->CRL |=GPIO_CRL_CNF6_1;
  //MOSI -PA7 -out
  GPIOB->CRL |=GPIO_CRL_MODE7;//áûò ÿâëÿåòñÿ âûõîäíûì ñ ÷àñòîòîé ïåðåêëþ÷åíèÿ 50 MHz
  GPIOB->CRL &=~GPIO_CRL_CNF7;
  GPIOB->CRL |=GPIO_CRL_CNF7_1;
  
  //íàñòðàèâàåì àëüòåíðíàòèâíûå ôóíêöèè ââîäîâ
  AFIO->MAPR &=~AFIO_MAPR_SPI1_REMAP;
  
  //buard detect
  SPI1->CR1&=~SPI_CR1_BR_0;
  SPI1->CR1&=~SPI_CR1_BR_1;
  SPI1->CR1&=~SPI_CR1_BR_2;
  //CHOL=1
  SPI1->CR1|=SPI_CR1_CPOL;
  //CPHA=1  
  SPI1->CR1|=SPI_CR1_CPHA;
  //DFF
  SPI1->CR1&=~SPI_CR1_DFF;
  //íàïðàâëåíèå ñäâèãà
  SPI1->CR1&=~SPI_CR1_LSBFIRST;
  //óïðàâëåíèå íîãîé NSS
  SPI1->CR1&=~SPI_CR1_SSM;
  SPI1->CR2|=SPI_CR2_SSOE;
  //âèä óñòðîéñòâà ìàñòåð
  SPI1->CR1|=SPI_CR1_MSTR;
  
  //ðàçðåøàåì ïðåðûâàíèÿ ïî ïðèåìó è ïåðåäà÷è
  //SPI1->CR2|=SPI_CR2_TXEIE;
  //SPI1->CR2|=SPI_CR2_RXNEIE;
  
  //NVIC->ISER[1] |= ena_SPI1; // Ðàçðåøèòü ïðåðûâàíèå SPI1_IRQn â NVIC.  
  //çàïóñê SPI
  SPI1->CR1|=SPI_CR1_SPE;
}


Код
void main(void)
{  
   //èíèöèëèçàöèÿ ÷àñòîòû ðàáîòû
   SystemInit();
   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
   RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
   RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

   SPI_init();
   SPI1->DR=0x45;
   while(1)
   {
     tmp=SPI1->SR;
     if((tmp&0x80) == SPI_SR_BSY)
     {
        tmp=SPI1->SR;
     }
     else
     {
        //++++++++++
        tmp=SPI1->DR;
        tmp=SPI1->SR;
        //++++++++++
        SPI1->DR=0x45;
        tmp=SPI1->SR;
     }
   }


статусный регистр меняется правильно. когда я передаю. в нем стоит 0х80. мониторю флаг BSY. если его нет то считываю статусный регистр. где уже 0x03. вижу что новые данные пришли. хотя я нечего и не принимаю. он так работает. если из регистра выталкивается то что то в него заталкивается. (странно то что при приеме получаю FE). снова смотрю статус там уже 0х02. записываю новые данные и в статусном снова 0х80.

но осцильником хочу посмотреть частоту и нечего(((( смотрел и другие пины. там тоже пусто.
AHTOXA
Попробуйте такой порядок:
  • включить тактирование GPIO и AFIO;
  • включить ремап;
  • включить тактирование SPI;
  • сконфигурировать ноги;
  • сконфигурировать SPI;

В принципе порядок не обязательно именно такой, главное -- сначала включить ремап, а уже потом тактирование модуля SPI.
123kill12
да. с порядком у меня все норм. вначале подумал что частоту слишком высокую зарубил. при питании ядра 72 я поставил делитель всего на 2(buard detect - 000). поставил делитель на 8(buard detect - 010) все равно такая хрень. на пинах нечего нет. а флаги меняются и он говорит что передает((((. кто знает что все таки может быть не так?
123kill12
все ошибку нашел))))) перепутал GPIOB и GPIOA
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.