Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F100C4 Remap SPI1 на пинах нет тактов.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Basilij
Здравствуйте господа!

Второй день бьюсь, со SPI1 в МК STM32F100C4... подключил AT25 к ножкам, PB3-5..
ремапил всё что только можно, порты Jtagi.. в общем все темы которые есть на данном форуме прочёл.. пробовал всё возможное
Не помогает. Осциллограф гласит что нет ничего на линиях.. кроме CS конечно же.

Единственное что заставляет задуматься так это строка из описания ремапа Джетага на порту PB3 - "Released only if not using asynchronous trace." Это полагаю гласит что нужно выбрать другой режим работы в:
/*!< SPI configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
?

Может есть где либо на просторах интернета нормальный работающий пример SPI1 на стандартных библиотеках периферии.. именно с ремапом на другие ножки.
На стандартных ножках на STM32L152 у меня работало всё. Ремап на 152 не пробовал. Столкнулся впервые на f100..
да хотябы для обзора и в виде регистров.


Заранее всем благодарен за потенциально возможные комментарии по данной проблеме.
sla000
I2C1 случайно не включен? В еррате про это есть...
Basilij
Цитата(sla000 @ Oct 15 2012, 08:11) *
I2C1 случайно не включен? В еррате про это есть...

По коду негде его не включал..

Или I2C1 имеет особенность сам включатся и его нужно явно отключать?
koyodza
Нужно ремапить и сам SPI1, и JTAG, иначе ничего не получится. Перед этим не забудьте повключать тактирование портов, AFIO, SPI1, часто причина в этом.
На F103 у меня такой ремап работает
Basilij
Ниже привожу код. Может подскажете верна ли последовательность действий. Может чего либо не хватает.
Комбинировал последовательности всячески, осциллографом ничего не видно...
CODE
int main()
{
sFLASH_Init();
sFLASH_WriteEnable();
sFLASH_WriteBuffer(bufOutput,1,256);
sFLASH_ReadBuffer(bufInput,1,256);
}

void sFLASH_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
sFLASH_LowLevel_Init();
/*!< Deselect the FLASH: Chip Select high */
sFLASH_CS_HIGH();
/*!< SPI configuration */
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_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(sFLASH_SPI, &SPI_InitStructure);
/*!< Enable the sFLASH_SPI */
SPI_Cmd(sFLASH_SPI, ENABLE);
}

void sFLASH_LowLevel_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/*!< sFLASH_SPI_CS_GPIO, sFLASH_SPI_MOSI_GPIO, sFLASH_SPI_MISO_GPIO
and sFLASH_SPI_SCK_GPIO Periph clock enable */
RCC_APB2PeriphClockCmd(sFLASH_CS_GPIO_CLK | sFLASH_SPI_MOSI_GPIO_CLK | sFLASH_SPI_MISO_GPIO_CLK |
sFLASH_SPI_SCK_GPIO_CLK, ENABLE);
/*!< sFLASH_SPI Periph clock enable */
RCC_APB2PeriphClockCmd(sFLASH_SPI_CLK | RCC_APB2Periph_AFIO, ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //выключаем JTAG, SW отстается включенным

/*!< Configure sFLASH_SPI pins: SCK */
GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(sFLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);

/*!< Configure sFLASH_SPI pins: MOSI */
GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_MOSI_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(sFLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);

/*!< Configure sFLASH_SPI pins: MISO */
GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(sFLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);

/*!< Configure sFLASH_CS_PIN pin: sFLASH Card CS pin */
GPIO_InitStructure.GPIO_Pin = sFLASH_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(sFLASH_CS_GPIO_PORT, &GPIO_InitStructure);
}



CODE
void sFLASH_WriteEnable(void)
{
/*!< Select the FLASH: Chip Select low */
sFLASH_CS_LOW();

/*!< Send "Write Enable" instruction */
sFLASH_SendByte(sFLASH_CMD_WREN);

/*!< Deselect the FLASH: Chip Select high */
sFLASH_CS_HIGH();
}

uint8_t sFLASH_SendByte(uint8_t byte)
{
/*!< Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_TXE) == RESET);

/*!< Send byte through the SPI1 peripheral */
SPI_I2S_SendData(sFLASH_SPI, byte);

/*!< Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET);

/*!< Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(sFLASH_SPI);
}
-JonnS-
Делал ремап SPI1 на STM32F1 (плата Discovery). Работает мастером, только выход (вход не тестил из за ненадобностю -> LCD)
Инициализация:
CODE
void SPI1Config(void)
{
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // SPI1 clock enable

SPI1->CR1 &= ~SPI_CR1_SPE; // SPI1 disable

SPI1->CR1 &= ~SPI_CR1_BIDIMODE; // 2-line unidirectional data mode selected
SPI1->CR1 |= SPI_CR1_BIDIOE; // Output enable (transmit and receive mode)
SPI1->CR1 &= ~SPI_CR1_DFF; // data frame format = 8bit
SPI1->CR1 &= ~SPI_CR1_LSBFIRST; // MSB transmitted first
SPI1->CR1 &= ~SPI_CR1_RXONLY; // Output enable (transmit and receive mode)
SPI1->CR1 &= ~SPI_CR1_SSM; // NSS signal is driven low when the master starts the communication
SPI1->CR1 |= SPI_CR1_MSTR; // configure as master
SPI1->CR1 |= (SPI_CR1_BR_1+SPI_CR1_BR_0); // Set Baud rate control to PClc/16 (24Mhz/8 = 750kHz)
SPI1->CR1 |= SPI_CR1_CPOL; // CPOL = 1 (Figure 239. Data clock timing diagram) see p.660 in RM
SPI1->CR1 |= SPI_CR1_CPHA; // CPHA = 1
SPI1->CR2 |= SPI_CR2_SSOE; // Enable NSS output for master mode

SPI1->CR1 |= SPI_CR1_SPE; // SPI1 enable
}

Clock & Remap:
Код
  RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;                // Enable Clock to alternate function GPIO.
  AFIO->MAPR   |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;     // JTAG-DP Disabled and SW-DP Enabled
  AFIO->MAPR   |= AFIO_MAPR_SPI1_REMAP;                // Remap SPI1 pins (using JTAG pins)


Надо MOSI & SCK настроить в "alternate function mode", MISO как "Input"
(У меня GPIO настраиваются макросами трудно выдрать из кода, если надо постараюсь сделать)
Basilij
Цитата(-JonnS- @ Oct 15 2012, 20:48) *
Делал ремап SPI1 на STM32F1 (плата Discovery). Работает мастером, только выход (вход не тестил из за ненадобностю -> LCD)
Инициализация:

Надо MOSI & SCK настроить в "alternate function mode", MISO как "Input"
(У меня GPIO настраиваются макросами трудно выдрать из кода, если надо постараюсь сделать)


Спасибо за код, опробовал его, тактирование на SCK всёравно нет, при попытке послылки данных..
Но, обратил внимание что после включения SPI SCK переводиться в HIGH состояние. Проверил кстати на своём коде, тоже самое.
Думаю это гласит о том что SPI хотя бы пытается работать..
Lukdut
А можете ваш код целиком продемонстрировать?
Basilij
Всё заработало, сделал по коду который прислал JonnS, но, только изменил последовательность.

сначала запускаем все тактирования, потом ремам JTAG'а потом ремап SPI1. потом инициализация структуры и лишь потом
SPI1->CR1 |= SPI_CR1_SPE; // SPI1 enable

Когда всё заработало по коду JonnS переделал всё на перефирийные библиотеки, последовательность стала такой

RCC_APB2PeriphClockCmd(sFLASH_SPI_CLK | RCC_APB2Periph_AFIO, ENABLE);
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // SPI1 clock enable

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //выключаем JTAG, SW отстается включенным
GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE);

Инициализация структуры SPI. Запуск SPI.


СБРОСИЛ НАСТРОЙКИ ОСЦИЛОГРАФА В ДЕФОЛТ, и всё увидел.
Спасибо всем!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.