Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

STM32F103 SPI2 Problemi

Başlatan baran123, 28 Temmuz 2018, 22:58:34

baran123

Hayırlı akşamlar,
Saatlerdir uğraşıyorum fakat STM32F103C8T6 için SPI2 çalıştıramadım.
Pini çıkış yapıp led falanda yaktım sorun ama SPI bir türlü veri basmıyor.
Osilaskop ve Logic analyzer ile canlı izliyorum fakat hiç bir değişiklik yok.
Hat sürekli olarak Logic 1 de kalıyor(SCK ve MOSI)
İnternetteki örnekleride denedim ama nafile.
Kodlar aşağıda konfigurasyonu incelerseniz sevinirim.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
	
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);

SPI_InitTypeDef		SPI_InitStructure;
	
SPI_Cmd(SPI2, DISABLE);
SPI_InitStructure.SPI_Direction 				= SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode 					= SPI_Mode_Master;
SPI_InitStructure.SPI_FirstBit 					= SPI_FirstBit_MSB;
SPI_InitStructure.SPI_DataSize 					= SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL 					= SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA 					= SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS 					= SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler                         = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_CRCPolynomial 		                = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);

void SPI_Write(SPI_TypeDef* SPIx, uint8_t data)
{
	while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
	
	SPIx->DR = (uint16_t)data;
}

// 100mS de bir aşağıdaki kodu çağırıyorum.
SPI_Write(SPI2, 0xA0);

baran123

Sorunu yakaladım fakat çözemedim.
TIM1 kullanarak PWM çıkartıyorum Bu PWM'ler A8,A9,A10,A11 den çıkıyor. Bunların Complement kanalları aktif değil.

Neden sorun çıkardığını anlamadım.
TIM1 ayarlarım şu şekilde
/** TIM1 PWM Pins **/
	GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
	TIM_OCInitTypeDef          TIM_OCInitStructure;
	TIM_BDTRInitTypeDef        TIM_BDTRInitStructure;

	TIM_DeInit(TIM1);

	TIM_TimeBaseStructure.TIM_Prescaler           = 100;
	TIM_TimeBaseStructure.TIM_CounterMode         = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_Period              = PWM_PERIOD;
	TIM_TimeBaseStructure.TIM_ClockDivision       = 0;
	TIM_TimeBaseStructure.TIM_RepetitionCounter   = 0;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

	/**
	*   PWM Channel 1 Configuration
	*
	*/
	TIM_OCInitStructure.TIM_OCMode        = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState   = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OutputNState  = TIM_OutputNState_Disable;
	TIM_OCInitStructure.TIM_Pulse         = PWM_PERIOD / 2;
	TIM_OCInitStructure.TIM_OCPolarity    = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OCNPolarity   = TIM_OCNPolarity_Low;
	TIM_OCInitStructure.TIM_OCIdleState   = TIM_OCIdleState_Set;
	TIM_OCInitStructure.TIM_OCNIdleState  = TIM_OCIdleState_Reset;
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);

	/**
	*   PWM Channel 2 Configuration
	*
	*/
	TIM_OCInitStructure.TIM_OCMode        = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState   = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OutputNState  = TIM_OutputNState_Disable;
	TIM_OCInitStructure.TIM_Pulse         = PWM_PERIOD / 2;
	TIM_OCInitStructure.TIM_OCPolarity    = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OCNPolarity   = TIM_OCNPolarity_Low;
	TIM_OCInitStructure.TIM_OCIdleState   = TIM_OCIdleState_Set;
	TIM_OCInitStructure.TIM_OCNIdleState  = TIM_OCIdleState_Reset;
	TIM_OC2Init(TIM1, &TIM_OCInitStructure);
	
	/**
	*   PWM Channel 3 Configuration
	*
	*/
	TIM_OCInitStructure.TIM_OCMode        = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState   = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OutputNState  = TIM_OutputNState_Disable;
	TIM_OCInitStructure.TIM_Pulse         = PWM_PERIOD / 2;
	TIM_OCInitStructure.TIM_OCPolarity    = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OCNPolarity   = TIM_OCNPolarity_Low;
	TIM_OCInitStructure.TIM_OCIdleState   = TIM_OCIdleState_Set;
	TIM_OCInitStructure.TIM_OCNIdleState  = TIM_OCIdleState_Reset;
	TIM_OC3Init(TIM1, &TIM_OCInitStructure);

	/**
	*   PWM Channel 4 Configuration
	*
	*/
	TIM_OCInitStructure.TIM_OCMode        = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState   = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OutputNState  = TIM_OutputNState_Disable;
	TIM_OCInitStructure.TIM_Pulse         = PWM_PERIOD / 2;
	TIM_OCInitStructure.TIM_OCPolarity    = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OCNPolarity   = TIM_OCNPolarity_Low;
	TIM_OCInitStructure.TIM_OCIdleState   = TIM_OCIdleState_Set;
	TIM_OCInitStructure.TIM_OCNIdleState  = TIM_OCIdleState_Reset;
	TIM_OC4Init(TIM1, &TIM_OCInitStructure);

	/**
	*   Dead Time Configuration
	*
	*/
	TIM_BDTRInitStructure.TIM_OSSRState       = TIM_OSSRState_Enable;
	TIM_BDTRInitStructure.TIM_OSSIState       = TIM_OSSIState_Enable;
	TIM_BDTRInitStructure.TIM_LOCKLevel       = TIM_LOCKLevel_1;
	TIM_BDTRInitStructure.TIM_DeadTime        = 0x05;
	TIM_BDTRInitStructure.TIM_Break           = TIM_Break_Disable;
	TIM_BDTRInitStructure.TIM_BreakPolarity   = TIM_BreakPolarity_High;
	TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
	TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

	TIM_Cmd(TIM1, ENABLE);
	TIM_CtrlPWMOutputs(TIM1, ENABLE);

Elektroemre


baran123

Problem Solved :)
Remap lazımmış.

GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);