реклама на сайте
подробности

 
 
> Непонятное поведение сс1101, при одновременном получении двух пакетов
termik
сообщение Jan 28 2017, 04:22
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 87
Регистрация: 25-03-13
Из: Москва
Пользователь №: 76 196



Привет. Я использую сс1101 в режиме фиксированной длины пакета. Опрашиваю GDO0 в режиме 0х07(вверх при получении корректного пакета, вниз при чтении из RXFIFO)
Значит, наблюдения такие.
Опыт 1.
Настраиваю модуль на автоматический переход в IDLE после приема пакета, и опрашиваю его вот так. Сори за магические числа, пока нет времени все задефайнить нормально, ну я думаю для тех, кто работал с модулем, всё более-менее наглядно и так.
Код
while(1)
    {
        while(!(GDO_GPIO->IDR & GDO0_Pin));
        
        cc1101_read_burst_fifo(dat, WIRELESS_DATA_BYTES_PER_PARCEL);
        cc1101_command_strobe(CC1100_SFRX);
        cc1101_command_strobe(CC1100_SRX);
        while((cc1101_read_status_register(CC1100_MARCSTATE) & 0x1F) != 0x0D);
    }

... и сталкиваюсь с тем, что если два передатчика синхронно шлют пакет, прием "зависает". Подключаюсь отладчиком, смотрю - висит в цикле опроса GDO0. Ломал два часа голову, пока не догадался посмотреть статус cc1101 в бесконечном цикле, а она - в IDLE. Какого-то черта после того, как она уже гарантированно переключилась в RX, в конце большого цикла, опять оказывается в IDLE, причем без дерганья GDO.
Опыт 2.
Ставлю костыль
Код
while(1)
    {
        while(!(GDO_GPIO->IDR & GDO0_Pin))
        {
            if((cc1101_read_status_register(CC1100_MARCSTATE) & 0x1F) != 0x0D)
            {
                cc1101_command_strobe(CC1100_SRX);
                while((cc1101_read_status_register(CC1100_MARCSTATE) & 0x1F) != 0x0D);
            }
            vTaskDelay(5);
        }
        
        cc1101_read_burst_fifo(dat, WIRELESS_DATA_BYTES_PER_PARCEL);
        cc1101_command_strobe(CC1100_SFRX);
        cc1101_command_strobe(CC1100_SRX);
        while((cc1101_read_status_register(CC1100_MARCSTATE) & 0x1F) != 0x0D);
    }

... и "все работает", не считая того, что я чешу репу в недоумении, а по spi идет мусорный обмен каждые 5мс, плюс на 5мс уменьшилась отзывчивость.
Опыт 3.
Отключаю автоматический переход в idle после приема пакета, и делаю это ручками.
Код
while(1)
    {
        while(!(GDO_GPIO->IDR & GDO0_Pin));
        
        cc1101_command_strobe(CC1100_SIDLE);
        while((cc1101_read_status_register(CC1100_MARCSTATE) & 0x1F) != 0x01);
        
        cc1101_read_burst_fifo(dat, WIRELESS_DATA_BYTES_PER_PARCEL);
        cc1101_command_strobe(CC1100_SFRX);
        cc1101_command_strobe(CC1100_SRX);
        while((cc1101_read_status_register(CC1100_MARCSTATE) & 0x1F) != 0x0D);
    }

... и всё работает отлично.

Не пойму такое поведение сс1101, это баг или фича?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 19:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016