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

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

  1. parovoZZ

    parovoZZ Гуру

    ты хоть как-нить заведи. Чтоб стимул появился дальше биться))
     
  2. Koteika88

    Koteika88 Нуб

    стимул есть, устройство очень надо)))
     
  3. Koteika88

    Koteika88 Нуб

    получил я прерывания по приёму и передаче, а вот вместо инфы вычитывается какой-то бред(
     
  4. parovoZZ

    parovoZZ Гуру

    Значит, проверяй длину Сообщения - если не совпадает - удаляй посылку.
     
  5. Koteika88

    Koteika88 Нуб

    R_RX_PL_WID показывает 0 в любом случае(
     
  6. parovoZZ

    parovoZZ Гуру

    тогда ничего и не получаешь, а вычитываешь мусор из памяти МК. Ну т.е. код кривой.
     
  7. Koteika88

    Koteika88 Нуб

    получается я передаю пустой пакет? как мне проверить на передатчике что пакет записан в буфер?
    и еше вопрос, я использую статическую длину пакета, в этом случае R_RX_PL_WID будет вычитывать длину пакета?
     
  8. parovoZZ

    parovoZZ Гуру

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

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

    Записать его туда. Насколько я помню, из буфера передачи ничего читать нельзя. Нет такой команды. Можно три раза записать без передачи - обязательно поднимется флаг занятости буфера передачи.
     
  9. Koteika88

    Koteika88 Нуб

    эмпирическим путем было найдено что приемник при чтении буфера почему-то вычитывает содержимое регистра 0x01 EN_AA.

    процедура чтения такова:

    CS_ON;
    HAL_SPI_Transmit(&hspi2, (uint8_t*)0x61, 1, 1000);
    HAL_SPI_Receive(&hspi2, &read_data, 1, 1000);
    CS_OFF;
    я уже нечего не понимаю - почему при передаче команды игнорятся старшие 4 бита?
     
  10. parovoZZ

    parovoZZ Гуру

    есть же даташит.

    не EN_AA, а регистр статуса. Для чтения регистра EN_AA необходимо передать команду чтения и адрес этого регистра. Иначе не прочтешь.

    Какой команды? Старшие 4 бита чего?

    это что за код? С HAL напрочь не дружу и маловероятно, что буду.
     
  11. Koteika88

    Koteika88 Нуб

    в статусе во время чтения находится 0х42, а я вычитываю именно то что находится в EN_AA,

    для чтения регистра нужно к адресу регистра подмешать 000ххххх (ххххх адрес регистра).
    а для чтения буфера необходимо послать команду 0х61 (0110 0001) так вот эти биты почему то игнорятся и получается чтение 00000001 что есть EN_AA.
    код
    HAL_SPI_Transmit(&hspi2, (uint8_t*)0x61, 1, 1000); //отправить 1 байт в SPI не принимать ничего в ответ т.к ответ= статус

    HAL_SPI_Receive(&hspi2, &read_data, 1, 1000);// принять один байт по SPI
     
  12. ra0wx

    ra0wx Нерд

    Здравствуйте. Есть вопрос. Работают два модуля, приемник и передатчик. Данные проходят без замечаний. Суть вопроса: после остановки работы передатчика (стандартное требование проекта), на дисплее приемника остаются последние принятые значения. Не могу понять, по какой команде от модуля приемника запустить процедуру очистки позиции данных на дисплее. Хотелось бы , чтобы в этот момент дисплей показывал просто нули. Библиотека называется RF24-master.
     
  13. Koteika88

    Koteika88 Нуб

    обнуляйте переменные которые выводите на экран при остановке передачи
     
  14. ra0wx

    ra0wx Нерд

    Я и спросил, по какой команде или процедуре. Пока все мои попытки были безуспешными.
     
  15. Koteika88

    Koteika88 Нуб

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

    ra0wx Нерд

    Не поделитесь как это будет выглядеть в коде. Я что то пока слабо представляю, в ардуине новичок.
     
  17. Koteika88

    Koteika88 Нуб

    я не дружу с ардуиной, пишу под stm32
    но там по сути все просто, откройте урок по таймерам, я думаю разберетесь
     
  18. parovoZZ

    parovoZZ Гуру

    Я же выкладывал заголовочный файлик для этого трансивера. Вот из него
    Код (C++):

    //------------------------ Команды ----------------------------------------
    #define    nRF_MASK_REG            0b11100000            //Маска команды управления регистрами
    #define nRF_R_REGISTER            0b00000000            //читаем регистр
    #define nRF_W_REGISTER            0b00100000            //пишем в регистр
    #define nRF_R_RX_PAYLOAD            0b01100001            //считывание из буфера принятых данных. Читаем всегда с нулевого байта FIFO
    #define nRF_W_TX_PAYLOAD            0b10100000            //запись данных в буфер TX_FIFO
    #define nRF_FLUSH_TX            0b11100001            //очистка TX FIFO
    #define nRF_FLUSH_RX            0b11100010            //очистка RX FIFO
    #define nRF_REUSE_TX_PL            0b11100011            //повторить последнюю передачу. ЗАПРЕЩЕНО выдавать команду во время передачи
    #define nRF_R_RX_PL_WID            0b01100000            //Прочитать количество полученных байт в верхнем буфере приема FIFO, особенно актуально для режима динамического обмена пакетами
    #define nRF_MASK_PIPE            0b00000111            //Маска для номера канала
    #define nRF_W_ACK_PAYLOAD_MASK        0b10101000            //Загрузить сообщение передаваемое в режиме приема вместе с ACK пакетом
    #define nRF_W_TX_PAYLOAD_NOACK        0b10110000            //Отключить автоответ для конкретного пакета
    #define nRF_NOP                0b11111111            //Пустая операция

    #define nRF_RD_REG(reg)            ((reg & ~nRF_MASK_REG) | nRF_R_REGISTER)    // Чтение регистра reg
    #define nRF_WR_REG(reg)            ((reg & ~nRF_MASK_REG) | nRF_W_REGISTER)    // запись
     
    Соответсвенно, команда на чтение будет такая
    Код (C++):
    SPI_WriteByte(nRF_R_RX_PAYLOAD)
    И следующим байтом заправляем нули, а в ответ принимаем данные
    Код (C++):
    uint8_t DATA = SPI_ReadByte(nRF_NOP);
     
  19. parovoZZ

    parovoZZ Гуру

    Если работаем с динамической длиной сообщения, то для начала необходимо вычитать количество выпитого принятого на грудь:
    Код (C++):
    SPI_WriteByte(nRF_R_RX_PL_WID);
    uint8_t LENGTH = SPI_ReadByte(nRF_NOP);
     
  20. ra0wx

    ra0wx Нерд

    Спасибо, попробую.