nRF24L01+ : побеждаем модуль.

Тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 19 июн 2014.

  1. Igor-k

    Igor-k Нуб

    Как четвертый передатчик получит эти данные, если в W_ACK_PAYLOAD я могу указать номера только трех передатчиков ?

    Если все передатчики с одним адресом, то не вопрос. Цепляем паровозом все данные ко всем передатчикам.

    Но у меня все передатчики с разными адресами.
     
  2. parovoZZ

    parovoZZ Гуру

    Пересадить все на один адрес.
     
  3. parovoZZ

    parovoZZ Гуру

    Пропустил вопрос) Да, будет передан пустой ACK ответ, если разрешены пакеты без данных.
     
  4. Igor-k

    Igor-k Нуб

    Я ж в изначальном посту написал что так и сделал потому что не получилось с разными адресами.

    Разобрались ))
     
  5. User_0

    User_0 Нуб

    Всем привет, у меня почему-то работает приём только по нулевому и первому каналу (pipe0 и pipe1). Конфигурирую без автоподтверждения. Когда передатчик отправляет байт на адрес pipe0 или pipe1 - приёмник нормально принимает байт, а на остальные адреса - никакой реакции, как будто у него эти адреса отключены вообще. Ниже код инициализации, может я что-то не правильно инициализирую
    Код (C++):

    void Init_nRF24L01(void)
    {
      Write_nRF24L01_register(0x01, 0x00);              // Auto Ack disable
      Write_nRF24L01_register(0x02, 0x3F);              // RX channels
      Write_nRF24L01_register(0x03, 0x03);              // Address length
      Write_nRF24L01_register(0x04, 0xF0);              // Auto retry disable
      Write_nRF24L01_register(0x05, 0x03);              // Radio channel
      Write_nRF24L01_register(0x06, 0x08);              // Speed, power
      Write_nRF24L01_register(0x0C, pipe2_addr);
      Write_nRF24L01_register(0x0D, pipe3_addr);
      Write_nRF24L01_register(0x0E, pipe4_addr);
      Write_nRF24L01_register(0x0F, pipe5_addr);
      Write_nRF24L01_register(0x11, 0x01);              // Pipe 0 data length
      Write_nRF24L01_register(0x12, 0x01);              // Pipe 1 data length
      Write_nRF24L01_register(0x13, 0x01);              // Pipe 2 data length
      Write_nRF24L01_register(0x14, 0x01);              // Pipe 3 data length
      Write_nRF24L01_register(0x15, 0x01);              // Pipe 4 data length
      Write_nRF24L01_register(0x16, 0x01);              // Pipe 5 data length
      Write_nRF24L01_register(0x1D, 0x01);              // Nack enable
      Write_nRF24L01_5b_register(0x0A, pipe0_addr);
      Write_nRF24L01_5b_register(0x0B, pipe1_addr);
      Write_nRF24L01_5b_register(0x10, remote_addr);
      Write_nRF24L01_register(0x00, NRF_MODE_RECEIVER); // config
      CE_ON();
    }
    Upd: поправил комментарии в коде
     
    Последнее редактирование: 14 июн 2019
  6. SDV

    SDV Нерд

    Лиди скиньте пожалуйста кусочек кода, где реализовано переключение каналов от кнопки. Спасибо большоЕ!
     
  7. parovoZZ

    parovoZZ Гуру

    это ваще че такое?
     
  8. User_0

    User_0 Нуб

    Это код инициализации модуля. Функции сам написал, ибо использую не ардуино, а STM32.
    Уже разобрался: всё дело в том, что пятибайтные адреса в модуль записываются задом наперёд - сначала младший байт
     
  9. parovoZZ

    parovoZZ Гуру

    это невозможно читать. Неужели нельзя вот так писать
    http://forum.amperka.ru/threads/Суперэкономичный-беспроводной-монитор-Т-и-rh.17221/#post-206147

    именно так))
     
  10. User_0

    User_0 Нуб

    Честно? Вот такие вещи лично мне читать гораздо сложнее
    Код (C++):
    //.. CONFIG
        Buf[0] =    (1<<nRF_MASK_RX_DR) | (0<<nRF_MASK_TX_DS) | (1<<nRF_MASK_MAX_RT) |    // маски прерываний от событий
            (0<<nRF_PRIM_RX) |                                              // Режим передатчика
            (1<<nRF_EN_CRC) | (0<<nRF_CRCO) |                // Проверка CRC разрешена, 1 байт CRC
            (1<<nRF_PWR_UP);                                               // Запускаем трансивер
        SPI_WriteArray(nRF_WR_REG(nRF_CONFIG), 1, Buf);                // Отправляем команду. Пин CSN удерживается внутри функции
     
    Всё равно через полгода после написания программы уже не вспомнишь, какие биты есть в регистре nRF_CONFIG - нужно лезть в даташит. Вот режим работы модуля часто меняется - его я определил как "NRF_MODE_RECEIVER" и transmitter, соответственно. А писать макросы для каждого регистра и бита, даже если они встречаются в коде всего один раз - проще комментарий написать
     
  11. parovoZZ

    parovoZZ Гуру

    они в файле рядышком. Нажимаешь GoTo Implementation и переносит куда надо. А там все комментарии на русском))
     
  12. User_0

    User_0 Нуб

    Опять же, вопрос удобства. Вы правда считаете, что запись
    Код (C++):

      Write_nRF24L01_register(NRF_EN_AA, (0<<NRF_ENAA_P0) |
                                         (0<<NRF_ENAA_P1) |
                                         (0<<NRF_ENAA_P2) |
                                         (0<<NRF_ENAA_P3) |
                                         (0<<NRF_ENAA_P4) |
                                         (0<<NRF_ENAA_P5));              // Auto Ack disable
    читать удобнее, чем то же самое, записанное вот так:
    Код (C++):
    Write_nRF24L01_register(0x01, 0x00);              // Auto Ack disable
    ?)
     
  13. parovoZZ

    parovoZZ Гуру

    В первой записи гораздо труднее сделать ошибку, т.к. все биты поименованы. Да и вообще, когда пойдут условия, именованные биты читаются быстрее, чем их знакоместа выраженные через числа.
     
  14. b707

    b707 Гуру

    Однозначно через макросы удобнее и правильнее, чем через числовые значения.
    Во-первых,если придумать макросам "понятные" имена, код получается самодокументированным и комментарии вообще не нужны. И тогда через полгода вы легко прочитаете эту запись без даташита, а вот запись типа register(0x06, 0x08) вы не поймете уже через пару дней
    Во-вторых, при необходимости макросу можно присвоить другое значение, не меняя сам код. Возможно, именно в этом коде это и не нужно - но лучше пользоваться этим всегда.

    Вообще, использование явных числовых значений в любом месте программы - это плохой стиль программирования, Числа в программе всегда нужно заменять либо на константы, либо на макросы
     
    Последнее редактирование: 15 июн 2019
    DetSimen нравится это.
  15. SDV

    SDV Нерд

    Лиди подскажите пожалуйста кусочек кода, где реализовано переключение каналов. Очень нужно.
     
  16. User_0

    User_0 Нуб

    Так я же не против макросов, даже наоборот, сам их активно использую) Но, повторюсь, если регистр встречается в коде всего один раз при инициализации - можно и записать его как есть и подписать комментарием, ничего страшного не случится. Всё равно этот регистр никто никогда не будет трогать

    Кстати да, если в коде нет комментариев, через год я без даташита вообще не вспомню что такое NRF_EN_AA
     
  17. b707

    b707 Гуру

    потому что запись NRF_EN_AA не сильно лучше Вашей "шифровки" из числовых кодов.
    Называйте переменные информативно - NRF_Enable_AutoAsk
    и тогда через полгода ничего вспоминать не надо будет - код будет читаться как книга
     
  18. parovoZZ

    parovoZZ Гуру

    такая фигня оправдана, когда код инициализации создаётся сторонним ПО - WDS, RF Studio и подобным.
     
  19. User_0

    User_0 Нуб

    Так целый день уйдёт на на бесполезное придумывание информативных названий для регистров и каждого бита в них. Зачем это, если я один раз написал и больше вообще не вспоминаю об этом регистре? Говорю же, всё что в будущем (возможно) понадобится изменить - я пишу в виде макросов, а то что редактироваться не будет - ну оставлю числом и всё. От придумывания информативного названия для этих регистров пользы абсолютно никакой, только трата времени
    Вот например строка:
    Код (C++):

      Write_nRF24L01_register(0x0F, pipe5_addr);
    Какой смысл придумывать название для этого регистра? Кроме инициализации он нигде не используется. По названию переменной понятно, что он такое и зачем нужен, тут даже комментарий не требуется
     
  20. b707

    b707 Гуру

    то, что я вам пишу - это не правило, а хороший стиль. Не хотите - не пользуйтесь. В конце концов и на деловую встречу можно заявиться в шлепанцах и небритым - законом не запрещено :)
    Вы вроде свою библиотеку пишете? - откройте любую хорошо написанную библиотеку работы с периферией. Вы обнаружите, что там каждому биту конфигурационного регистра соответвует макрос с длинным названием из трех-пяти слов.

    впрочем - еще раз повторяю - наш разговор выродился в пустой треп, как будто я вас заставляю умываться по утрам. Не хотите - не умывайтесь.
    На этом закончим.