LoRa Driver для Semtech SX1262 на Linux (PineDio USB-адаптер) и BL602 (PineDio Stack BL604)
Читайте статьи:
— «Создайте драйвер Linux для PineDio LoRa SX1262 USB-адаптера» (https://lupyuen.github.io/articles/usb);
— «LoRaWAN на PineDio Stack BL604 RISC-V Board» (https://lupyuen.github.io/articles/lorawan2);
— «PineCone BL602 Talks LoRaWAN» (https://lupyuen.github.io/articles/lorawan);
— «The Things Network на PineDio Stack BL604 RISC-V Board» (https://lupyuen.github.io/articles/ttn).
Внимание: отправка сообщения LoRa на PineDio USB (не BL602) свыше 29 байт приведёт к повреждению сообщения!
Внимание: получение сообщения LoRa на PineDio USB (не BL602) свыше 28 байт приведёт к повреждению сообщения!
(CH341 SPI, похоже, испытывает трудности с передачей блока из 32 байт).
Для BL602 / BL604: чтобы добавить этот драйвер в существующий проект BL602 / BL604, выполните следующие действия:
cd bl_iot_sdk/components/3rdparty
git submodule add https://github.com/lupyuen/lora-sx1262
Перенесено из эталонной реализации драйвера Semtech для SX1262...
https://github.com/Lora-net/LoRaMac-node/tree/master/src/radio/sx126x
Чтобы собрать драйвер PineDio USB на Pinebook Pro Manjaro Arm64, выполните следующее:
## Установите DKMS
sudo pacman -Syu dkms base-devel --needed
## Установите заголовки ядра для Manjaro: https://linuxconfig.org/manjaro-linux-kernel-headers-installation
uname -r
## Должно отобразить «5.14.12-1-MANJARO-ARM» или подобное
sudo pacman -S linux-headers
pacman -Q | grep headers
## Должно отображать «linux-headers 5.14.12-1» или подобное
## Перезагрузите компьютер для безопасности
sudo reboot now
## Установите драйвер CH341 SPI
git clone https://github.com/rogerjames99/spi-ch341-usb.git
pushd spi-ch341-usb
## TODO: отредактируйте Makefile и измените...
## KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/
## на...
## KERNEL_DIR = /lib/modules/$(KVERSION)/build
make
sudo make install
popd
## Выгрузите модуль ch341, если он был автоматически загружен
lsmod | grep ch341
sudo rmmod ch341
## Загрузите новый модуль
sudo modprobe spi-ch341-usb
## Подключите PineDio USB и проверьте, что модуль был правильно загружен.
## См. журнал dmesg ниже. Это необходимо проверять каждый раз, когда мы перезагружаем
## наш компьютер и подключаем PineDio USB.
dmesg
## Если мы увидим «spi_ch341_usb: loading out-of-tree module taints kernel»,
## Отключите PineDio USB, запустите «sudo rmmod ch341», снова подключите PineDio USB
## и ещё раз проверьте dmesg.
## Скачайте драйвер PineDio USB
git clone --recursive https://github.com/lupyuen/lora-sx1262
cd lora-sx1262
## TODO: Отредактируйте src/main.c и раскомментируйте READ_REGISTERS, SEND_MESSAGE или RECEIVE_MESSAGE.
## Смотрите «Операции PineDio USB» ниже
## Соберите драйвер PineDio USB
make
## Запустите демонстрацию PineDio USB Driver.
## Посмотрите журнал вывода ниже.
sudo ./lora-sx1262
Подробнее о PineDio USB и CH341 SPI:
Демонстрация PineDio USB поддерживает 3 операции...
Чтение регистров SX1262:
Отредактируйте src/main.c
и раскомментируйте...
#define READ_REGISTERS
(См. журнал чтения регистра ниже)
Отправка сообщения LoRa:
Отредактируйте src/main.c
и раскомментируйте...
#define SEND_MESSAGE
(См. журнал отправки сообщения ниже)
Получение сообщения LoRa:
Отредактируйте src/main.c
и раскомментируйте...
#define RECEIVE_MESSAGE
(См. журнал получения сообщения ниже)
Обратите внимание, что программирование GPIO CH341 является неполным. Нам нужно...
Инициализировать контакты GPIO: SX126xIoInit
Зарегистрировать обработчик прерываний GPIO для DIO1: SX126xIoIrqInit
Сбросить SX1262 через GPIO: SX126xReset
(На данный момент мы сбрасываем SX1262, вручную отключая PineDio USB)
Проверить состояние занятости SX1262 через GPIO: SX126xWaitOnBusy
Мы спим 10 миллисекунд
Получить состояние вывода DIO1: SX126xGetDio1PinState
Нам также нужны фоновые потоки для получения LoRa сообщений в фоновом режиме...
Подробнее о PineDio USB и CH341 GPIO:
Журнал вывода от PineDio USB Demo...
Чтение регистров SX1262 на PineDio USB:
read_registers
SX126xIoInit
SX126xWakeup
sx126x_hal_write: command_length=1, data_length=1
spi tx: c0 00
spi rx: a2 22
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 00 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x00 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 01 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x01 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 02 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x02 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 03 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x03 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 04 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x04 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 05 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x05 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 06 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x06 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 07 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x07 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 08 00 00
spi rx: a2 a2 a2 a2 80
TODO: SX126xWaitOnBusy
Регистр 0x08 = 0x80
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 09 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x09 = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 0a 00 00
spi rx: a2 a2 a2 a2 01
TODO: SX126xWaitOnBusy
Регистр 0x0a = 0x01
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 0b 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x0b = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 0c 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x0c = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 0d 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x0d = 0x00
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 00 0e 00 00
spi rx: a2 a2 a2 a2 00
TODO: SX126xWaitOnBusy
Регистр 0x0e = 0x00
Готово!
См. ниже журнал dmesg чтения регистров.
Передача 29-байтового LoRa сообщения на PineDio USB:
ВНИМАНИЕ: отправка LoRa-сообщения на PineDio USB (не BL602) размером более 29 байт приведёт к повреждению сообщения!
gcc -o lora-sx1262 \
npl/linux/src/os_eventq.cc \
\
src/main.o src/radio.o src/sx126x.o src/sx126x-linux.o npl/linux/src/os_callout.o npl/linux/src/os_sem.o npl/linux/src/os_task.o npl/linux/src/os_atomic.o npl/linux/src/os_time.o npl/linux/src/os_mutex.o \
-g -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-old-style-declaration -I include -I npl/linux/include -I npl/linux/include/nimble \
-pthread -lrt -lstdc++ \
cc1plus: warning:
``` Команда-лайн опция «-Wno-old-style-declaration» действительна для C/ObjC, но не для C++.
create_task
init_driver
TODO: SX126xReset
SX126xIoInit
TODO: SX126X interrupt init
SX126xWakeup
sx126x_hal_write: command_length=1, data_length=1
spi tx: c0 00
spi rx: ac 2c
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=1
spi tx: 80 00
spi rx: ac ac
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=1
spi tx: 9d 01
spi rx: a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=1
spi tx: 80 00
spi rx: a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=1
spi tx: 96 01
spi rx: a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=1
spi tx: 8f 00 00
spi rx: a2 a2 a2
TODO: SX126xWaitOnBusy
SX126xSetTxParams: power=22, rampTime=7
SX126xGetDeviceId: SX1262
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 08 d8 00 00
spi rx: a2 a2 a2 a2 fe
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=3, data_length=1
spi tx: 0d 08 d8 fe
spi rx: a2 a2 a2 a2
TODO: SX126xWaitOnBusy
SX126xSetPaConfig: paDutyCycle=4, hpMax=7, deviceSel=0, paLut=1
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=4
spi tx: 95 04 07 00 01
spi rx: a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=3, data_length=1
spi tx: 0d 08 e7 38
spi rx: a2 a2 a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=2
spi tx: 8e 16 07
spi rx: a2 a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=8
spi tx: 08 ff ff ff ff 00 00 00 00
spi rx: a2 a2 a2 a2 a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=9
spi tx: 1d 02 9f 00 00 00 00 00 00 00 00 00
spi rx: a2 a2 a2 a2 02 08 ac 08 89 3a a1 65 9a
TODO: SX126xWaitOnBusy
TimerInit
TimerInit
RadioSetChannel: freq=923000000
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=2
spi tx: 98 e1 e9
spi rx: a2 a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=4
spi tx: 86 39 b0 00 00
spi rx: a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy
RadioSetTxConfig: modem=1, power=14, fdev=0, bandwidth=0, datarate=7, coderate=1, preambleLen=8, fixLen=0, crcOn=1, freqHopOn=0, hopPeriod=0, iqInverted=0, timeout=3000
RadioStandby
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=1
spi tx: 80 00
spi rx: a2 a2
TODO: SX126xWaitOnBusy
RadioSetModem
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=1
spi tx: 8a 01
spi rx: a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=4
spi tx: 8b 07 04 01 00
spi rx: a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=6
spi tx: 8c 00 08 00 ff 01 00
spi rx: a2 a2 a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 08 89 00 00
spi rx: a2 a2 a2 a2 04
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=3, data_length=1
spi tx: 0d 08 89 04
spi rx: a2 a2 a2 a2
TODO: SX126xWaitOnBusy
SX126xSetRfTxPower
SX126xSetTxParams: power=14, rampTime=7
SX126xGetDeviceId: SX1262
TODO: SX126xWaitOnBusy
sx126x_hal_read: command_length=4, data_length=1
spi tx: 1d 08 d8 00 00
spi rx: a2 a2 a2 a2 fe
TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy ```
create_task
init_driver
TODO: SX126xReset
SX126xIoInit
TODO: SX126X interrupt init
SX126xWakeup
sx126x_hal_write: command_length=1, data_length=1
spi tx:
Основной язык текста запроса — язык Nim. c0 00
spi rx: d4 54
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=1 spi tx: 80 00 spi rx: d4 d4
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=1 spi tx: 9d 01 spi rx: a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=1 spi tx: 80 00 spi rx: a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=1 spi tx: 96 01 spi rx: a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=2 spi tx: 8f 00 00 spi rx: a2 a2 a2
TODO: SX126xWaitOnBusy SX126xSetTxParams: power=22, rampTime=7 SX126xGetDeviceId: SX1262 TODO: SX126xWaitOnBusy sx126x_hal_read: command_length=4, data_length=1 spi tx: 1d 08 d8 00 00 spi rx: a2 a2 a2 a2 fe
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=3, data_length=1 spi tx: 0d 08 d8 fe spi rx: a2 a2 a2 a2
TODO: SX126xWaitOnBusy SX126xSetPaConfig: paDutyCycle=4, hpMax=7, deviceSel=0, paLut=1 TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=4 spi tx: 95 04 07 00 01 spi rx: a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=3, data_length=1 spi tx: 0d 08 e7 38 spi rx: a2 a2 a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=2 spi tx: 8e 16 07 spi rx: a2 a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=8 spi tx: 08 ff ff ff ff 00 00 00 00 spi rx: a2 a2 a2 a2 a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_read: command_length=4, data_length=9 spi tx: 1d 02 9f 00 00 00 00 00 00 00 00 00 00 spi rx: a2 a2 a2 a2 02 08 ac 08 89 aa a9 61 9b
TODO: SX126xWaitOnBusy TimerInit TimerInit RadioSetChannel: freq=923000000 TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=2 spi tx: 98 e1 e9 spi rx: a2 a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=4 spi tx: 86 39 b0 00 00 spi rx: a2 a2 a2 a2 a2
RadioSetTxConfig: modem=1, power=14, fdev=0, bandwidth=0, datarate=7, coderate=1, preambleLen=8, fixLen=0, crcOn=1, freqHopOn=0, hopPeriod=0, iqInverted=0, timeout=3000 RadioSetTxConfig: SpreadingFactor=7, Bandwidth=4, CodingRate=1, LowDatarateOptimize=0, PreambleLength=8, HeaderType=0, PayloadLength=255, CrcMode=1, InvertIQ=0 RadioStandby
TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=1 spi tx: 80 00 spi rx: a2 a2
RadioSetModem
TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=1 spi tx: 8a 01 spi rx: a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=4 spi tx: 8b 07 04 01 00 spi rx: a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=6 spi tx: 8c 00 08 00 ff 01 00 spi rx: a2 a2 a2 a2 a2 a2 a2
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_read: command_length=4, data_length=1 spi tx: 1d 08 89 00 00 spi rx: a2 a2 a2 a2 04
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=3, data_length=1 spi tx: 0d 08 89 04 spi rx: a2 a2 a2 a2
SX126xSetRfTxPower SX126xSetTxParams: power=14, rampTime=7 SX126xGetDeviceId: SX1262
TODO: SX126xWaitOnBusy sx126x_hal_read: command_length=4, data_length=1 spi tx: 1d 08 d8 00 00 spi rx: a2 a2 a2 a2 fe
TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=3, data_length=1 spi tx: 0d 08 d8 fe spi rx: a2 a2 a2 a2
SX126xSetPaConfig: paDutyCycle=4, hpMax=7, deviceSel=0, paLut=1
TODO: SX126xWaitOnBusy sx126x_hal_write: command_length=1, data_length=4 spi tx: 95 04 07 SX126xWaitOnBusy
sx126x_hal_write: command_length=3, data_length=1 spi tx: 0d 08 ac 94 spi rx: d2 d2 d2 d2 TODO: SX126xWaitOnBusy
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=3 spi tx: 82 ff ff ff spi rx: d2 d2 d2 d2 TODO: SX126xWaitOnBusy RadioOnDioIrq RadioIrqProcess
SX126xReadCommand
command=0x12, size=2 TODO: SX126xWaitOnBusy sx126x_hal_read: command_length=2, data_length=2 spi tx: 12 00 00 00 spi rx: d2 d2 00 00 status=0xd2 TODO: SX126xWaitOnBusy TODO: SX126xWaitOnBusy
sx126x_hal_write
command_length=1, data_length=2 spi tx: 02 00 00 spi rx: d2 d2 d2 TODO: SX126xWaitOnBusy TODO: SX126xGetDio1PinState receive_message RadioRx
TODO: SX126xWaitOnBusy
sx126x_hal_write: command_length=1, data_length=8 spi tx: 08 ff ff ff ff 00 00 00 00 spi rx: d2 d2 d2 d2 d2 d2 d2 d2 d2
И так далее.
Примечание: в запросе присутствуют фрагменты кода, которые не удалось распознать и перевести. Перевод текста:
Журнал dmesg при передаче PineDio USB 29-байтового пакета LoRa...
ВНИМАНИЕ: отправка сообщения LoRa на PineDio USB (не BL602) размером более 29 байт приведёт к повреждению сообщения!
audit: type=1105 audit(1634994194.295:1270): pid=72110 uid=1000 auid=1000 ses=4 subj==unconfined msg='op=PAM:session_open grantors=pam_limits,pam_unix,pam_permit acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/3 res=success'
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=3, csChange=1, result=3
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=3, csChange=1, result=3
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=9, csChange=1, result=9
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=13, csChange=1, result=13
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=13, csChange=1, result=13
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=3, csChange=1, result=3
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=7, csChange=1, result=7
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=3, csChange=1, result=3
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=7, csChange=1, result=7
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=9, csChange=1, result=9
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=7, csChange=1, result=7
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=31, csChange=1, result=31
spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
audit: type=1701
Основной язык текста запроса — технический. Текст запроса относится к сфере IT и содержит информацию о работе с устройствами и передаче данных. **audit(1634994203.075:1271):**
*auid=1000 uid=0 gid=0 ses=4 subj==unconfined pid=72111 comm="lora-sx1262" exe="/home/luppy/lora-sx1262/lora-sx1262" sig=6 res=1*
**Примечание:** если мы попытаемся передать 64-байтовый пакет, он не появится в журнале dmesg.
## Получение сообщения
Журнал dmesg при получении устройством PineDio USB пакета LoRa размером 28 байт...
**ВНИМАНИЕ:** получение на устройстве PineDio USB (не BL602) сообщения LoRa размером более 28 байтов приведёт к повреждению сообщения!
audit: type=1105 audit(1635046697.907:371): pid=29045 uid=1000 auid=1000 ses=7 subj==unconfined msg='op=PAM:session_open grantors=pam_limits,pam_unix,pam_permit acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/5 res=success' spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2 spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2 ... spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=31, csChange=1, result=31 spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5 spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2 spi-ch341-usb 3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2 spi-ch341-usb
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=3, csChange=1, result=3
3-1:1.0: ch341_spi_transfer_low: len=9, csChange=1, result=9
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=3, csChange=1, result=3
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=31, csChange=1, result=31
3-1:1.0: ch341_spi_transfer_low: len=5, csChange=1, result=5
3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
3-1:1.0: ch341_spi_transfer_low: len=2, csChange=1, result=2
3-1:1.0: ch341_spi_transfer_low: len=9, csChange=1, result=9
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=3, csChange=1, result=3
3-1:1.0: ch341_spi_transfer_low: len=9, csChange=1, result=9
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=4, csChange=1, result=4
3-1:1.0: ch341_spi_transfer_low: len=3, csChange=1, result=3 # Подключение BL602 к SX1262
Контакты определены здесь в файле [`include/sx126x-board.h`](include/sx126x-board.h).
Из файла [`include/sx126x-board.h`](include/sx126x-board.h):
```c
// Ниже приведены номера контактов для PineDio Stack BL604 с встроенным SX1262.
// TODO: Измените номера контактов для подключения вашего SX1262 к BL602 / BL604
#define SX126X_SPI_IDX 0 // Порт SPI 0
#define SX126X_SPI_SDI_PIN 0 // Контакт последовательных данных на входе (ранее MISO)
#define SX126X_SPI_SDO_PIN 17 // Контакт последовательных данных на выходе (ранее MOSI)
#define SX126X_SPI_CLK_PIN 11 // Контакт тактового сигнала
#define SX126X_SPI_CS_PIN 15 // Контакт выбора микросхемы
#define SX126X_SPI_CS_OLD 8 // Неиспользуемый контакт выбора микросхемы
#define SX126X_NRESET 18 // Контакт сброса
#define SX126X_DIO1 19 // DIO1
#define SX126X_BUSY_PIN 10 // Занятый контакт
#define SX126X_DEBUG_CS_PIN 5 // Контакт отладки выбора микросхемы, отражает высокое / низкое состояние контакта выбора микросхемы SX1262. Установите значение -1, если не требуется.
#define SX126X_TCXO_WAKEUP_TIME 5 // Время, необходимое TCXO для пробуждения (миллисекунды)
#define SX126X_SPI_BAUDRATE (200 * 1000) // Частота SPI (200 кГц)
Для передачи и приёма пакетов LoRa с помощью драйвера запустите демонстрационную прошивку sdk_app_lora
для BL602...
Вот пример журнала...
# create_task
# init_driver
SX126xReset
SX126xIoInit
SX126X interrupt init
SX126X register handler: GPIO 11
SX126xWakeup
SX126xGetDeviceId: SX1262
SX126xSetRfTxPower
SX126xGetDeviceId: SX1262
# send_message
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_TX_DONE
Tx done
# send_message
SX126xWakeup
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_TX_DONE
Tx done
# send_message
SX126xWakeup
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_TX_DONE
Tx done
# receive_message
SX126xWakeup
# RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_PREAMBLE_DETECTED
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_HEADER_VALID
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_RX_DONE
SX126xReadCommand
SX126xReadCommand
Rx done:
48 65 6c 6c 6f 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a
# receive_message
SX126xWakeup
# RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_PREAMBLE_DETECTED
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_HEADER_VALID
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_RX_DONE
SX126xReadCommand
SX126xReadCommand
Rx done:
48 65 6c 6c 6f 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a
# receive_message
SX126xWakeup
# RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_PREAMBLE_DETECTED
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_HEADER_VALID
RadioOnDioIrq
RadioIrqProcess
SX126xReadCommand
IRQ_RX_DONE
SX126xReadCommand
SX126xReadCommand
Rx done:
48 65 6c 6c 6f 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a
# receive_message
SX126xWakeup
RadioOnRxTimeoutIrq
Rx timeout
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )