Перейти к содержанию
    

Борьба с MRF49XA

Коллеги, спасайте!

Взялся за небольшую работку, но "увяз" на MRF49XA. Вроде ничего сложного, но убил на нее уже неделю, без особого результата. По SPI обмен вроде бы есть, во всяком случаи бит POR после RESETa с регистра статуса MRF считывается. Дальше начинаю делать инициализуцию (практически 1:1 как в микрочиповском примере), но:

1. При включении передатчика, когда начинаю писать в регистр TXBREG байт для передачи, на время, пока идет передача MRF49 должна устанавливать SDO в "1", сообщая о занятости. Этого не происходит. Всегда в "0".

2. Во время включения передатчика вижу на выходе модуля появление на короткое время несущей, но не на 869.0, которую прописывал в CFSREG, а примерно на 865.21 Причем несущая немодулированная, несмотря на записаные TXBREG данные.

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

    #define    GENCREG               0x8022         // Cload=12.5pF; TX registers & FIFO are disabled
#define    PMCREG                0x8200         // Everything off, uC clk enabled
#define    RXCREG                0x94A1         // BW=135kHz, DRSSI=-97dBm, pin8=VDI, fast VDI
#define    TXBREG                0xB800
#define    FIFORSTREG    0xCA81         // Sync. latch cleared, limit=8bits, disable sensitive reset
#define    BBFCREG               0xC22C         // Digital LPF (default)
#define    AFCCREG               0xC4D7         // Auto AFC (default)
#define    CFSREG                0xA708// 0xA7D0         // Fo=915.000MHz (default)
#define    TXCREG                0x9830         // df=60kHz, Pmax, normal modulation polarity
#define    DRSREG                0xC623         // 9579Baud (default)

#define    RXFIFOREG     0xA000
#include <avr/io.h>

void delay(volatile uint16_t ms)
{
volatile  uint16_t ticks;
  while(ms--)
  {
   ticks=567; //для 8мгц
   while(ticks--); 
  }

  return;
}
    void init(void)
    {
        PORTA     |= _BV(PA1);    //pull-up для кнопки
        PORTB     |= _BV(PB3); //reset MRF
        PORTA |= _BV(PA3);    //CS
        PORTA |= _BV(PA2);    //int
        PORTA  &= ~_BV(PA4);    //SCK
        return;
    }
   void USISPIinit(void)
   {
       USICR&= ~_BV(USIWM1); //Трехпроводный режим USI 
       USICR |= _BV(USIWM0);
       
       USICR |= _BV(USICLK);       
       USICR&= ~_BV(USICS0); //выбор строба от USICLK
       USICR&= ~_BV(USICS1);
    
       return;
   }
   
   uint8_t SpiRW(uint8_t data_w)
   {
       USIDR = data_w;
   
   USISR |= (1<<USIOIF);//сбрасываем флаг
   while(!(USISR & (1<<USIOIF)))//пока нет флага окончания передачи
   {
    USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);//формируем тактирующие импульсы
   }
    return (USIDR);//возвращаем полученные данные
   }
   
   
  uint8_t MRF_command (uint16_t cData )
   {
       uint8_t rData;

       PORTA &= ~_BV(PA3);    //CS
       SpiRW(cData>>8);
       cData=cData<<8;
       cData=cData>>8;
       rData = SpiRW(cData);
       PORTA |= _BV(PA3);    //CS
       return rData;       
   }
   
   
     uint16_t MRF_Read_status(void)
     {
         uint8_t rData8;
         uint16_t rData16;
         PORTA &= ~_BV(PA3);    //CS
         rData16=SpiRW(0);
         rData8 = SpiRW(0);
         PORTA |= _BV(PA3);    //CS
         rData16=rData16<<8;
         rData16=rData16|rData8;
         return rData16;
     }
   
   void MRF_write(uint16_t cData)
    {
       SpiRW(cData>>8);
       SpiRW(cData);
    }

void MRF_init() {
    uint16_t MRF_read_word;
    
    PORTB &= ~_BV(PB3);//сбрасываем reset MRF
    delay(1);
    PORTB |= _BV(PB3);
    delay(1);
    
    MRF_read_word=MRF_Read_status(); //читаем status, проверяем POR
    while(!(MRF_read_word&1<<14)) //если 14 бит не установлен 
    {
     MRF_read_word=MRF_Read_status();
    }
    
    PORTA |= _BV(PA0);//светодиод
    
    
    
    //---- Send init cmd
    MRF_command( FIFORSTREG );
    MRF_command( FIFORSTREG | 0x0002);
    MRF_command( GENCREG);  
    MRF_command( AFCCREG);  
    MRF_command( CFSREG);
    MRF_command( DRSREG);
    MRF_command( PMCREG);
    MRF_command( RXCREG);
    MRF_command( TXCREG);
    //---- antenna tunning
    MRF_command( PMCREG | 0x0020);          // turn on tx
    delay(4);
    //---- end of antenna tunning
    MRF_command( PMCREG | 0x0080);          // turn off Tx, turn on receiver
    MRF_command( GENCREG | 0x0040);         // enable the FIFO
    MRF_command( FIFORSTREG);
    MRF_command( FIFORSTREG | 0x0002);      // enable syncron latch
    MRF_Read_status();
    PORTA  |= _BV(PA7);//FSEL
    //MRF_FSEL_1;
}


void MRF_send(uint8_t t1,uint8_t t2){
    //uint16_t MRF_read_word;
    //---- turn off receiver , enable Tx register
    MRF_command(PMCREG);                            // turn off the transmitter and receiver
    MRF_command(GENCREG | 0x0080);          // Enable the Tx register //TXDEN
    //---- Packet transmission
    // Reset value of the Tx regs are [AA AA], we can start transmission
    //---- Enable Tx
    MRF_command(TXBREG | 0xAA); //!!!!!!!!!!!!!
    MRF_command(PMCREG |0x0020);            // turn on tx //TXCEN

    PORTA &= ~_BV(PA3);    //CS                                        // chip select low
    while(!bit_is_clear(PINA, 6));
    MRF_write(TXBREG | 0xAA);       // preamble
    while(!bit_is_clear(PINA, 6));
    SpiRW( 0x2D);
    while(!bit_is_clear(PINA, 6)); 
    SpiRW(0xD4);
    while(!bit_is_clear(PINA, 6)); 
    SpiRW(2);
    while(!bit_is_clear(PINA, 6)); 
    SpiRW(t1);
    while(!bit_is_clear(PINA, 6)); 
    SpiRW(t2);
    while(!bit_is_clear(PINA, 6)); 
    SpiRW(0);
    while(!bit_is_clear(PINA, 6));
    PORTA |= _BV(PA3);    //CS                                            // chip select high, end transmission
    
    //---- Turn off Tx disable the Tx register
    MRF_command(PMCREG | 0x0080);           // turn off Tx, turn on the receiver
    MRF_command(GENCREG | 0x0040);          // disable the Tx register, Enable the FIFO

}

   
   
int main(void)
{
    DDRA |= _BV(DDA0);//PA0 на выход (светодиод)
    DDRA &= ~_BV(DDA1);//PA1 на вход (кнопка)
    DDRA |= _BV(DDA2);//PA2 на выход (int)
    DDRA |= _BV(DDA3);//PA3 на выход (CS)
    DDRA |= _BV(DDA4);//PA4 на выход (SCK)
    DDRA &= ~_BV(DDA6);//PA6 на вход (MISO)
    DDRA |= _BV(DDA5);//PA5 на выход (MOSI)
    DDRA |= _BV(DDA7);//PA7 на выход (FSEL)
    
    DDRB |= _BV(DDB3);//PB3 на выход (reset MRF)
    DDRB &= ~_BV(DDB2);//PB2 на вход (IRQ от MRF)
    init();
    USISPIinit();
    MRF_init();

    while(1)
    {
     PORTA |= _BV(PA0);
     delay(20);    
     MRF_send(143,143);
     PORTA &= ~_BV(PA0);
     delay(20);
    }


   
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги, спасайте!

Взялся за небольшую работку, но "увяз" на MRF49XA.

 

Ищите на форуме моё описание работы с si4421 - mrf49 полный его аналог.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...