реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F100C4 Remap SPI1 на пинах нет тактов., Есть ли у кого пример работающего алгоритма?
Basilij
сообщение Oct 14 2012, 21:25
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Здравствуйте господа!

Второй день бьюсь, со 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..
да хотябы для обзора и в виде регистров.


Заранее всем благодарен за потенциально возможные комментарии по данной проблеме.

Сообщение отредактировал Basilij - Oct 14 2012, 21:27
Go to the top of the page
 
+Quote Post
sla000
сообщение Oct 15 2012, 02:11
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 25-06-07
Из: Томск
Пользователь №: 28 670



I2C1 случайно не включен? В еррате про это есть...
Go to the top of the page
 
+Quote Post
Basilij
сообщение Oct 15 2012, 05:09
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Цитата(sla000 @ Oct 15 2012, 08:11) *
I2C1 случайно не включен? В еррате про это есть...

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

Или I2C1 имеет особенность сам включатся и его нужно явно отключать?

Сообщение отредактировал Basilij - Oct 15 2012, 06:56
Go to the top of the page
 
+Quote Post
koyodza
сообщение Oct 15 2012, 07:53
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Нужно ремапить и сам SPI1, и JTAG, иначе ничего не получится. Перед этим не забудьте повключать тактирование портов, AFIO, SPI1, часто причина в этом.
На F103 у меня такой ремап работает
Go to the top of the page
 
+Quote Post
Basilij
сообщение Oct 15 2012, 09:58
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Ниже привожу код. Может подскажете верна ли последовательность действий. Может чего либо не хватает.
Комбинировал последовательности всячески, осциллографом ничего не видно...
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);
}


Сообщение отредактировал IgorKossak - Oct 15 2012, 10:34
Причина редактирования: [codebox] для длинного кода!!!
Go to the top of the page
 
+Quote Post
-JonnS-
сообщение Oct 15 2012, 14:48
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-05-07
Из: Болгария
Пользователь №: 27 577



Делал ремап 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 настраиваются макросами трудно выдрать из кода, если надо постараюсь сделать)

Сообщение отредактировал IgorKossak - Oct 15 2012, 19:34
Причина редактирования: [code] для короткого кода!!!
Go to the top of the page
 
+Quote Post
Basilij
сообщение Oct 15 2012, 15:16
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Цитата(-JonnS- @ Oct 15 2012, 20:48) *
Делал ремап SPI1 на STM32F1 (плата Discovery). Работает мастером, только выход (вход не тестил из за ненадобностю -> LCD)
Инициализация:

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


Спасибо за код, опробовал его, тактирование на SCK всёравно нет, при попытке послылки данных..
Но, обратил внимание что после включения SPI SCK переводиться в HIGH состояние. Проверил кстати на своём коде, тоже самое.
Думаю это гласит о том что SPI хотя бы пытается работать..
Go to the top of the page
 
+Quote Post
Lukdut
сообщение Oct 16 2012, 08:51
Сообщение #8





Группа: Новичок
Сообщений: 2
Регистрация: 3-03-11
Пользователь №: 63 378



А можете ваш код целиком продемонстрировать?
Go to the top of the page
 
+Quote Post
Basilij
сообщение Oct 16 2012, 09:03
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 7-04-11
Пользователь №: 64 190



Всё заработало, сделал по коду который прислал 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.


СБРОСИЛ НАСТРОЙКИ ОСЦИЛОГРАФА В ДЕФОЛТ, и всё увидел.
Спасибо всем!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016