01.10.2013, 14:43
|
|
Временная регистрация
Регистрация: 21.01.2010
Сообщений: 36
Сказал спасибо: 2
Сказали Спасибо 14 раз(а) в 3 сообщении(ях)
|
STM32F030C8T6 пролема с SPI1
Виснет на ожидании приёма. Байт отправляет, смотрел осцилографом.
Часть кода (по #else) работает, с процессором STM32F100.
Код:
|
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); |
код инициализации:
Код:
|
void SPI_FLASH_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Включим тактирования */
#ifdef STM32F0XX_VL
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIO_SPI_FLAS H_CS, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
#else
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_SPI_FLA SH_CS, ENABLE);
/*JTAG-DP Disabled and SW-DP Enabled */
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
/* Configure REmapped- SPI pins: SCK, MISO and MOSI */
GPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE);
#endif
/* Configure SPI pins: SCLK=PB3, MOSI=PB5 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
#ifdef STM32F0XX_VL
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
#else
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
#endif
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure SPI pins: MISO=PB4 */
#ifdef STM32F0XX_VL
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_0);
#else
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
#endif
/* Configure SPI pins: NS=PA15 */
GPIO_InitStructure.GPIO_Pin = SPI_FALSH_CS_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
#ifdef STM32F0XX_VL
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
#else
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
#endif
GPIO_Init(SPI_FALSH_CS_PORT, &GPIO_InitStructure);
SPI_FLASH_CS_HIGH();
/* SPI1 Config -------------------------------------------------------------*/
SPI_StructInit(&SPI_InitStructure);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
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_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_CalculateCRC(SPI1, DISABLE);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE); |
передача приём
Код:
|
uint8_t Flash_ReadWriteByte(uint8_t data)
{
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI1 peripheral */
#ifdef STM32F0XX_VL
SPI_SendData8(SPI1, data);
#else
SPI_I2S_SendData(SPI1, data);
#endif
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
#ifdef STM32F0XX_VL
return SPI_ReceiveData8(SPI1);
#else
return SPI_I2S_ReceiveData(SPI1);
#endif
} |
|
|
|
|
01.10.2013, 15:04
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
Выкинуть SPL и читать до просветления даташит.
Для начала какой размер фрейма ?
Здесь для 8 бит. Для 9 и выше юзаем DR .
Код:
|
#define SPI1_DR_8b (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C)) |
Код:
|
SPI1-›CR1 |=
SPI_CR1_BR_0 | //
SPI_CR1_MSTR |
SPI_CR1_SSI |
SPI_CR1_SSM
;
SPI1-›CR2 = 0x700; // 8 bit
SPI1-›CR1 |= SPI_CR1_SPE; |
Гоним массив без пауз.
Код:
|
for (line=0; line‹n; line++){
while(!(SPI1-›SR & SPI_SR_TXE));
SPI1-›SPI1_DR_8b=data;
}
while((SPI1-›SR & SPI_SR_BSY)); |
Для ручного тырканья каждого фрейма.
Код:
|
SPI1-›SPI1_DR_8b = data;
while (!(SPI1-›SR & SPI_SR_RXNE));
return (SPI1-›DR); |
__________________
Осторожно , злой кот
|
|
|
|
01.10.2013, 15:15
|
|
Временная регистрация
Регистрация: 21.01.2010
Сообщений: 36
Сказал спасибо: 2
Сказали Спасибо 14 раз(а) в 3 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
"Для начала какой размер фрейма ?" - 8 бит.
Было бы время и даташит протёр, и выкинул бы SPL.
У меня подозрения что засада в переназначении ноги MISO (PB4).
|
|
|
|
01.10.2013, 15:21
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
Пины кроме CS конфигурируем как AF PP .
По умолчанию SPI1 весит на PA5-PA7 и это соответствует AF0 - то есть ни ремапить ни
конфигурировать AF не надо. Если конечно те же пины юзаем.
__________________
Осторожно , злой кот
|
|
|
|
01.10.2013, 15:29
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
Сообщение от alexdos
|
У меня подозрения что засада в переназначении ноги MISO (PB4).
|
Ну он так же AF0 .
__________________
Осторожно , злой кот
|
|
|
|
01.10.2013, 15:51
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
Сообщение от dosikus
|
По умолчанию SPI1 весит на PA5-PA7 и это соответствует AF0
|
Дополню и на PB3-PB5 .
__________________
Осторожно , злой кот
|
|
|
|
01.10.2013, 16:15
|
|
Временная регистрация
Регистрация: 21.01.2010
Сообщений: 36
Сказал спасибо: 2
Сказали Спасибо 14 раз(а) в 3 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
Вставил Вашу инициализацию, код передачи и приёма.
Успешно висим на while (!(SPI1-›SR & SPI_SR_RXNE));
SPI_SR_RXNE - не взводится. Какие могут быть этому причины ? вроде как бы не нужно мастеру такты внешние чтоб "дотикать". По логике он после передачи через короткую паузу должен стать "1".
|
|
|
|
01.10.2013, 16:26
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
alexdos,
Упс извинюсь, совсем забыл про переключалку FIFO фрейма.
Вот это и для приема и для передачи
Код:
|
#define SPI1_DR_8b (*(__IO uint8_t *)((uint32_t)SPI1 + 0x0C))
Spi_Init (void)
{
SPI1-›CR1 |=
SPI_CR1_BR_0 | //
SPI_CR1_MSTR |
SPI_CR1_SSI |
SPI_CR1_SSM
;
SPI1-›CR2 = 0x700; // 8 bit
SPI1-›CR2 | =SPI_CR2_FRXTH;
SPI1-›CR1 |= SPI_CR1_SPE;
}
uint8_t Spi_send(uint8_t data)
{
SPI1-›SPI1_DR_8b = data;
while (!(SPI1-›SR & SPI_SR_RXNE));
return (SPI1-›SPI1_DR_8b);
} |
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 01.10.2013 в 16:29.
|
|
|
|
01.10.2013, 16:31
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
Сообщение от alexdos
|
Какие могут быть этому причины ? вроде как бы не нужно мастеру такты внешние чтоб "дотикать". По логике он после передачи через короткую паузу должен стать "1".
|
В даташите все есть.
В SPL еще долго искать будешь...
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 01.10.2013 в 16:39.
|
|
|
Сказали "Спасибо" dosikus
|
|
|
01.10.2013, 17:08
|
|
Временная регистрация
Регистрация: 21.01.2010
Сообщений: 36
Сказал спасибо: 2
Сказали Спасибо 14 раз(а) в 3 сообщении(ях)
|
Re: STM32F030C8T6 пролема с SPI1
Сообщение от dosikus
|
В даташите все есть.
В SPL еще долго искать будешь...
|
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
Громадное спасибо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:24.
|
|