Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить

Странные глюки SI4463 при приеме пакетов

Ср май 30, 2018 23:27:53

Уж не знаю что и делать. Проблема такая - по приему пакета вызывается прерывание, в нем выполняю такой код:
Код:
uint8_t Transceiver_HandleStatus(void)
{
    uint8_t ClearRX = 0;
    uint8_t PHStatus[1] = {0};
    uint8_t FIFOStatus[2] = {0};
    Transceiver_ReadRegs(Transceiver_GET_PH_STATUS, NULL, 0, PHStatus, 1, 1);
   
    if (PHStatus[Transceiver_PH_STATUS_PH_PEND] & Transceiver_PH_STATUS_PACKET_RX_PEND) {
        Transceiver_ReadRegs(Transceiver_FIFO_INFO, NULL, 0, FIFOStatus, 2, 1);
        if (FIFOStatus[0] > 0 && FIFOStatus[0] < 64) {
            Transceiver_ReadRXBuf(Transceiver_Data, FIFOStatus[0]);
#ifdef SAE_ENABLE_DEBUG
            dxprintf("RX %d:\n", FIFOStatus[0]);
            for (int i = 0; i < FIFOStatus[0]; i++) {
                dxprintf("%x ", Transceiver_Data[i]);
            }
            dxprintf("\n");
#endif
        } else {
            ClearRX = 1;
        }
    }
    if (PHStatus[Transceiver_PH_STATUS_PH_PEND] & Transceiver_PH_STATUS_PACKET_SENT_PEND) {
        ClearRX = 1;
    }
    if (ClearRX) {
        // Clear the RX buf
        uint8_t Params[1] = {0x03};
        Transceiver_ReadRegs(Transceiver_FIFO_INFO, Params, 1, FIFOStatus, 2, 1);
    }
    Transceiver_RxMode();

    return FIFOStatus[0];
}

Все работает отлично:
RX 23:
10 f0 cf 3 a9 db 1 11 20 8 18 1 80 8 3 c0 0 0 18 4f f 7a 7a
SetSyncWord: ec a2
RX 23:
10 f0 cf 3 a9 db 1 11 20 8 18 1 80 8 3 c0 0 0 19 f8 12 bb 7e

Это принятые пакеты. Где:
RX 23: это кол-во принятых байт;
Последние 4 байта - CRC32, пятый с конца это счетчик передатчика.
И так может продолжаться вечность.
Но только стоит мне отправить пакет, загрузить пакет в буфер TX и вызвать команду на отправку, как тут же происходит странный глюк - пакеты принимаются, но в буфере добавляется какой-то мусор ровно на длину отправленного пакета:
TX 12:
b 0 ec a2 1 a9 db 1 dd cc bb aa

TX 12: Отправили 12 байт.
И тут же при приеме читаем из буфера:
RX 35:
17 10 f0 cf 3 a9 db 1 11 20 8 1 80 8 3 c0 0 0 1a 21 34 f8 73 3 8f 55 99 75 5b 67 1c f9 89 fa 96
SetSyncWord: ec a2
RX 35:
17 10 f0 cf 3 a9 db 1 11 20 8 1 80 8 3 c0 0 0 1b 96 29 39 77 17 65 6b 5d 94 51 db b7 62 3a d7 c5

Причем первые 23 байта это реально наш правильный пакет, счетчик увеличивается, CRC считается, дальше до 35 байт уже идет мусор рандомный.
Если передернуть питание приемника (чтоб чип перезагрузить), то все опять встает на свои места.
Т.е. явно проблема не в передатчике.
Буферы TX/RX раздельные.
Как с этим бороться я уже не знаю.

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 11:54:55

greeka писал(а):Как с этим бороться я уже не знаю.

Переписать программу по нормальному))

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 12:11:48

Это да, но где накосячил - не понятно :)
Почему у меня меняется длинна данных в RX буфере после отправки данных? Более того дополняется мусором каким-то.

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 14:13:12

Конкретно с SI4463 не работал, но все модули работают одинаково))
greeka писал(а):Почему у меня меняется длинна данных в RX буфере после отправки данных? Более того дополняется мусором каким-то.

Ну зничит размер буфера RX больше буфера TX... ))
буфер.jpg
(24.83 KiB) Скачиваний: 611

Передатчик передаёт 23 байта (согласно размеру своего буфера), а приёмник принимает 35 байт (согласно размеру своего бефера).

Это не мусор, а просто шум приёмника. Передатчик передал 23 байта и отключился. А приёмник продолжает принимать шум эфира - Белый шум. https://ru.wikipedia.org/wiki/Белый_шум
Получаем в буфере приёмника случайный набор цифр)).
greeka писал(а):Как с этим бороться

Сделать чтобы буфера RX был равен буферу TX.
Как в вашем случае это сделать... я без понятия)) Никакие библиотеки и дефайны я не использую. И вот эту фигню printf("\n"); и т.д.... я тоже не использую)) :)))

Я работаю напрямую с регистрами радиомодуля... Тупо все регистры забиваю вручную, согласно таблице регистров...
карта регистров_2.jpg
(179.6 KiB) Скачиваний: 652

Поэтому у меня таких проблем нет))

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 14:23:27

Я тоже до этого работал со многими чипами и таких косяков не наблюдал.
У меня все самописное, никаких библиотек нет. В регистры модуля вы сами ничего записать не можете, только через SPI.
Буферы там по 64 байта, их нельзя ни уменьшить ни увеличить они в чипе так сделаны. Разве что их можно объединить, но такая настройка отключена.
Я сначала думал что проблема из-за переменной длинны пакета, но оказалось это не так. Выставил фиксированную длину на приемнике и передатчике и все равно косяк повторяется. Приемник принимает пакеты нормально до тех пор, пока не передать что-то. Потом прием ломается.
Почему даже при фиксированной длинные пакета чип после приема начинает выдавать другую длину пакета это загадка.
Смотрел по SPI сигналы, думал может где что-то перекрываю, но нет. Все соблюдено как положенно.

Смущает то, что чип старой ревизии, не последней. Но в ерарте нет ничего такого.

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 15:09:16

greeka писал(а):В регистры модуля вы сами ничего записать не можете, только через SPI.

я про это и говорю)) всё через стандартный SPI...
SPI.jpg
(75.21 KiB) Скачиваний: 300

Интерфейс SPI позволяет считывать / записывать регистры...
greeka писал(а):Буферы там по 64 байта, их нельзя ни уменьшить ни увеличить они в чипе так сделаны.

Буферы ни уменьшить ни увеличить нельзя, но можно задать верний порог «RX_FIFO_FULL». Когда входящие данные RX достигают вернего порога, будет сгенерировано прерывание через вывод nIRQ. А ещё есть "очистка" RX FIFO (командой «FIFO_RESET»).

А в нормальных модулях есть стандартный Length (длина пакета)...
Length.jpg
(19.78 KiB) Скачиваний: 492

Что-то в SI4463 это не наблюдаю...

Лучше всё протестировать в железе, работу буфера при разных пакетах... Есть подозрение, что там буфер чуть чложнее... В других чипах есть варианты для разных пакетов, которые будут сохранены в FIFO...
FIFO 1.jpg
(34.61 KiB) Скачиваний: 483

FIFO 2.jpg
(50.22 KiB) Скачиваний: 229

Короче надо повнимательней разобраться с обработчиком пакетов в SI4463...))
Последний раз редактировалось roman.com Чт май 31, 2018 15:18:58, всего редактировалось 1 раз.

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 15:15:06

Все там есть, только в другой форме. Настроек конечно куча, но настраиваю через утилиту. Она генерит конфиг.
Странность еще в том, что если поменять местами передатчик с приемником - т.е. как бы один мастер, другой слейв, а потом наоборот, то проблема исчезает... Устройства идентичные. Прошивки тоже. Мистика.

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 15:32:05

Утилиты всякие..)) можно, только если свои, а не чужие))

А ещё были случаи из-за плохого питания или помех по шлейфу SPI модули тупо висли... сбивались настройки... Хотя мало вероятно что собъётся настройка приёмного буфера...

А откуда вообще в приёмном буфере может буть шум, если там включена проверка CRC ? ))
FIFO 2.jpg
(50.22 KiB) Скачиваний: 495

Это уже полные глюки..))

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 16:31:02

Шум после CRC. Я же выше привел дампы.
Тоже грешил на глюки SPI но не похоже. Анализатор показывает что все корректно ходит.

Добавлено after 36 minutes 25 seconds:
Вообщем фигня в том, что при настройке фиксированной длинны пакета он ее не берет из ранее сохраненного конфига. Т.е. нужно эту длину передавать каждый раз при запуске режима RX. Хотя в доке написано что должен брать.
Ну и как быть с переменной длинной вообще не понятно. Разве что самому это хэндлить.

Re: Странные глюки SI4463 при приеме пакетов

Чт май 31, 2018 21:35:27

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

Re: Странные глюки SI4463 при приеме пакетов

Пт июн 01, 2018 00:15:24

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

Да, я ваш мануал прочитал вдоль и поперек, спасибо, но ответа там нет.
А он оказался прост: подефолту чип шарит настройки TX и RX и при отправке пакета указанной длинны, эта самая длинна меняется для всего конфига и в дальнейшем при приеме пакета берется длинна отправленного пакета...

Re: Странные глюки SI4463 при приеме пакетов

Пт июн 01, 2018 00:35:17

Ну так а я сразу сказал...
roman.com писал(а):Переписать программу по нормальному))

))
И вообще... я обычно на меняю длину пакетов. Один раз прикинул какие надо пакеты для передачи данных и всё))
А если надо передать меньше пакет, то автоматом дописываем нули ... 000000000000000.... "выравнивание".
А если надо передать больше пакет, то автоматом включается "фрагментация".
Обычные сетевые технологии... А зато не надо себе забивать голову настройками длины пакета))
:tea:

Re: Странные глюки SI4463 при приеме пакетов

Пт июн 01, 2018 14:24:48

А если надо сохранить батарейку то начинаешь извращаться по полной...

Добавлено after 9 hours 58 minutes 5 seconds:
Но все же хрень с приемом пакетов переменной длинны не заборолась.
Ser60, если есть возможность - можете пояснить в чем может быть причина? Данные:
Пакет от передатчика:
RX 0 6:
05 00 aa bb cc dd

Приемник настроен на прием одного пакета с фиксированной длинной и CRC. Все получаем.
Пакет как у вас в примере, первый байт 05 - заголовочный для поля длины.
Далее включаю прием пакетов переменной длины:
2018-06-01_1207.png
(57.86 KiB) Скачиваний: 520

И ничего не получаю.. Даже прерывания не приходит...
Что может быть не так?

Добавлено after 10 minutes 42 seconds:
Настройки регистров:
Код:
PKT_CONFIG1 - 0x02

PKT_LEN - 0x2A
PKT_LEN_FIELD_SOURCE - 0x01
PKT_LEN_ADJUST - 0
PKT_TX_THRESHOLD - 0x30
PKT_RX_THRESHOLD - 0x30
PKT_FIELD_1_LENGTH_12_8 - 0
PKT_FIELD_1_LENGTH_7_0 - 0x01
PKT_FIELD_1_CONFIG - 0x04
PKT_FIELD_1_CRC_CONFIG - 0x82
PKT_FIELD_2_LENGTH_12_8 - 0
PKT_FIELD_2_LENGTH_7_0 - 0x05
PKT_FIELD_2_CONFIG - 0



Добавлено after 3 hours 1 minute 38 seconds:
Разобрался сам... Ну и накрутили блин в чипе.
В доке написано про длина переменного пакета берется из поля PKT_FIELD_1_LENGTH при условии что:
These properties are applicable in RX mode only under the following conditions: a) RX Packet Handling is enabled by clearing PKT_CONFIG1:PH_RX_DISABLE, and b) The START_RX command is sent with the parameter RX_LEN=0, and c) PKT_CONFIG1:PH_FIELD_SPLIT is cleared.
Ну я так и настраивал. А еще так же настраивает конфигурилка Силабовская. Но у меня упорно не хотело так работать пока я не продублировал настройки в регистры PKT_RX_FIELD_X_LENGTH и не включил разделение TX/RX.
Вообщем заработало у меня это все добро...
Но, сцуко, времени убил дофига.
Всем неравнодушным спасибо.
Ответить