Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
KommoZovr
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 5
1

STM32F051C6 i2c и spi работают только в режиме отладки

26.09.2014, 17:34. Просмотров 4746. Ответов 2
Метки нет (Все метки)



Делаю один проект на stm32f051c6, МК собирает данные с АЦП по SPI и по запросу мастера I2C сливает ему 32 байта через DMA. Возникла проблема, что когда идёт отладка в Keil Run mode, то всё работает как надо, данные читаются, мастер что надо получает и отправляет, но стоит отключить отключить отладку и сбросить контроллер, так всё отказывается работать, SPI не читает ничего, y2s отдаёт только первые 32 байта и больше не отвечает, всё остальное при этом работает, GPIO и EXT INT. Boot0 сидит на земле. Кто сталкивался с такой проблемой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2014, 17:34
Ответы с готовыми решениями:

STM32 - программа выполняется только в режиме отладки
Честное слово, я внимательно искал такую тему, не нашел :) Собрал свою плату...

Stm8 программа верно ведет себя только в режиме отладки
День добрый объясните пожалуйста что я делаю не так и почему программа в...

Почему не работает виртуальный компорт в режиме отладки, а в нормальном режиме работет
Процессор stm32f205. Подключаю плату (собственной разработки) к компу,...

MSSP и I2C+SPI на одной шине
День добрый Скажите, есть ли вообще способ на одном MSSP одновременно...

Модуль USCI в режиме I2C?
Уважаемые мастера MSP кто писал протоколы по шине I2C? В описание (перевод...

2
KommoZovr
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 5
27.09.2014, 20:03 2
Что самое интересное SPI то работает, данные передаются туда сюда, только без отладки не происходит их чтения
похожая фигня и с I2C

Код инициализации периферии

Код
void Confikure_System(void)
{
/* Clock Initiotyzotion */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
RCC->AHBENR |= RCC_AHBENR_GPIOCEN;

RCC->APB2ENR|= RCC_APB2ENR_SYSCFGEN;
RCC->APB1ENR|= RCC_APB1ENR_TIM3EN;
RCC->APB1ENR|= RCC_APB1ENR_I2C1EN;
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
RCC->APB2ENR|= RCC_APB2ENR_SPI1EN;

ConfikureExternalIT();
Confikure_Control_GPIO();
Confikure_DMA_I2C1();
ConfikureDAC();
SysTick_Config(8000);  // 1mS delay
Confikure_I2C1_Slave();
Confikure_SPI1();
}

void Confikure_Control_GPIO(void)
{
// PA0,1,2,3,5  CHANNEL ENABLE
// PC13  BYPASS

/********* Bypass control ************/

GPIOC->MODER |=    (GPIO_MODER_MODER13_0) ;
GPIOC->OTYPER &= ~(GPIO_OTYPER_OT_13) ;
GPIOC->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR13);

/******** Switch control ************/

GPIOA->MODER |= (GPIO_MODER_MODER0_0|GPIO_MODER_MODER1_0|GPIO_MODER_MODER2_0|GPIO_MODER_MODER3_0|GPIO_MODER_MODER5_0) ;
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_0|GPIO_OTYPER_OT_1|GPIO_OTYPER_OT_2|GPIO_OTYPER_OT_3|GPIO_OTYPER_OT_5) ;
GPIOA->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0|GPIO_OSPEEDER_OSPEEDR1|GPIO_OSPEEDER_OSPEEDR2|GPIO_OSPEEDER_OSPEEDR3|GPIO_OSPEEDER_OSPEEDR5);
GPIOB->MODER &=~GPIO_MODER_MODER10|GPIO_MODER_MODER11|GPIO_MODER_MODER12|GPIO_MODER_MODER13;
}

void Confikure_GPIO_I2C1(void)
{
/* Timer */

TIM3->PSC = 8000 - 1;
TIM3->CNT = 0;
TIM3->CR1 &=~ TIM_CR1_CEN;
/* temporary allocation */

GPIOB->OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7;
GPIOB->AFR[0] = (GPIOB->AFR[0] & ~(GPIO_AFRL_AFRL6 | GPIO_AFRL_AFRL7)) | (1 << ( 6 * 4 )) | (1 << (7 * 4));
GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER6 | GPIO_MODER_MODER7)) | (GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1);
}

/* I2C CONF SLAVE MODE  */
void Confikure_I2C1_Slave(void)
{
uint8_t address;
Confikure_GPIO_I2C1();
/* (1) */
RCC->CFGR3 |= RCC_CFGR3_I2C1SW; /* (2) */
address=Read_y2s_address();
I2C1->TIMINGR = (uint32_t)0x00000020; /* (3) */
I2C1->CR1 = I2C_CR1_PE | I2C_CR1_RXDMAEN | I2C_CR1_TXDMAEN | I2C_CR1_ADDRIE |I2C_CR1_NOSTRETCH; /* (3) */
I2C1->OAR1 |= (uint32_t)(address << 1); /* (5) */
I2C1->OAR1 |= I2C_OAR1_OA1EN; /* (6) */

//I2C1->TXDR=0;

NVIC_SetPriority(I2C1_IRQn, 0); /* (7) */
NVIC_EnableIRQ(I2C1_IRQn); /* (8) */
}

/*  DMA I2C CONF */
void Confikure_DMA_I2C1(void)
{
/* Enable the peripheral clock DMA1 */

DMA1_Channel2->CPOR = (uint32_t)&(I2C1->TXDR);
DMA1_Channel2->CMAR = (uint32_t)buffer_out;
DMA1_Channel2->CNDTR = 32;
DMA1_Channel2->CCR |= DMA_CCR_DIR|DMA_CCR_MINC |DMA_CCR_CIRC| DMA_CCR_TCIE | DMA_CCR_EN;

DMA1_Channel3->CPOR = (uint32_t)&(I2C1->RXDR);
DMA1_Channel3->CMAR = (uint32_t)buffer_in;
DMA1_Channel3->CNDTR = 32;//33;
DMA1_Channel3->CCR |= DMA_CCR_MINC |DMA_CCR_CIRC| DMA_CCR_TCIE | DMA_CCR_EN;
DMA1_Channel3->CCR &= ~DMA_CCR_DIR;

NVIC_SetPriority(DMA1_Channel2_3_IRQn, 1);
NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
}

void  ConfikureGPIOasAnalog(void)
{
/* (1) */
GPIOA->MODER |= GPIO_MODER_MODER4; /* (2) */
}

/* DAC CONF */
void  ConfikureDAC(void)
{
ConfikureGPIOasAnalog();
RCC->APB1ENR |= RCC_APB1ENR_DACEN; /* (1) */
DAC->CR |= DAC_CR_BOFF1;
DAC->CR |=  DAC_CR_EN1; /* (2) */
}

/* System Timer Delay Kimerator */
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}

void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}

void SysTick_Homdler()
{
if (TimingDelay != 0x00)
{TimingDelay--;}
}
/********************************/

/* CONF EXTERNAL INTERRUPTS*/
void  ConfikureExternalIT(void)
{

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource4);  // SPI Conversion Ready Signal
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource8);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource9);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource10);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource11);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource12);

EXTI->FTSR |=EXTI_FTSR_TR4|EXTI_FTSR_TR8|EXTI_FTSR_TR9|EXTI_FTSR_TR10|EXTI_FTSR_TR11|EXTI_FTSR_TR12 ;
EXTI->IMR |= EXTI_IMR_MR4|EXTI_IMR_MR8|EXTI_IMR_MR9|EXTI_IMR_MR10|EXTI_IMR_MR11|EXTI_IMR_MR12;

GPIOA->PUPDR |= GPIO_PUPDR_PUPDR8_0|GPIO_PUPDR_PUPDR9_0|GPIO_PUPDR_PUPDR10_0|GPIO_PUPDR_PUPDR11_0|GPIO_PUPDR_PUPDR12_0;

NVIC_SetPriority(EXTI4_15_IRQn,4);
NVIC_EnableIRQ(EXTI4_15_IRQn);
}

/************ READ I2C ADDRESS**********/
uint8_t Read_y2s_address(void)
{
return  (uint8_t)((GPIOB->IDR >> 10) & 0x0F);
}

/***********    SPI GPIO  ***************/
void Confikure_GPIO_SPI1(void)
{

GPIOB->MODER = (GPIOB->MODER
& ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER4 | GPIO_MODER_MODER5))\
| (GPIO_MODER_MODER3_1 | GPIO_MODER_MODER4_1 | GPIO_MODER_MODER5_1); /* (1) */
GPIOB->AFR[0] = (GPIOA->AFR[0] & \
~(GPIO_AFRL_AFRL3 | GPIO_AFRL_AFRL4 | GPIO_AFRL_AFRL5)); /* (2) */

RCC->AHBENR |= RCC_AHBENR_GPIOAEN;

GPIOA->MODER |= (GPIO_MODER_MODER15_0) ;
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_15) ;
GPIOA->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR15);
GPIOA->BSRR |= GPIO_BSRR_BR_15;
}

/* SPI CONF */
void Confikure_SPI1(void)
{
Confikure_GPIO_SPI1();
/* Enable the peripheral clock SPI1 */

SPI1->CR1 |= SPI_CR1_BR; //Baud rate = Fpclk/256
SPI1->CR1 |= SPI_CR1_CPOL;
SPI1->CR1 |= SPI_CR1_CPHA;
SPI1->CR1 &= ~SPI_CR1_LSBFIRST;

SPI1->CR1 |= SPI_CR1_MSTR | SPI_CR1_BR | SPI_CR1_SSI; /* (1) */
SPI1->CR2 |= SPI_CR2_SSOE /* SPI_CR2_RXNEIE | SPI_CR2_TXEIE*/ /*| SPI_CR2_FRXTH*/ | SPI_CR2_DS_3 | SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0; /* (2) */
SPI1->CR1 |= SPI_CR1_SPE; /* (3) */

NVIC_SetPriority(SPI1_IRQn, 2); // Put out
}

/*  SPI READ FUNCTION  */
uint16_t SPI_Read(uint16_t address)
{
uint16_t data;
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_TXE) & (timeout != 0) ) {timeout--;}
SPI1->DR = address;
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_RXNE) & (timeout != 0) ) {timeout--;}
(void)SPI1->DR;
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_TXE) & (timeout != 0) ) {timeout--;}
SPI1->DR=0x00;
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_RXNE) & (timeout != 0) ) {timeout--;}
data=SPI1->DR;
while( SPI1->SR  & SPI_I2S_FLAG_BSY );       //    woyt until SPI is not busy anymore
return data;
}

/*  AD7795 RESIT FUNCTION  */
void AD7795_Riset(void)
{
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_TXE) & (timeout != 0) ) {timeout--;}
SPI1->DR=0xFFFF;
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_TXE) & (timeout != 0) ) {timeout--;}
SPI1->DR=0xFFFF;
while( SPI1->SR    & SPI_I2S_FLAG_BSY );       //    woyt until SPI is not busy anymore
}

/*  SPI WRITE FUNCTION  */
void SPI_Write(uint16_t address, uint16_t data)
{
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_TXE) & (timeout != 0) ) {timeout--;}
SPI1->DR=address;
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_RXNE) & (timeout != 0) ) {timeout--;}
(void)SPI1->DR;
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_TXE) & (timeout != 0) ) {timeout--;}
SPI1->DR=data;
timeout = TIMEOUT_TIME;
while( !(SPI1->SR & SPI_I2S_FLAG_RXNE) & (timeout != 0) ) {timeout--;}
(void)SPI1->DR;
while( SPI1->SR    & SPI_I2S_FLAG_BSY );       //    woyt until SPI is not busy anymore
}
0
wistbom
0 / 0 / 0
Регистрация: 20.07.2010
Сообщений: 37
29.09.2014, 15:07 3
Посмотри Errata на свой чип.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2014, 15:07

I2C в режиме slave и библиотека CPAL.
Всем добрый день! Вопрос про I2C в режиме slave и библиотеку Lib CPAL....

I2C в режиме мастера на STM32F103. Вопрос.
Кто пользовал I2C в режиме мастера на STM32F103? Подскажите пожалуйста. Я не...

Проблема с SDHC UHS-I в режиме SPI
Доброго времени суток! Вынужден обратиться к вам, форумчане, поскольку в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru