Заприметил что у коллеги на столе модулек SIM20, валяется уже давно без дела. Непорядок, подумал я и решил немного поковырять его.

В общем, сразу же разочарование, модуль снят с производства, но моему делу это не помешало. В итоге под него появилась платка, даже прикрутили антенки для солидности.
sim20

С одной стороны, времени на это все дело было потрачено совсем совсем мало, с другой стороны там особо то и раскуривать нечего.

Модуль работает в двух режимах: командном и передачи. Если подтянуть С2D лог.1, то он работает в прозрачном режиме передачи, т.е. все что валится к нему в UART, то и получаем на другой стороне. Если притянуть к ногу к земле, то переходим в командный режим, где все настраивается AT командами вида

AT+<x>?<CR>

Из настроек, интересных параметров не так много.
1. CID — номер подсети, при необходимости можно сделать несколько подсетей, с разным назначением. Внутри одной не более 255 датчиков.
2. SID и DID позволяют настроить адрес отправителя (SID) и получателя (DID) внутри подсети.
3. CHA — номер RF канала, настройка частоты на которой будут передаваться данные.

Комбинация этих настроек позволяет получить довольно большое количество возможностей по объединению датчиков. Также модуль может выступать как ретранслятор. Принимать модуль может либо широковещательные запросы либо по своему адресу SID/DID. Также есть настройка скоростей UART, мощности и прочего. Расписывать AT команды смысла нет.

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

Режимы сна довольно бедные, во время сна RF часть и UART выключены, просыпаться модуль может либо по байту от уарта, либо по таймеру. Замеров потребления не проводил, судя по даташитам передача 35 мА, прием 28 мА. В пределах 100 метров с антенной модули работали отлично.

Для теста написал простую программку проверки работы. Часто спрашивают, как передать данные по UART. Настраиваем прерывание по приему, в нем собираем приходящие данные в буфер

void UART_IRQHandler(void) {
   fifo_inbuf[fifo_write_pos] = USART->DR;
   if(fifo_write_pos < 512) {
        fifo_write_pos++;
    }
    else {
        fifo_write_pos = 0;
    }
}

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

if(fifo_write_pos != fifo_read_pos) {
   ...
   if(fifo_inbuf[fifo_read_pos] == '*') {
   ...
   }
   if(rbuf[rbuf_ind] == '#') {
        ...
        if(memcmp(rbuf, "02", 2)) {
        ... 
        } 
   }
   ...
   if(fifo_write_pos < 512) {
       fifo_read_pos++;
   }
   else {
       fifo_read_pos = 0;
   }
}

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

В целом, для передачи небольших объемов данных, например опроса датчиков и т.п. очень даже удобная штука, работать с ней мегапросто.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Свежие записи
Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика