Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: baran123 - 28 Temmuz 2018, 22:58:34

Başlık: STM32F103 SPI2 Problemi
Gönderen: baran123 - 28 Temmuz 2018, 22:58:34
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);
Başlık: Ynt: STM32F103 SPI2 Problemi
Gönderen: baran123 - 28 Temmuz 2018, 23:19:56
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);
Başlık: Ynt: STM32F103 SPI2 Problemi
Gönderen: Elektroemre - 29 Temmuz 2018, 00:06:37
-
Başlık: Ynt: STM32F103 SPI2 Problemi
Gönderen: baran123 - 01 Ağustos 2018, 00:16:19
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);