Ioann_II 0 16 сентября, 2019 Опубликовано 16 сентября, 2019 · Жалоба Здравствуйте, Уважаемые коллеги. Возникла надобность в данной шине. В мануале HAL на STM32F1 нашёл упоминание про режим LIN UARTа. Может быть у кого-нибудь есть примеры использования. Интересуют режимы Master и Slave. В разделе примеров в репозитории Куба ничего не нашёл. Буду благодарен за помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 16 сентября, 2019 Опубликовано 16 сентября, 2019 · Жалоба Бит LINEN в регистре CR2 изменяет длину отправляемого передатчиком сигнала BREAK и изменяет обнаружение того-же сигнала приемником. В остальном уарт остается всё тем же уартом и работа с ним точно такая же, за исключением реакции на обнаружение Break приемником слейва. В кубе можно задать для уарта Mode: LIN Есть функции HAL_LIN_Init() и HAL_LIN_SendBreak(), а вот обработки Break на приеме раньше (пару лет тому назад) не было, как сейчас - не смотрел. Впрочем, данные пакета он и так примет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 16 сентября, 2019 Опубликовано 16 сентября, 2019 · Жалоба Т.е., сначала нужно вызвать HAL_UART_Init(), а затем HAL_LIN_Init()? Или только HAL_LIN_Init()? И как с синхронизацией по байту 0x55, когда синхронизация от HSI? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 16 сентября, 2019 Опубликовано 16 сентября, 2019 · Жалоба 53 минуты назад, Ioann_II сказал: Т.е., сначала нужно вызвать HAL_UART_Init(), а затем HAL_LIN_Init()? Или только HAL_LIN_Init()? И как с синхронизацией по байту 0x55, когда синхронизация от HSI? Только. В stm32f1xx_hal_uart.c написано как, выбравший HAL обрекает себя на ежедневное чтение его кода :) Я предпочитаю сразу реф. мануал читать. Про синхронизацию по байту 0x55 там ни слова не сказано, вероятно нет. Тогда, как для обычного UART-а, работоспособен при разнице скоростей до примерно 4% ... 4.5%. Судя по даташиту, точности HSI хватает (на пределе) для работы двух подобных устройств друг с другом в диапазоне температур -10 .. +85, а при -40 .. +105 сможет работать только если с другой стороны скорость установлена точно (= есть кварц). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 16 сентября, 2019 Опубликовано 16 сентября, 2019 · Жалоба И всё-таки: HAL_UART_Init(); HAL_LIN_Init()? Или: HAL_LIN_Init()? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 17 сентября, 2019 Опубликовано 17 сентября, 2019 · Жалоба 19 hours ago, Ioann_II said: И всё-таки: Как уже было сказано, только HAL_LIN_Init() Quote LinLIN Initialization: HAL_LIN_Init() LIN De-Initialization: HAL_UART_DeInit() LIN Data processing: same UART API used for Data transfers (HAL_UART_Transmit(),HAL_UART_Receive(),…) LIN control: HAL_LIN_SendBreak() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 17 сентября, 2019 Опубликовано 17 сентября, 2019 · Жалоба Прошу прощения, недосмотрел предыдущий пост. Доделаю макет и стану пробовать. Спасибо за подсказки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба Через некоторое время Вы обнаружите что все три функции приема хотят знать длину принимаемого сообщения: HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); А откуда мы знаем что нам на вход придет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба Да, с этим тут проблема - видать во время разработки не продумали, что чаще всего через UART идёт обмен сообщениями, где есть символы начала сообщения и символы конца (как правило, 0d, 0a). Просто не получается сразу так "въехать" - года 2 не занимался с STM-кой, позабыл, а тут снова понадобилось. В данном приложении можно сделать фиксированную длину сообщений и воспользоваться HAL-ом. Но когда-то переделывал библиотеку HAL для STM32F1, чтобы call-back вызывался, когда принят символ конца строки. Спасибо за подсказки, буду пробовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться