Например TDA7294

Форум РадиоКот • Просмотр темы - rfm22b/rfm23b как грамотно получить RSSI?
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс дек 14, 2025 22:19:19

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Ср апр 03, 2013 18:10:01 
Открыл глаза

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Сообщений: 73
Откуда: Крым, Ялта
Рейтинг сообщения: 0
У меня возникли некоторые сложности при получении RSSI у данного модуля (rfm23b)
инициализирую так(приемник):
Код:
write(0x05, 0);      // правильно?!
write(0x06, 64);   // Valid preamble interrupt

Вот только этот хад(модуль) генерирует прерывание, когда второй модуль ничего не передает:
статус девайса 33(RX State+RX FIFO Empty Status)
int status1: 160 (TX FIFO Almost Empty+FIFO Underflow/Overflow Error)
int status2: 3 (icrcerror+ipkvalid)

Цитата:
ipkvalid: Will be set upon full and correct reception of a packet (no RX abort). It is not automatically
cleared by simply re-entering RX mode, but is only cleared upon detection of a valid Sync
Word in the next RX packet. Packet Valid functionality is not available if the RX Packet
Handler (enpacrx bit D7 in SPI Reg 30h) is not enabled.

icrcerror: Will be set if the CRC computed during RX differs from the CRC sent in the packet by the
TX. It is cleared upon start of data reception in a new packet. CRC functionality is not
available if the RX Packet Handler (enpacrx bit D7 in SPI Reg 30h) is not enabled.


Но это только полбеды, я читаю статус, если "status&1 == 0", значит модуль уже не в режиме приема, что означает что данные приняты, читаю пакет, все норм, читаю RSSI.....беда!
Значение RSSI - 40-60(причем если прочиталось "вовремя", значение верное, т.е. около 200).

То есть, чтобы прочитать RSSI, нужно повесить обработчик прерывания? Так?
Но ведь это катастрофа(я про быстродействие), внутри этого прерывания нужно проверять "статус" или "длину пакета", или еще что-то, а, ведь, данные идут через SPI (что не так уж и быстро), и только убедившись что прошло то, что нужно, читать RSSI...

А если есть другие прерывания? Разрешать прерывания при входе в это прерывание??!

Уже несколько дней бьюсь над этим вопросом....

То есть вопрос такой: Как получить данные rssi?(по возможности не используя прерывание/или учитывать что есть и другие прерывания)

Помогите пожалуйста... Уже не знаю, что делать....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Ср апр 03, 2013 19:25:04 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 43
Зарегистрирован: Пт апр 15, 2011 21:11:22
Сообщений: 748
Откуда: Россия
Рейтинг сообщения: 0
не совсем понял что это за сравнение ""status&1 == 0"" может "status&1 = 0" ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Ср апр 03, 2013 20:00:51 
Открыл глаза

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Сообщений: 73
Откуда: Крым, Ялта
Рейтинг сообщения: 0
нуу, "status" это регистр статуса =)
Код:
read(RFM22B_REGISTER_DEVICE_STATUS) & 1) == 0

или
Код:
read(0x02) & 1) == 0

он возвращает "33" (см выше)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Ср апр 03, 2013 23:27:16 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 43
Зарегистрирован: Пт апр 15, 2011 21:11:22
Сообщений: 748
Откуда: Россия
Рейтинг сообщения: 0
Даташит на модуль стр.57 пункт 8.10. RSSI and Clear Channel Assessment

"For CCA, threshold is programmed into rssith[7:0] in "Register 27h. RSSI Threshold for Clear Channel Indicator."
After the RSSI is evaluated in the preamble, a decision is made if the signal strength on this channel is above or
below the threshold. If the signal strength is above the programmed threshold then the RSSI status bit, irssi, in
"Register 04h. Interrupt/Status 2" will be set to 1. The RSSI status can also be routed to a GPIO line by configuring
the GPIO configuration register to GPIOx[3:0] = 1110."


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Чт апр 04, 2013 09:38:34 
Открыл глаза

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Сообщений: 73
Откуда: Крым, Ялта
Рейтинг сообщения: 0
Спасибо, как-то не обратил на это внимание.... :(
1) ога, т.е. можно заставить можно дрыгать ногой GPIOx, при детектировании RSSI, но читать нужно СРАЗУ(т.е. использовать прерывание).
2) Я имею в виду: я не могу получить что-то вроде "RSSI последнего принятого пакета"? Я все верно понимаю?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Чт апр 04, 2013 12:27:51 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 43
Зарегистрирован: Пт апр 15, 2011 21:11:22
Сообщений: 748
Откуда: Россия
Рейтинг сообщения: 0
там выше написано что вероятность ошибки не велика

помоему просто читать
Код:
void SPI_RFM_INTREAD(void)
{
char temp;
SPI_WRITE(0x07, 01);    //
//temp=SPI_READ(0x03);    //read the Interrupt Status1 register
temp=SPI_READ(0x04);  //read the Interrupt Status2 register
SPI_WRITE(0x07, 05);
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Чт апр 04, 2013 19:29:50 
Открыл глаза

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Сообщений: 73
Откуда: Крым, Ялта
Рейтинг сообщения: 0
быть может, я недостаточно четко выразил проблему.....
есть главный цикл:
Код:
//здоровенное прерывание...
//это прерывание ТАКЖЕ считает МИЛЛИСЕКУНДЫ!
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
//много-много всего(есть зависимость от RSSI)
}
void main(void)
{
while(1)
 {
 unsigned char val=0,someVar=0;
 /*
 МНОГО-МНОГО всякого!
 
 */
 someVar={что-то там}

//тут, если я делаю
if ((NIRQ_PIN & (1<<NIRQ_BIT) == 0 && (read(RFM22B_REGISTER_DEVICE_STATUS) & 1) == 0)
{
//и получаю RSSI
rssi = read(RFM22B_REGISTER_RSSI);
//Значение RSSI ДАЛЕКО НЕ ВСЕГДА верное...
}
 var = rssi*someVar;
 }
}

т.е., нужно использовать прерывание, в котором(!) использовать чтение через SPI(которое ОЧЕНЬ медленное)
или разрешать прерывания при входе в прерывание....

то есть проблема: Есть куча кода и другие прерывания, и вот в этих КАТОРЖНЫХ (для МК) условиях, нужно из этого ГАДА(Радиомодуля) выудить ПРАВИЛЬНЫЕ данные RSSI...

upd: хммм.....или я ошибаюсь?....
upd2: странно, кажись, заработало.... почему?! - Непонятно!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Пт апр 05, 2013 12:18:19 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 43
Зарегистрирован: Пт апр 15, 2011 21:11:22
Сообщений: 748
Откуда: Россия
Рейтинг сообщения: 0
может тебе читать RSSI в начале твоей процедуры
interrupt [TIM0_COMP] void timer0_comp_isr(void)
раз там есть зависимость от RSSI ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: rfm22b/rfm23b как грамотно получить RSSI?
СообщениеДобавлено: Пт апр 05, 2013 13:11:23 
Открыл глаза

Карма: 1
Рейтинг сообщений: 0
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Сообщений: 73
Откуда: Крым, Ялта
Рейтинг сообщения: 0
не пойдет, прерывание должно успевать отрабатываться менее чем за 100нс...
однако, все заработало...
т.е. модуль после приема чудесно сохраняет данные RSSI! Видимо, после приема можно читать только статус... а что-то другое может "сбить" rssi?
сейчас чудесно работает:
Код:
RFM22B_rxMode();
while(1)
{
if(NIRQ_LOW && (RFM22B_getStatus() & 1) == 0 )//принял
 {
 rssi = RFM22B_getRSSI();
  for(i=0; i<PKTSIZE; i++)
  {
  RX_BUF[i] = RFM22B_RegisterRead(RFM22B_REGISTER_7F_FIFO_ACCESS);
  RX_BUF[i+1] = '\0';
  }
  RFM22B_rxMode();
 }
}

upd: нет, все же это кошмар!
upd2: видимо, если после перехода в режим отправки, пришло 2 пакета, то rssi - в хлам!
upd3: ммда, видимо, RSSI нужно получить ТОЛЬКО СРАЗУ после получения пакета...
upd4: т.е. если использовать вышеуказанный код, RSSI вернО, однако, если его модифицировать:
Код:
RFM22B_rxMode();
while(1)
{
if(NIRQ_LOW && (RFM22B_getStatus() & 1) == 0 )//принял
 {
 delay_ms(1000);//при том, что пакеты идут с задержкой 100мс
 rssi = RFM22B_getRSSI();
  for(i=0; i<PKTSIZE; i++)
  {
  RX_BUF[i] = RFM22B_RegisterRead(RFM22B_REGISTER_7F_FIFO_ACCESS);
  RX_BUF[i+1] = '\0';
  }
  RFM22B_rxMode();
 }
}

rssi получается равным НУЛЮ!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y