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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> STM32L4 прерывания от UART. Закипел.
Димон Безпарольн...
сообщение May 14 2016, 18:36
Сообщение #31


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Бит 2 не ставится! Читаю значение i=SPI2->CR1;, вывожу - 16440 = 100000000111000. Нет бита 2 - матстер.

Ставлю повторно - ни в какую.

Может из - за Mode fault (MODF):

Цитата
The MSTR bit is cleared, thus forcing the device into slave mode.


Точно из-за него. 1100000100000 пятый бит MODF. Черти, навертели всякой хрени.

Сообщение отредактировал Димон Безпарольный - May 14 2016, 18:42
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 14 2016, 19:12
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(Димон Безпарольный @ May 14 2016, 20:28) *
Только SPI модуль ими не хочет вертеть. Как только я включаю Alternate Function, все выводы переключаются в третье состояние.

Опишите что Вы хотите получить в принципе, как конфигурируете, в CubeMX, модуль SPI и выводы, и что потом с ними хотите сделать в System Workbench.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 14 2016, 19:40
Сообщение #33


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(Lagman @ May 14 2016, 22:12) *
Опишите что Вы хотите получить в принципе, как конфигурируете, в CubeMX, модуль SPI и выводы, и что потом с ними хотите сделать в System Workbench.

Я хочу с ним сделать в Кейле.
SPI2. Мастер только, без прерываний, 9 бит, Clock phase = 0, Clock polarity = 0. Внутренний генератор HSE, частота процессора 80МГц(PLL), PA5 - на вывод для мигалки. Скорость SPI не важна.

Процессор STM32L476RG

Куб конфигурирует SPI выводы так:
//PB10 = SPI2_SCK = AF5
//PB12 = SPI2_NSS = AF5
//PC3 = SPI2_MOSI = AF5

Не могу выставить биты 2(MSTR: Master selection) и 6(SPE: SPI enable) - их сбрасывает проклятый MODF даже после первого обращения к SPI - записи в CR1.

Код
    SPI2->CR1 = 0<<0|    //Bit 0 CPHA: Clock phase
                0<<1|    //Bit1 CPOL: Clock polarity
                1<<2|    //Bit 2 MSTR: Master selection
                0<<3|    //Bits 5:3 BR[2:0]: Baud rate control 000b=2,001b=4,010b=8,011b=16,100b=32,101b=64,110b=128,111b=256
                1<<6|    //Bit 6 SPE: SPI enable
                0<<7|    //Bit 7 LSBFIRST: Frame format 0-MSB First
                0<<8|    //Bit 8 SSI: Internal slave select
                0<<9|    //Bit 9 SSM: Software slave management
                0<<10|    //Bit 10 RXONLY: Receive only mode enabled
                0<<11|    //Bit 11 CRCL: CRC length
                0<<12|    //Bit 12 CRCNEXT: Transmit CRC next
                0<<13|    //Bit 13 CRCEN: Hardware CRC calculation enable
                0<<14|    //Bit 14 BIDIOE: Output enable in bidirectional mode
                0<<15;    //Bit 15 BIDIMODE: Bidirectional data mode enable

Короче как только разрешаю мастер, сразу выставляется modf.
Или по - другому. Можно не разрешать SPI, тогда мастер ставится.

Чего - то перестарались господа - навертели хрен знает чего в камень.

Почему может ставится этот бит? В документации сказано:

Цитата
Mode fault occurs when the master device has its internal NSS signal (NSS pin in NSS
hardware mode, or SSI bit in NSS software mode) pulled low. This automatically sets the
MODF bit.


Но выходы на плате я поверял - они в третьем состоянии.

Сообщение отредактировал Димон Безпарольный - May 14 2016, 20:39
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 14 2016, 21:03
Сообщение #34


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(Димон Безпарольный @ May 14 2016, 22:40) *
Я хочу с ним сделать в Кейле.
SPI2. Мастер только, без прерываний, 9 бит, Clock phase = 0, Clock polarity = 0. Внутренний генератор HSE, частота процессора 80МГц(PLL), PA5 - на вывод для мигалки. Скорость SPI не важна.

Процессор STM32L476RG

Куб конфигурирует SPI выводы так:
//PB10 = SPI2_SCK = AF5
//PB12 = SPI2_NSS = AF5
//PC3 = SPI2_MOSI = AF5

Не могу выставить биты 2(MSTR: Master selection) и 6(SPE: SPI enable) - их сбрасывает проклятый MODF даже после первого обращения к SPI - записи в CR1.

Т.е. используя Куб и проект который он сгенерировал с использованием HAL, Вы пытаетесь организовать передачу данных игнорируя функции которые заложены для этого в HAL?
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 15 2016, 16:04
Сообщение #35


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(Lagman @ May 15 2016, 00:03) *
Т.е. используя Куб и проект который он сгенерировал с использованием HAL, Вы пытаетесь организовать передачу данных игнорируя функции которые заложены для этого в HAL?

К черту куб и ХАЛ. С тех пор как я увидел что сгенертровал куб, я перестал доверять обоим. Буду вертеть регистрамт пока не пойму в чем дело. Куб генерит нерабочий код. В этом я уже убедился по UART. Написал все ручками с нуля и заработало.

В данном случае сгенерированный кубом код не работает также как и мой. Только нырять в дебри ХАЛА мне лень.

Кстати, те кто программирует камни не понимая что происходит внутри в корне неправы. Я таких программистов на работе спрашивал. Слово "регистр" приводит их в ужас. Толку от таких ноль. Только гонор и поучительный тон.

Сообщение отредактировал Димон Безпарольный - May 16 2016, 05:25
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 16 2016, 08:44
Сообщение #36


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Я утверждал что Куб генерит нерабочий код. Вот он сгенерированный нерабочий код:






Т.е. видно что эти выводы должны быть сконфигурированы. А теперь смотрим конфигуратор выводов:

Код
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);

  /*Configure GPIO pin : PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}


Про SPI выводы ни строчки. Собственно у меня в этом Кубе и светодиод тоже не работает. Но разбираться почему в и так нерабочем коде - лень.
SPI програмный написал ручками. Работает идеально. Жаль что аппаратный SPI так и не удалось запустить. Может кто нибудь сгенерит мне в Кубе подобный код - буду благодарен. Мой вариант Куба - дерьмовый программист.

Кстати, почему в Full Duplex варианте вывод MISO называется Alternate Function Push Pull я так и не понял. Это же вход в конце концов.

В итоге средство, сделанное для сокращения времени программирования выполняет прямо противоположную функцию.

Еще бОльший маразм виден при детальном рассмотрении кода. Как известно, переключение входов на аналоговые рекомендуется для снижения потребления. Могучий Куб же для того, чтобы сконфигурировать ненужные мне выводы, включает тактирование всех GPIO:

Код
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

Щас прямо столько энергии сохранится, аж жуть!

А теперь взглянем на функцию, которая конфигурирует (т.е должна) GPIO и тактирование:

Код
    /* Init the low level hardware : GPIO, CLOCK, NVIC... */
    HAL_SPI_MspInit(hspi);


Вот она:
Код
__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hspi);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_SPI_MspInit should be implemented in the user file
   */
}


Теперь понятно почему не работает SPI.

Сообщение отредактировал Димон Безпарольный - May 16 2016, 09:12
Go to the top of the page
 
+Quote Post
Lagman
сообщение May 16 2016, 15:20
Сообщение #37


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



CODE
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{

GPIO_InitTypeDef GPIO_InitStruct;
if(hspi->Instance==SPI2)
{
/* USER CODE BEGIN SPI2_MspInit 0 */

/* USER CODE END SPI2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI2_CLK_ENABLE();

/**SPI2 GPIO Configuration
PC3 ------> SPI2_MOSI
PB10 ------> SPI2_SCK
PB12 ------> SPI2_NSS
*/
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* USER CODE BEGIN SPI2_MspInit 1 */

/* USER CODE END SPI2_MspInit 1 */
}

}


Сообщение отредактировал IgorKossak - May 16 2016, 17:44
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение May 17 2016, 12:14
Сообщение #38


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Заработало. Ну и каша!

Чтобы запрограммировать интерфейсные регистры CR I2C, например нужно выключить интерфейс. Чтобы запрограммировать интерфейсные регистры CR SPI нужно оказывается включить интерфейс!

Но в мануале об этом ни строчки не сказано.

Еще круче разработчики STM поступили с битом CS SPI интерфейса. Чтобы CS работал, нужно установить биты SSI, SSM, NSSP. Причем в разных регистрах. Но это еще не круто. Круто будет сейчас: от бита SSOE: SS output enable работа выхода CS не зависит! Хотя в мануале написано:

Цитата
Bit 2 SSOE: SS output enable
0: SS output is disabled in master mode and the SPI interface can work in multimaster
configuration
1: SS output is enabled in master mode and when the SPI interface is enabled. The SPI
interface cannot work in a multimaster environment.


С такой логикой недолго в Кащенко уехать. Я до сих пор не понимаю как мне удалось за пару дней таки запустить этот безумный интерфейс. На моей практике подобный эталон маразма помнится когда я связался с GSM интерфейсом. Отправка SMS в режиме PDU. Спецификация. Написать что - то подобное можно было если год принимать гашиш и ЛСД одновременно.

Сообщение отредактировал Димон Безпарольный - May 17 2016, 12:23
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 11 2016, 20:08
Сообщение #39


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Вот некоторый опыт работы с Кубом:

Код
Куб в 90% генерит не рабочий код. Например для WatchDog куб как бы невзначай забыл про его разрешение: IWDG->KR = 0xCCCC; //Enable the IWDG

Для таймера - пищалки (пользуюсь при отладке) Куб забыл добавить это:
TIM3->CCMR2 = 3<<TIM_CCMR2_OC3FE; //OC3M[2:0] стр 917
TIM3->CCER = TIM_CCER_CC3E; //CC3E - разрешение работы capture/compare
TIM3->ARR = 0x97ff; //16 бит
TIM3->CCR3 = 0x96ff; //ARR > CCR3.

При инициализации SPI - DMA Куб забыл про это:
SPI2->CR1 |= SPI_CR1_SPE; //Bit 6 SPE: SPI enable
SPI2->CR2 |= SPI_CR2_TXDMAEN; //Bit 1 TXDMAEN: Tx buffer DMA enable Для DMA разрешить!!!

ADC: забыто это:
ADC1->CR |= ADC_CR_ADEN;     //Разрешить АЦП ADEN
ADC_CCR_CKMODE_0|    //Bits 17:16 CKMODE[1:0]: ADC clock mode
ADC1->IER |= ADC_IER_EOCIE;     //Разрешить прерывание по окончанию EOCIE(2) стр 505
NVIC->ISER[0] |= 1<<18;         //= 18, ADC12 global  Interrupt      
ADC1->CR |= ADC_CR_ADSTART;        //Начать преобразование ADSTART


Сообщение отредактировал IgorKossak - Jun 11 2016, 21:24
Go to the top of the page
 
+Quote Post
x893
сообщение Jun 11 2016, 20:16
Сообщение #40


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Как то сложно у вас всё.
И кубом и SPL и регистрами пользовался - ни разу с такими проблемами не сталкивался.
SMS PDU примерно час занял, надо было несохраняемые SMS отправлять.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 11 2016, 20:27
Сообщение #41


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Камешки наверно разные. Для одних все отлажено, для других не очень. Во всяком случае без добавления этих строк не работает периферия.

Удивил только CDC UART. Запустился сразу. Поставил драйвера - и работай. Плохо только что бутлоадер не нашел. Так SWD примочкой и пользуюсь. А в даташите красиво написано. Шить можно даже по I2C.

Ну и к слову - нахрена инженеры в SPI воткнули неотключаемый Fifo? Риторический вопрос. Передаю один байт - вываоивается 16 циклов. Подстроится можно, а если адрес надо 3-х битовый передать?

Криво как - то все...

Сообщение отредактировал Димон Безпарольный - Jun 11 2016, 20:22
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jun 11 2016, 21:07
Сообщение #42


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
Передаю один байт - вываоивается 16 циклов

Это не FIFO, это называется data packing feature, как "готовить" написано в reference manual.
зы: какое-то у Вас настроение воинственное...

Сообщение отредактировал Genadi Zawidowski - Jun 11 2016, 21:12
Go to the top of the page
 
+Quote Post
romas2010
сообщение Jun 11 2016, 21:56
Сообщение #43


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515



Ребят,при всем уважении к автору поста,но это все ерунда и просто нежелание включить мозг...UART вообще-то железобетонный интерфейс и во всех микроконтроллерах он практически одинаков...даже в каличном STM. Создайте проект с нуля и сами устанавливайте биты в регистрах, разберитесь с тактированием этого модуля,разберитесь,установив 57600,реально ли там такая скорость?
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 12 2016, 07:10
Сообщение #44


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



UART я давно уже оседлал. Проблем нет. Да, неправильно выразился - data packing. При 9 и более бит он не работает потому что не умещается в 16-битовое поле.

SPI у меня исправно работает с дисплеем Nokia 1100 через DMA. И я думал что его оседлал тоже. Но как только надо было поднять 8-битовые пересылки... data packing о!
Go to the top of the page
 
+Quote Post
AlexKLm
сообщение Apr 11 2017, 10:10
Сообщение #45


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

Группа: Свой
Сообщений: 160
Регистрация: 17-03-08
Из: Мурманская
Пользователь №: 35 989



Цитата(MrYuran @ May 12 2016, 18:48) *
Вот интересно, какая связь между эклипсом и printf()

Я попробовал этот эклипс, потом он перестал работать, случилась у него авария - джава у него потерялась.
А printf() делается под конкретное железо и потому бессмысленно искать его (её) в готовом к употреблению виде.

Я сделал удобную мне функцию типа printf:
Код
#include <stdio.h>
#include <stdarg.h>

void LeF(char* format, ...)
{
  char szBuf[260];
  va_list argptr;
  va_start( argptr, format );
  vsnprintf( szBuf,260, format, argptr );
  va_end( argptr );
  HAL_UART_Transmit(&huart1, (uint8_t*)szBuf, strlen(szBuf), 100);
}

vsnprintf линкер нашёл где-то тут:
ibg_nano.a
libnosys.a


А вообще, я что хотел отметить:
Действительно, в мануалах нет данных о технике перехода вывода на AF и обратно в начальный вид.
Есть необходимость за-AF-еный вывод временно поиспользовать как обычный, но пока нет такой возможности
или вообще или с приемлемым размером кода. Вожусь с SPI1 уже пол дня.


--------------------
Демократия - это когда считается, что два дурака лучше одного умного
Суверенная демократия - это когда считается, что один дурак лучше двух дураков
Go to the top of the page
 
+Quote Post

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

 


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


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