Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
20.05.2018, 02:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: #include - оптимальное использование директивы
Да мне прерывание одно надо не пропустить. Я в нем контролирую таймер. Если импульс пришёл вовремя, то таймер сбрасывается. Если не вовремя - тикает дальше.
|
|
|
|
03.06.2018, 05:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: #include - оптимальное использование директивы
Сообщение от Исбанни
|
nRF24L01, да?
|
А кто как калибрует PLL в режиме передачи? В даташите говорится, что это надо делать каждые 4 мс. В режим приемника перейти? Если выключать питание, то очень долго включаемся обратно.
|
|
|
|
03.06.2018, 07:30
|
|
Прописка
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
|
Re: #include - оптимальное использование директивы
Это где вы такое нашли то у nRF24L01? У него и регистра то такого нету.
Регистр RF_SETUP имеет биты для установки мощности передатчика, для настройки скорости радиообмена (1 или 2 Мбит/с), для включения усилителя приемника и для принудительного включения PLL, которое делается только для теста передачи-приема.
Про "4 мс" дана рекомендация "не оставаться в режиме передатчика более 4 мс за один раз", что в принципе всегда выполняется при передаче одного пакета максимальной длины на минимальной скорости (1 Мбит/с).
То есть как бы общая рекомендация - не передавайте много данных за один раз, когда работаете с передачей без ACK. Расчет времени передачи пакета приведен в даташите.
При работе с ACK после каждого пакета происходит переключение TX-RX и повторная операция PLL lock, поэтому условие "не более 4 мс" всегда выполняется.
Последний раз редактировалось Исбанни; 03.06.2018 в 08:01.
|
|
|
|
03.06.2018, 16:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: #include - оптимальное использование директивы
Судя по картинке из даташита, в режим приемника и в режим передатчика (при условии наличия в FIFO данных) мы попадаем через режим RX/TX Settings, в котором происходит калибровка PLL, на что уходит 130 uS. И в течение эти 130 uS ничего с трансивером делать нельзя - просто ждать. У меня сейчас сделано так - сижу в Power Down -› заношу в регистр pwr_up = 1 -› взвожу собаку на 16 мс и ухожу в сон -› через 16 мс просыпаюсь и заношу в FIFO данные, далее следующая конструкция:
Код:
|
nRF_GO();
do{
nRF_SELECT();
SPI_WriteByte(nRF_RD_REG(nRF_STATUS));
Status = SPI_ReadByte(nRF_NOP);
nRF_DESELECT();
}while((Status & nRF_IRQ_MASK) == 0);
nRF_STOP(); |
сбрасываю все флаги прерываний
Код:
|
Buf[0] = Status;
SPI_WriteArray(nRF_WR_REG(nRF_STATUS), 1, Buf); |
-› заношу в регистр pwr_up = 0 -› ухожу в сон
С активированным ACK и количеством попыток передачи 15 раз через 250 uS всё это работает. Хост ACK не передаёт, поэтому все 15 раз идёт передача пакета. Теперь же хочу передавать пакеты максимально быстро. Получается, что работать надо по такому кругу (без ACK):
сидим в StandByI -› записываем данные в FIFO -› дергаем ногу CE -› не менее, чем через 10 uS ногу CE отпускаем -› если FIFO пуст и мы успели ногу CE отпустить, то круг замкнулся.
И вот тут появляются вопросы. Если FIFO не пуст, нога CE не опущена, в какой режим уйдет трансивер? Опустошит FIFO и уйдет в StandByII? Ну судя по картинке из даташита. Ежели мы попали в StandBYII и отпустили ногу CE, трансивер так и останется в этом режиме?
Как я понял, разница между режимам StandByI и StandByII следующая - в первом режиме для передачи дернуть ногу CE можно импульсом, во втором случае её надо держать. Но к моменту окончания передачи её надо отпустить, чтобы уйти в более экономичный StandByI.
В связи с этим вопрос - если ACK не активирован, то при окончании передачи взведётся ли флаг TX_DS? Ежели отслеживать флаг TX_EMPTY и по нему скидывать CE, то трансивер неизбежно уйдет в StandByII?
Получается, самое надёжное - это дергать CE таймером? Т.к. 130 uS неизбежно уходит на калибровку петли ФАПЧ, то и задний фронт импульса можно подзатянуть по времени.
А что, если поступиться энергопотреблнием и работать по такому кругу:
CE всегда =1, а мы просто закидываем данные в FIFO. Трансивер, судя по картинке, должен сам крутиться по кругу - StandByII -› TX_settings -› TX mode -› StandByII. Т.к. пребывание трансивера в режиме StandByII минимально - буквально то время, в течение которого центральный МК опрашивает флаг TX_EMPTY (либо обработка прерывания IRQ, если флаг TX_DS всё-таки взводится), а львиную долю времени это будет режим TX settings и TX Mode, то и загоняться по поводу энергопотребления не стоит.
Ну вот такие мысли, хоть и мимо темы абсолютно =)
|
|
|
|
03.06.2018, 16:25
|
|
Прописка
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
|
Re: #include - оптимальное использование директивы
Да нет там калибровки, там эти 130 мкс уходят просто на запуск и получение стабильной генерации PLL, как и в любом другом PLL.
А что касается "ждать", то модуль умеет генерировать прерывание TX_DS по окончанию передачи в эфир (и подтверждению, если оно включено).
Короче говоря, разрешаете это прерывание в регистре CONFIG записью 0 в позиции бита MASK_TX_DS, далее как обычно - загружаете по SPI данные payload, переводите CE в высокий, затем в низкий уровень и просто ждете прерывание по физической линии IRQ, когда она перейдет из 1 в 0. По получении этого сигнала читаете регистр статуса (при отправке первой команды, например W_REGISTER, принимаемый обратно по SPI байт будет содержать инфу регистра статуса), в ответе нас интересует бит TX_DS, если он =1, значит, прерывание было вызвано именно этим событием, стираете бит записью 1 в регистре SATUS, ну и переходите к новой записи payload.
Вы сначала наладьте простую связь между двумя модулями, а потом уже будете изобретать сложности.
|
|
|
|
03.06.2018, 20:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: #include - оптимальное использование директивы
Да второй модуль на малинке и связь с ним есть.
ФАПЧ же цифровой на ряду с синтезатором частоты? А генератор входит в состав ФАПЧ? ГУН же сам по себе.
По второму вопросу сам нашёл:
Цитата:
|
In standby-II .... .
nRF24L01+ enters standby-II mode if CE is held high on a PTX device with an empty TX FIFO. If a new packet is uploaded to the TX FIFO, the PLL immediately starts and the packet is transmitted after the normal PLL settling delay (130µs).
|
Ну т.е. бум пробовать.
Ещё только сейчас увидел, что после подачи питания трансивер находится в ресете аж 100 mS.
|
|
|
|
03.06.2018, 22:06
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: #include - оптимальное использование директивы
parovoZZ, таки со сменой предмета обсуждения лучше наверное открыть новую тему - другим интересующимся nRF будет проще искать. К #include продолжение совсем уже не относится. Определитесь с началом и попросите модераторов перенести часть в новую тему.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
04.06.2018, 01:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: #include - оптимальное использование директивы
А как пожаловаться?
|
|
|
|
04.06.2018, 05:32
|
|
Прописка
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
|
Re: #include - оптимальное использование директивы
Да просто создайте новую тему "Запуск nRF24L01, проблемы, решения". В принципе, тема интересная, но в инете как-то не шибко то освещена, обрывочно как-то.
|
|
|
|
04.06.2018, 09:32
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: #include - оптимальное использование директивы
nRF24L01 мы с niXto переживали всю. Там уже живого места не осталось
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:40.
|
|