Перейти к содержанию
    

STM32L4 прерывания от UART. Закипел.

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

 

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

 

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

 

The MSTR bit is cleared, thus forcing the device into slave mode.

 

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

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только SPI модуль ими не хочет вертеть. Как только я включаю Alternate Function, все выводы переключаются в третье состояние.

Опишите что Вы хотите получить в принципе, как конфигурируете, в CubeMX, модуль SPI и выводы, и что потом с ними хотите сделать в System Workbench.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опишите что Вы хотите получить в принципе, как конфигурируете, в 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.

 

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

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я хочу с ним сделать в Кейле.

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?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

Screenshot_1.jpg

 

Screenshot_2.jpg

 

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

 

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.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Чтобы запрограммировать интерфейсные регистры 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. Спецификация. Написать что - то подобное можно было если год принимать гашиш и ЛСД одновременно.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Куб в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как то сложно у вас всё.

И кубом и SPL и регистрами пользовался - ни разу с такими проблемами не сталкивался.

SMS PDU примерно час занял, надо было несохраняемые SMS отправлять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

зы: какое-то у Вас настроение воинственное...

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребят,при всем уважении к автору поста,но это все ерунда и просто нежелание включить мозг...UART вообще-то железобетонный интерфейс и во всех микроконтроллерах он практически одинаков...даже в каличном STM. Создайте проект с нуля и сами устанавливайте биты в регистрах, разберитесь с тактированием этого модуля,разберитесь,установив 57600,реально ли там такая скорость?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

SPI у меня исправно работает с дисплеем Nokia 1100 через DMA. И я думал что его оседлал тоже. Но как только надо было поднять 8-битовые пересылки... data packing о!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот интересно, какая связь между эклипсом и 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 уже пол дня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...