|
СС1101, устранение коллизий |
|
|
|
Feb 1 2014, 16:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
Разработал и изготовил 4 устройства на сс1101: устройства A1,A2,A3 посылают на устройство B пакеты, а устройство B квитирует их (передает своему Ax короткий пакет подтверждения). Все работает до тех пор, пока не наступит момент, когда два устрйства Ax пытаются передать свои пакеты одновременно (ну или почти одновременно, тактирование от внутреннего RC STM32F051). В этом случае устройство B "зависает", т. е. его сс1101 не может принять пакет от любого Ax. Помогает только сброс/переинициализация устройства В. Сейчас усложнять протокол тайм-слотами нет времени, хотелось бы разобраться как можно выявить эту ситуацию коллизии в устройстве В с помощью регистров сс1101 и просто по этому событию перегрузить трансивер. Если такая возможность есть, подскажите в какую сторону смотреть?
|
|
|
|
|
Feb 2 2014, 08:16
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата при одновременном/последовательном приеме нескольких пакетов устройство В вываливается в IDLE режим. Так это причина известная. И она не связана с одновременной работой с несколькими модулями. Борюсь следующим образом - в один из моментов, когда трансивер точно должен быть в приеме вызываю следующую функцию Код void CCxx00_monitoring() { MARCSTATE=TI_CC_SPIReadStatus(TI_CCxxx0_MARCSTATE); if (MARCSTATE !=0x0D) { TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); TI_CC_SPIStrobe(TI_CCxxx0_SFRX); TI_CC_SPIStrobe(TI_CCxxx0_SRX); errors++; } } За сутки набегает до 10 ошибок, к зависанию не приводит.
|
|
|
|
|
Feb 2 2014, 09:17
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
Цитата(Salamander @ Feb 2 2014, 12:16)  Так это причина известная. И она не связана с одновременной работой с несколькими модулями. За сутки набегает до 10 ошибок, к зависанию не приводит. Я тоже об этом подумал - отслеживать состояние по регистру MARCSTATE. Единственное, не нравится постоянный поллинг к кристаллу - время реакции на другие события в программе критично. Кроме того в руководстве написано, что поллинг в режиме RX нежелателен, т. к. чувствительность приемника деградирует... Хорошая мысль: устройства Ax должны использовать CCA перед началом "общения", если канал занят, это "общение" откладывается. В приемнике B режим RX включен все время (главный цикл) и отслеживается состояние GDO0, по 1 на этом пине в RXFIFO имеем пакет с верным адресом и верным CRC. По уровню GDO0=1 трансивер автоматом переходит в IDLE. Далее пакет обрабатывается, переходим в режим TX, отправляем квитанцию для конкретного Ax и опять автоматом переходим в IDLE. Наконец, переходим в RX. Выходим в главный цикл программы с ожиданием нового состояния GDO0=1.
|
|
|
|
|
Feb 2 2014, 09:34
|

Частый гость
 
Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747

|
Посмотрите эррату, для 64 байт может быть похожий косяк с зависанием.
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Feb 2 2014, 14:59
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
Написал функцию восстановления RX режима (все же решил использовать статус байт стробом SNOP) - теперь все работает прекрасно. Цитата Так это причина известная. И она не связана с одновременной работой с несколькими модулями. Просто раздирает любопытство, почему не связано с одновременной работой модулей? ИМХО, приемник может находится в режиме RX сколь угодно долго, если RX timeout не запрограммирован. У меня он вылетает в IDLE исключительно при коллизиях... Теперь занялся реализацией CCA на устройствах Ax. Сейчас они просто начинают передачу по стробу STX и CCA отключен. Если его включить, то как я понимаю, нужно при желании начать передачу пакета сначала перейти в режим RX чтобы прослушать канал ("получить данные" CCA) и только потом начать передачу пакета. Вопрос: каково должно быть минимальное время нахождения в RX чтобы данные по CCA были валидны?
|
|
|
|
|
Feb 2 2014, 15:24
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Код Просто раздирает любопытство, почему не связано с одновременной работой модулей? Элементарно, Ватсон, у меня работает один модуль и проблема имеет место быть.
|
|
|
|
|
Feb 2 2014, 15:30
|

Частый гость
 
Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747

|
Цитата Так это причина известная. Нигде о подобном не слышал, самому дико любопытно, хотя с зависаниями сталкивался, но так и не выяснил их природу. Да, надо включать RX, у меня был включен переход автоматом на RX. Слушает среду недолго, если там тихо, а так почти всегда, только если в упор никто не вещает без умолку, сразу в передачу. У меня полное время передачи занимало 10-20 мс., т.е. с прослушиванием, подготовкой в TX и передачей в эфир 20 байт на 10к. Несколько мс. должно быть достаточно.
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Feb 2 2014, 15:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
Цитата Элементарно, Ватсон, у меня работает один модуль и проблема имеет место быть. Сидел час отладчиком на приемнике B - не обнаружил ни единого вылета в IDLE при единственном передающем Ax. Как только передают несколько Ax сразу хорошо видно как передаваемые пакеты все ближе и ближе во времени становятся друг к другу и, в определенный момент ловлю вылет в IDLE на устройстве B. Очень интересная ситуация, выяснить бы, откуда ноги растут... Цитата(Mihey_K @ Feb 2 2014, 19:30)  Да, надо включать RX, у меня был включен переход автоматом на RX. Слушает среду недолго... Дело в том, что мои устройства Ax - приборы с батарейным питанием, которые раз в минуту передают данные устройству B. Ясно, что для экономии батарейки время передачи и вообще активности нужно стремить к нулю. Даже протокол я построил вокруг этого требования. Поэтому, из режима сна нужно было бы сразу начинать передачу. Но после подключения CCA ясно, что сначала нужно прослушать канал. Все же сколько времени слушать??? Думаю миллисекунды - это много, предположительно - не более 1ms... Запрограммировал GDO1=0x09 на индикацию CCA но это ничего не решает - при переходе SLEEP->IDLE->RX неясно, когда данные на ноге GDO1 будут валидны... P.S. Вот, надумал: время нахождения в RX должно быть примерно: T = T1 + T2, где T1 - время перехода SLEEP->IDLE->RX, T2 - время приема примерно ДВУХ байт на текущей скорости. У мну скорость 1200 бод/сек., т. е. время T = 1ms вроде должно быть оптимально минимальным )))
|
|
|
|
|
Feb 2 2014, 16:11
|

Частый гость
 
Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747

|
1 мс. хватит. Можно проверить имперически: выставить порт в 1 на входе IDLE->RX и сбросить уже в прерывании CCA. Глянуть осциллом. Боитесь, что будет долго слушать эфир и жрать батарею? Заведите таймер на требуемое максимальное время прослушивания эфира, при входе в IDLE->RX запускайте его, в прерывании CCA останавливайте. Если CCA висит долго, то оказываемся в прерывании таймера, где выключаем таймер и переводим радио в IDLE и вообще усыпляем систему на таймаут...и так далее. Похоже, что у Вас сбор с датчиков, тогда вообще нет смысла собирать данные примерно в одно время, разграничьте время пробуждения Ax случайными задержками. Цитата Элементарно, Ватсон, у меня работает один модуль и проблема имеет место быть. В том-то и дело, что это элементарно, когда работает 1 модуль. Видать что-то неправильно настроено.
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Feb 2 2014, 16:40
|

Профессионал
    
Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807

|
Цитата Похоже, что у Вас сбор с датчиков, тогда вообще нет смысла... Именно так! Сбор с датчиков. Причем если приемник B не примет очередной пакет - ничего страшного по ТЗ не произойдет. Тогда встает вопрос, что меньше сожрет батарею при пробуждении датчика с необходимостью передать данные: 1. Слушаем канал, режим RX, 1ms. Если занят - не передаем пакет, иначе - передаем. 2. Да нафик этот CCA, просто сразу передаем - и все. Нужно все же делать тайм-слоты... Сдается мне, что вариант 2 здесь более бережет батарейку...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|