Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Показано с 1 по 4 из 4

Тема: Радиомодуль RFM22B + AtMEGA8A

  1. #1

    Вопрос Радиомодуль RFM22B + AtMEGA8A

    Здравствуйте уважаемые форумчане!

    Сделал приемник и передатчик на основе RFM22B-868S1 + AtMega8 A.
    Код сделал (а точнее переделал с ДЕМО кода с офсайта), платы приемника и передатчика собраны, чего только не перепробовал не работает...
    Возможно конечно проблема может быть даже в антенне, но хотелось бы пройтись с самого кода.
    Мой код в прикрепленном архиве TX+RX.rar
    + ДЕМО коды на PIC микрухи в прикрепленном архиве DEMO.rar

    Как я выяснил там стоит МК от Silicon Labs вот ссылка http://www.silabs.com/products/wirel...i44303132.aspx
    там же есть докум для Excel короче с его помощью можно рассчитать что нужно записать в регистры радиомодуля...

    Сразу выкладываю ссылку на офсайт где написано про радиомодуль и даташит тамже http://www.hoperf.com/rf_fsk/fsk/RFM22B.htm

    Проблема вот в чем: в коде принимающего устр-ва в процедуре main есть бесконечный цикл while(1) там вход nIRQ проверяется на низкий лог. уровень (так RFM сообщеат о том что принял данные) а потом данные с FIFO записываюся в массив и проверяются на правильность и если все правильно (т.е. данные пришли правильно) то мигают зел. светодиоды НО ЭТОГО НЕ ПРОИСХОДИТ!!!
    НО!!! какие-то данные приходят, потому ветвь nIRQ проходит!!! Как можно увидетьв коде я сделал что если прога проходит по ветке if(!(nIRQ)) то должны 2 раза мигнуть красные светодиоды - они мигают, но ИМЕННО ПРОВЕРКА ДАННЫХ НЕ ПРОХОДИТ.


    ПОМОГИТЕ ПОЖАЛУЙСТА
    Вложения Вложения
    • Тип файла: rar TX+RX.rar (6.3 Кб, Просмотров: 369)
    • Тип файла: rar DEMO.rar (54.3 Кб, Просмотров: 298)


  2. #2
    Цитата Сообщение от Ilnur Посмотреть сообщение
    Здравствуйте уважаемые форумчане!
    ПОМОГИТЕ ПОЖАЛУЙСТА
    Ilnur, добрый день!



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

    У Вас косяк в чтении данных с микрухи и в организации SPI интерфейса.
    В демке применен метод ускоренного чтения данных с заданного адреса (0х7
    F), каждые последующие 8 импульсов тактовой шины читают с адреса, увеличенного на 1.

    Выдержка из даташита:

    «

    The SPI interface contains a burst read/write mode which allows for reading/writing sequential registers withouthaving to re-send the SPI address. When the nSEL bit is held low while continuing to send SCLK pulses, the SPI interface will automatically increment the ADDR and read from/write to the next address. An example burst write transaction is illustrated in Figure 5 and a burst read in Figure 6. As long as nSEL is held low, input data will be latched into the RFM22B/23B every eight SCLK cycles.»



    Поэтому у Вас все время читается один и тот же адрес 0x7F.

    Правильный алгоритм.

    Давим в 0 шину nSEL.

    Пауза в 1 тик.(t_en по даташиту RFM22B минимум 20 нсек). Необходимо выдерживать ВСЕГДА перед началом обращения к микрухе

    Шлем адрес (0x7F)

    В цикле шлем произвольную лабуду 17 раз, одновременно считываем из регистра SPDR полученный байт, и пишем его в буфер чтения.

    Отпускаем в 1 шину nSEL. Это будет для модуля конец чтения.

    Считаем контрольную сумму первых 16 байт. Переменную, куда суммируем, объявляем как unsigned char. Биты, вылезшие за разрядную сетку при этом просто теряются, ничего страшного. Сравниваем с 17 байтом — там записана контрольная сумма.

    unsigned char _read_17_bytes(unsigned char ADDR)

    {

    //делаем наложение маски, т.к. команда READ - значит 7-ой бит должен быть нулем: (см. даташит SPI Interface)
    ADDR&=(~(1<<7));
    PORTB&=(~(1<<SS)); //SS низк. лог. уровень (для nSEL, см. даташит SPI Interface)


    delay();//подобрать величиной в 1 тик


    SPDR=ADDR; //начинаем передачу адреса
    while (! (SPSR & (1<<SPIF))); //ждем пока передача закончится
    for (i=0;i<17;i++)
    {
    SPDR=0xFF; //передаем что угодно для получения данных

    while (! (SPSR & (1<<SPIF))); //ждем пока передача закончится
    rx_mas[i] =SPDR;
    }
    PORTB|=(1<<SS); //SS выс. лог. ур., закончили передачу (для nSEL, см. даташит SPI Interface)
    //return SPDR; //возвращаем данные с нашего адреса
    }


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


    ...
    //unsigned long int chksum;
    unsigned char chksum;

    ItSt1 = _read(0x03); //read the Interrupt Status 1 register
    ItSt2 = _read(0x04); //read the Interrupt Status 2 register
    for (i = 0; i<17; i++)
    {
    rx_mas[i] = _read(0x7f+i);
    }
    chksum = 0;
    for (i = 0; i<16; i++)
    chksum+=rx_mas[i];
    for (i = 0; i<16; i++)
    //if (rx_mas[i] == 0x30)
    if ((chksum == rx_mas[16])&&(rx_mas[0] == 0x30))
    {
    G_LED = 1;
    delay_ms(25);
    G_LED = 0;
    }

    В функции _read(adr) добавьте паузу после перевода SS в 0.




    25 мсек для горения светика наверно мало, можно не заметить моргание хотя бы 1/16 секунды сделайте.

    Николай.

  3. #3
    Здравствуйте, Николай!

    Спасибо за то что потратили время на это! Сам бы ни за что не догадался бы... Хотя и даташит читал.

    К сожалению это не помогло , почему-то прерывание того что данные поступили срабатывает даже тогда, когда ПЕРЕДАТЧИК еще не включен, а это значит (я так думаю):
    1) либо прерывание ложно, а значит все прерывания ложные и естественно проверка данных не проходит, раз данные не пришли
    2) либо приемник ловит сигналы от другого передатчика (что же это может быть? ), я уже начал думать что из-за того что у нас в соседях телестанция такие проблемы? Но телевещание на других частотах.......

    Так что пока безуспешно, буду искать дальше.

    Спасибо Вам Николай еще раз! Спасибо!

  4. #4
    Ilnur у вас получилось настроить работу данного девайса?

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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