[i] Работа с инфракрасным портом (IrDA, SIR) на исследовательской плате К1986ВЕ1QI (К1986ВЕ1FI, К1986ВЕ1GI)

ID статьи: 48044
Дата последнего изменения: 30.11.2023 09:13:45
Материал из настоящей статьи, относящийся к микросхеме К1986ВЕ1QI, распространяется в том числе на микроконтроллеры К1986ВЕ1FI и К1986ВЕ1GI

InfraRed Data Association — IrDA, ИК‑порт, инфракрасный порт — группа стандартов, описывающая протоколы физического и логического уровня передачи данных с использованием инфракрасного диапазона световых волн в качестве среды передачи. Является разновидностью оптической линии связи ближнего радиуса действия.

Технология была особенно популярна в конце 1990-х начале 2000-х годов. В данное время практически вытеснена более современными аналогами, такими как WiFi и Bluetooth.

Основные причины отказа от IrDA были:

IrDA спецификации включают в себя:

IrDA устройства способны передавать информацию с различной скоростью:

Микроконтроллер К1986ВЕ1QI имеет в составе контроллера UART кодек (ENDEC – Encoder/Decoder) последовательного интерфейса инфракрасной (ИК) передачи данных в соответствии с протоколом SIR (SIR – Serial InfraRed) ассоциации Infrared Data Association (IrDA).

Связь между UART и IrDA следующая:

Serial InfraRed (SIR) использует те же скорости передачи данных, что и RS232 (COM-порт), а именно, 9.6 кбит/с, 19.2 кбит/с, 38.4 кбит/с, 57.6 кбит/с, 115.2 кбит/с. Совпадение поддерживаемых скоростей не случайно, и позволяет довольно легко реализовать COM IrDA адаптеры.

На реальных изделиях ИК-порт выглядит, как показано на рисунке 1.


Рисунок 1 - Пример ИК-порта на смартфоне и исследовательской плате микроконтроллера К1986ВЕ1QI

Смартфон изображен не случайно. Раньше с помощью ИК-порта передавались данные между телефонами, а сегодня ИК-порт не потерял актуальность и используется для управления современной техникой (телевизоры, кондиционеры, проекторы и др.).

Для того, чтобы в полной мере показать работоспособность ИК-порта в микроконтроллере К1986ВЕ1QI, было принято решение взять две исследовательских платы с установленным модулем IrDA. Обмен организован следующим образом: одна плата управляет другой при помощи кнопок. По кнопке Select первой отладочной платы зажигаются светодиоды на второй плате, а по кнопке Back на второй плате светодиоды гаснут. Если будут нажаты другие кнопки на первой отладочной плате, на второй светодиоды начнут моргать, что фактически указывает в рамках проекта на ошибку.

В самом начале необходимо выставить нужны перемычки на отладочной плате для работы с IrDA. Это можно сделать согласно паспорту на плату. Необходимые настройки на примере отладочной платы шестой ревизии:

Проект, рассматриваемый в статье, доступен в конце, в приложенных файлах.

Опустим настройки тактирования, конфигурацию портов для светодиодов, кнопок и UART - подчеркнем самое важное:

Рассмотрим код программы, который обеспечивает работоспособность, представленную на видеоролике. Для начала разберем вечный цикл while(1) из основного тела main():

#define codeON 0xAA
#define codeOFF 0xBB
#define codeERROR 0xEE
...
   while(1)
   {
      if (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_9) == 0) // Если нажата кнопка Select
      {
         PORT_SetBits(MDR_PORTD, LED_ALL);
         Delay(500000);
         PORT_ResetBits(MDR_PORTD, LED_ALL);
         MDR_UART1->DR=codeON; // Code on diods. Отправка кода 0xAA по ИК-порту
      }
      else
      {
         if (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_11) == 0) // Если нажата кнопка Back
      {
         PORT_SetBits(MDR_PORTD, LED_ALL);
         Delay(500000);
         PORT_ResetBits(MDR_PORTD, LED_ALL);
         MDR_UART1->DR=codeOFF; // Code off diods. Отправка кода 0xBB по ИК-порту
      }
      else
      {
         if ((PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_5) == 0) // Если нажата кнопка Right или
            || (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_8) == 0) // если нажата кнопка Up или
            || (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_10) == 0) // если нажата кнопка Left
            || (PORT_ReadInputDataBit(MDR_PORTE, PORT_Pin_15) == 0)) // если нажата кнопка Down
         {
            PORT_SetBits(MDR_PORTD, LED_ALL);
            Delay(500000);
            PORT_ResetBits(MDR_PORTD, LED_ALL);
            MDR_UART1->DR=codeERROR; // Code off diods. Отправка кода 0xFF по ИК-порту           
         }
      }
      }
   }

По коду выше видно, что при нажатии любой кнопки будет отправлена какая-то информация по ИК-порту. Прерывания же возникают при приёме данных, соответственно, если направить ИК-порт одной платы на ИК-порт другой и нажать на кнопку, то плата, принимающая сигнал, будет отправлена в обработчик прерываний UART, который описан следующим образом:

void UART1_Handler()
{
   MDR_UART1->ICR = 0x10; // сбросили прерывание
   uint32_t i;
   // конструкция switch - case основного управления //
   switch (MDR_UART1->DR)
   {
      case codeON: // если пришел код 0xAA
         PORT_SetBits(MDR_PORTD, LED_ALL); // LEDs ON
         Delay(50000);
      break;
      case codeOFF: // если пришел код 0xBB
         PORT_ResetBits(MDR_PORTD, LED_ALL); // LEDs OFF
         Delay(50000);
      break;
      default: // если пришел любой другой код, который не зажигает и не гасит светодиоды
         for (i=0;i<8; i++)
      {
         PORT_SetBits(MDR_PORTD, LED_ALL); // Моргание LEDs
         Delay(50000);
         PORT_ResetBits(MDR_PORTD, LED_ALL);
         Delay(50000);
      }
      break;
   }
}

При попытке отправить на ИК-порт отладочной платы случайную команду с ИК-порта смартфона, микроконтроллер ожидаемо попадает в обработчике в case default, о чем свидетельствуют моргающие светодиоды.


Контактная информация

Сайт:https://support.milandr.ru
E-mail:support@milandr.ru
Телефон: +7 495 221-13-55