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

Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт янв 12, 2017 14:13:48

Сообщение greeka »

Уж не знаю что и делать. Проблема такая - по приему пакета вызывается прерывание, в нем выполняю такой код:

Код: Выделить всё

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 раздельные.
Как с этим бороться я уже не знаю.
Реклама
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

greeka писал(а):Как с этим бороться я уже не знаю.
Переписать программу по нормальному))
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт янв 12, 2017 14:13:48

Сообщение greeka »

Это да, но где накосячил - не понятно :)
Почему у меня меняется длинна данных в RX буфере после отправки данных? Более того дополняется мусором каким-то.
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Конкретно с SI4463 не работал, но все модули работают одинаково))
greeka писал(а):Почему у меня меняется длинна данных в RX буфере после отправки данных? Более того дополняется мусором каким-то.
Ну зничит размер буфера RX больше буфера TX... ))
буфер.jpg
(24.83 КБ) 643 скачивания
Передатчик передаёт 23 байта (согласно размеру своего буфера), а приёмник принимает 35 байт (согласно размеру своего бефера).

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

Я работаю напрямую с регистрами радиомодуля... Тупо все регистры забиваю вручную, согласно таблице регистров...
карта регистров_2.jpg
(179.6 КБ) 697 скачиваний
Поэтому у меня таких проблем нет))
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт янв 12, 2017 14:13:48

Сообщение greeka »

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

Смущает то, что чип старой ревизии, не последней. Но в ерарте нет ничего такого.
Реклама
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

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

А в нормальных модулях есть стандартный Length (длина пакета)...
Length.jpg
(19.78 КБ) 523 скачивания
Что-то в SI4463 это не наблюдаю...

Лучше всё протестировать в железе, работу буфера при разных пакетах... Есть подозрение, что там буфер чуть чложнее... В других чипах есть варианты для разных пакетов, которые будут сохранены в FIFO...
FIFO 1.jpg
(34.61 КБ) 518 скачиваний
FIFO 2.jpg
(50.22 КБ) 265 скачиваний
Короче надо повнимательней разобраться с обработчиком пакетов в SI4463...))
Последний раз редактировалось roman.com Чт май 31, 2018 15:18:58, всего редактировалось 1 раз.
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт янв 12, 2017 14:13:48

Сообщение greeka »

Все там есть, только в другой форме. Настроек конечно куча, но настраиваю через утилиту. Она генерит конфиг.
Странность еще в том, что если поменять местами передатчик с приемником - т.е. как бы один мастер, другой слейв, а потом наоборот, то проблема исчезает... Устройства идентичные. Прошивки тоже. Мистика.
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

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

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

А откуда вообще в приёмном буфере может буть шум, если там включена проверка CRC ? ))
FIFO 2.jpg
(50.22 КБ) 530 скачиваний
Это уже полные глюки..))
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт янв 12, 2017 14:13:48

Сообщение greeka »

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

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

Сообщение Ser60 »

Почитайте здесь про конфигурирование Si446х для работы с пакетами переменной длины.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт янв 12, 2017 14:13:48

Сообщение greeka »

[uquote="Ser60",url="/forum/viewtopic.php?p=3389894#p3389894"]Почитайте здесь про конфигурирование Si446х для работы с пакетами переменной длины.[/uquote]
Да, я ваш мануал прочитал вдоль и поперек, спасибо, но ответа там нет.
А он оказался прост: подефолту чип шарит настройки TX и RX и при отправке пакета указанной длинны, эта самая длинна меняется для всего конфига и в дальнейшем при приеме пакета берется длинна отправленного пакета...
Друг Кота
Сообщения: 9595
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Ну так а я сразу сказал...
roman.com писал(а):Переписать программу по нормальному))
))
И вообще... я обычно на меняю длину пакетов. Один раз прикинул какие надо пакеты для передачи данных и всё))
А если надо передать меньше пакет, то автоматом дописываем нули ... 000000000000000.... "выравнивание".
А если надо передать больше пакет, то автоматом включается "фрагментация".
Обычные сетевые технологии... А зато не надо себе забивать голову настройками длины пакета))
:tea:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт янв 12, 2017 14:13:48

Сообщение greeka »

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

Добавлено 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 КБ) 562 скачивания
И ничего не получаю.. Даже прерывания не приходит...
Что может быть не так?

Добавлено 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.
Вообщем заработало у меня это все добро...
Но, сцуко, времени убил дофига.
Всем неравнодушным спасибо.
Ответить

Вернуться в «Радиотехника: приемники, передатчики, антенны»