Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Автоматика и аппаратура связи Дистанционное и непосредственное управление исполнительными механизмами, сотовая, а также радиосвязь.

 
Опции темы

Однокристальные трансиверы TRC101 от RFM...

Непрочитано 25.12.2009, 16:27  
Pavel_xx
Частый гость
 
Регистрация: 07.12.2009
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
Pavel_xx на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Добрый день.
Собрал в протеусе схемку

Вот ссылка на проект протеуса.

Первый МК отсылкает файлы, второй принимает.

Проверяю отладчиком и осцилом - байты передаются.
Но принимающий МК никак не реагирует!! Прерывание по SPI не срабатывает((

Привожу коды.

МК-передатчик:

Chip type : ATmega8
Program type : Application
Clock frequency : 10,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
************************************************** ***/

#include ‹mega8.h›
#include ‹delay.h›
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
data=SPDR;
// Place your code here

}
void write_config_data (unsigned int config_word){
PORTB.0=0; // nCS
SPDR=config_word/256;
while (SPSR.7!=1){};
SPDR=config_word%256;
while (SPSR.7!=1){};
PORTB.0=1; // nCS
}
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T
PORTB=0x00;
DDRB=0x2C;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x01;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;


SPCR=0x53;
SPSR=0x00;

// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm

// Global enable interrupts
#asm("sei")

delay_ms(500);
SPDR=0x2A;
delay_ms(500);
SPDR=0x2C;
delay_ms(500);
SPDR=0x2D;
delay_ms(500);
SPDR=0x1A;
delay_ms(500);
SPDR=0x1C;
delay_ms(500);
SPDR=0x1D;

PORTD.0=1;


while (1)
{
// Place your code here

};
}



МК-приемник:

Chip type : ATmega8
Program type : Application
Clock frequency : 10,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
************************************************** ***/

#include ‹mega8.h›
#include ‹delay.h›
// Alphanumeric Module functions
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include ‹lcd.h›

unsigned char data;
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{

data=SPDR;
/*
// Place your code here
count_3++;
Bytes[count_3]=data;
if (count_3==3)
{
count_3=0;
}
*/
lcd_putchar(data);

//lcd_putchar(SPDR);
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T
PORTB=0x00;
//DDRB=0x10;
DDRB=0x2C;


// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;


SPCR=0x53;
SPSR=0x00;

// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm

// Global enable interrupts
#asm("sei")
// LCD module initialization
lcd_init(16);
PORTD.0=1;
lcd_gotoxy(0,0);
lcd_putsf("User char 0:");
lcd_gotoxy(0,1);

while (1)
{
lcd_putchar(data);

};
}
Реклама:
Pavel_xx вне форума  
Непрочитано 25.12.2009, 17:20  
radist1982
Частый гость
 
Регистрация: 16.07.2007
Сообщений: 24
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
radist1982 на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Pavel_xx, Вы хотите тут обсудить как работает SPI ? Темой/разделом не ошиблись?
Вот как я работаю по SPI с RFM12BP :
1. Конфигурация SPI
Код:
void SPI_Init() { // Функция инициализации SPI 
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 125.000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
    SPCR=0x52;  // SPIE  SPE  DORD  MSTR  CPOL  CPHA  SPR1  SPR0
    SPSR=0x00;  // SPIF  WCOL  	-  	-  	-  	-  	-  	-
    };
2. Собственно хардовый и совтовый варианты работы с SPI
Код:
#define SS 0   // SPI SS (chip select)
#define SCK 1   // SPI clock
#define SDO PINB.3   // SPI Data output (RFM12B side)    // приемник МЦУ
#define SDI 2   // SPI Data input (RFM12B side)          // передатчик МЦУ
#define HI(x) PORTB |= (1‹‹(x))
#define LO(x) PORTB &= ~(1‹‹(x))

#define SPIF 7

#ifdef SPI_SOFT
    uint16 RF12_WRT_CMD(uint16 cmd) {
        uint8 i;
        uint16 rx_data;
        rx_data = 0;
        LO(SCK);
        LO(SS); 
        for(i=0; i‹16; i++) {
            if(cmd & 0x8000) HI(SDI);
            else LO(SDI);
            HI(SCK);
            rx_data‹‹=1;
            if(SDO) rx_data|=0x0001;
            LO(SCK);
            cmd‹‹=1;
            }    
        HI(SS); 
        return rx_data;
        }
#endif

#ifdef SPI_HARD

    uint16 RF12_WRT_CMD(uint16 cmd) {        
        uint8 ldata,hdata; 
        uint16 rx_data=0;
        
        ldata = (uint8) (0x00FF & cmd);
        hdata = (uint8) (cmd ›› 8);  
        
        LO(SS);  
        
        SPDR = hdata;
        while(!(SPSR & (1‹‹SPIF)));
        rx_data = SPDR;
        rx_data ‹‹=8;
        
        SPDR = ldata;
        while(!(SPSR & (1‹‹SPIF)));   
        rx_data |= SPDR;         
          
        HI(SS);    
        
        return (rx_data);
        };
#endif
Как видно - работаю словами.
radist1982 вне форума  
Непрочитано 27.12.2009, 09:09  
Lexi
Частый гость
 
Регистрация: 26.09.2006
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Lexi на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Нельзя от протеуса ждать слишком многого. Интерфейсы как SPI или I2C надо проверять в ЖЕЛЕЗЕ. И действительно тема не подходящая тут для этого вопроса.
Lexi вне форума  
Непрочитано 28.12.2009, 10:31  
Panchiks
Частый гость
 
Регистрация: 21.01.2007
Адрес: г. Владивосток
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Panchiks на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Pavel_xx, привет, посмотрел твою схему и код. В схеме, что ты привел выводы 16 обоих МК ты просто соединил вместе, а в коде запись\незапись регулируешь посылая "0" и "1" на вывод 14 мастера - PORTB.0, т.е. вывод 14 в схеме вообще не задействован.
Дело в том, что если МК сконфигурирован как Мастер, то вывод SS (нога 16) не подает автоматически "0" и "1" при отправки байта, а ты его в схеме юзаешь.
В мануале на Мегу8 написано:

"...When MK configured as a Master, the SPI interface has no automatic control of the SS line.
This must be handled by user software before communication can start...."

Именно поэтому я вручную, совтово, дергал в качестве SS вывод 14

Если ты не знал этого и речь в последнем твоем посте идет именно о приврдимой схеме и коде, то она и не заработает
Я тоже когда-то нарывался на это.
Panchiks вне форума  
Непрочитано 28.12.2009, 10:34  
Panchiks
Частый гость
 
Регистрация: 21.01.2007
Адрес: г. Владивосток
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Panchiks на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Тоесть, тебе вывод 14 мастера нужно цеплять на 16 слейва! Тогда заработает
Panchiks вне форума  
Непрочитано 23.01.2010, 23:47  
Pavel_xx
Частый гость
 
Регистрация: 07.12.2009
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
Pavel_xx на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Добрый день, спасибо всем кто откликнулся))
Да вы правы, в этой ветке неуместно обсуждать SPI. Но я уже протестировал схему для работы по SPI. Поэтому создал новую тему тут.
Но из этой ветки я не ухожу!! Теперь настало время прикрутить к моим МК тритоновские RM101))
Pavel_xx вне форума  
Непрочитано 09.02.2010, 21:05  
Pavel_xx
Частый гость
 
Регистрация: 07.12.2009
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
Pavel_xx на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Собрал две платы по схемам:
http://ungood.narod.ru/images/TRC101_tx_rx.jpg

http://ungood.narod.ru/images/DSC01270.JPG
http://ungood.narod.ru/images/DSC01269.JPG

к ATmega32 еще подключен LCD. Кварц у обоих на 8МГц.

Как вы наверно уже догадались - передача у меня не пошла.

С чего начать копать?
Можно ли как-нибудь прочитать регистр STATUS у TRC101,
чтобы понять правильно ли прошла инициализация радиомодуля (да и вобще живой ли он))))?

Ниже привожу коды.

Код для передатчика:
/************************************************** ***
Chip type : ATmega48
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
************************************************** ***/
#include ‹mega48.h›
#include ‹delay.h›
void LED_disp (char numb,char dig); //
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
}
// SPI interrupt service routine
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
data=SPDR;
// Place your code here

}
// Declare your global variables here
//************************************************** ******
// TRC INITIALIZATION
//************************************************** ******
void INIT_TRC101 (void)
{
PORTD.0=0; //nSSl;
SPDR=0x80;//Configuration Register
delay_ms(5);
SPDR=0xD3;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xA4;//Freqency Setting Register -433Mhz
delay_ms(5);
SPDR=0xB0;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0x82;//PowerManagment/////////////////////////////
delay_ms(5);
SPDR=0xD9;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0x96;//Resiever Control(Fast)
delay_ms(5);
SPDR=0x60;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0x98;//TransmitterConfiguretion
delay_ms(5);
SPDR=0x90;
PORTD.0=1; //nSSh;
delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xCE;//Sinc char command
delay_ms(5);
SPDR=0xD4;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xCC;//PLL configuration
delay_ms(5);
SPDR=0x56;
PORTD.0=1; //nSSh;

delay_ms(5);

//********************************************

PORTD.0=0; //nSSl;
SPDR=0xC6;//Data Rate /9600 kbps
delay_ms(5);
SPDR=0x23;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xC2;// Baseband Filter
delay_ms(5);
SPDR=0xAA;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xCA;//FIFO/Reset
delay_ms(5);
SPDR=0x83;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xC4;//AFA
delay_ms(5);
SPDR=0x60;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xC0;//Battery/Clock
delay_ms(5);
SPDR=0x00;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xC8;//Duty Cycle
delay_ms(5);
SPDR=0x0E;
PORTD.0=1; //nSSh;

delay_ms(5);

PORTD.0=0; //nSSl;
SPDR=0xE1;//WakeUp Timer
delay_ms(5);
SPDR=0x96;
PORTD.0=1; //nSSh;
}
//************************************************** ******
// INITIALIZATION TRANSMITT MODE
//************************************************** ******

void INIT_TX (void)
{
delay_ms(5);
PORTD.0=0; //nSSl;
SPDR=0x82;//PowerManagment
delay_ms(5);
SPDR=0x79;
PORTD.0=1; //nSSh;
delay_ms(5);
}

void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T
PORTB=0x00;
DDRB=0x2D;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0xFF;
PORTD.0=1;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 62,500 kHz
// Mode: Fast PWM top=OCR0A
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xD0;
SPSR=0x00;

// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm
// Global enable interrupts
#asm("sei")
/* Start transmission */
LED_disp (0,2);
delay_ms(5000);

LED_disp (1,2);
delay_ms(1000);
//Start TRC-cycle
//инициализация передатчика
INIT_TRC101();
INIT_TX ();
delay_ms(2);
PORTD.0=0; //nCS
PORTC.4=1;//nFSEL=1;

//передача преамбулы
SPDR=0xAA;
SPDR=0xAA;
SPDR=0x2D;
SPDR=0xD4;

//передача данных
SPDR=0x83;

//ждем конца передачи по spi
delay_ms(200);

//команда завершения передачи
SPDR=0x00;
PORTD.0=1; //nCS







while (1)
{
// Place your code here
};
}


Код приемника:
/************************************************** ***
Chip type : ATmega32
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 512
************************************************** ***/
#include ‹mega32.h›
#include ‹delay.h›
#include ‹stdio.h›
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include ‹lcd.h›

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
}

// SPI interrupt service routine
unsigned char buffer[16];
interrupt [SPI_STC] void spi_isr(void)
{
unsigned char data;
data=SPDR;
if(data!=0)
{
sprintf(buffer,"*%u",data);
lcd_puts(buffer);
}
}
// Declare your global variables here
//************************************************** ******
// TRC INITIALIZATION
//************************************************** ******
void INIT_TRC101 (void)
{
PORTB.0=0; //nSSl;
SPDR=0x80;//Configuration Register
delay_ms(5);
SPDR=0xD3;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xA4;//Freqency Setting Register -433Mhz
delay_ms(5);
SPDR=0xB0;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0x82;//PowerManagment/////////////////////////////
delay_ms(5);
SPDR=0xD9;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0x96;//Resiever Control(Fast)
delay_ms(5);
SPDR=0x60;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0x98;//TransmitterConfiguretion
delay_ms(5);
SPDR=0x90;
PORTB.0=1; //nSSh;
delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xCE;//Sinc char command
delay_ms(5);
SPDR=0xD4;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xCC;//PLL configuration
delay_ms(5);
SPDR=0x56;
PORTB.0=1; //nSSh;

delay_ms(5);

//********************************************

PORTB.0=0; //nSSl;
SPDR=0xC6;//Data Rate /9600 kbps
delay_ms(5);
SPDR=0x23;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xC2;// Baseband Filter
delay_ms(5);
SPDR=0xAA;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xCA;//FIFO/Reset
delay_ms(5);
SPDR=0x83;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xC4;//AFA
delay_ms(5);
SPDR=0x60;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xC0;//Battery/Clock
delay_ms(5);
SPDR=0x00;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xC8;//Duty Cycle
delay_ms(5);
SPDR=0x0E;
PORTB.0=1; //nSSh;

delay_ms(5);

PORTB.0=0; //nSSl;
SPDR=0xE1;//WakeUp Timer
delay_ms(5);
SPDR=0x96;
PORTB.0=1; //nSSh;
}
//************************************************** ******
// INITIALIZATION RESEIVE MODE
//************************************************** ******

void INIT_RX (void)
{
PORTB.0=0; //nSSl;
SPDR=0x82;//PowerManagment
SPDR=0xD9;
PORTB.0=1; //nSSh;
}

void main(void)
{
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=Out
// State7=0 State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xB3;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2000,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=0xD0;
SPSR=0x00;

// Clear the SPI interrupt flag
#asm
in r30,spsr
in r30,spdr
#endasm

// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Initialize:");

// Global enable interrupts
#asm("sei")
//Start TRC-cycle
INIT_TRC101();
INIT_RX ();
delay_ms(3000);
lcd_putsf("OK");
lcd_gotoxy(0,1);

while(PINB.1==1)//FINT!=1
{;}
PORTB.0=1; //nCS=1;
PORTB.2=0; //nFSEL=0;

SPDR=0x00;


while (1)
{
// Place your code here

};
}
Pavel_xx вне форума  
Непрочитано 10.02.2010, 02:41  
Panchiks
Частый гость
 
Регистрация: 21.01.2007
Адрес: г. Владивосток
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Panchiks на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Здорово, Pavel_xx!

А ты пробовал проверять, TRC101 у тебя хавает команды вообще? Примитивные, ну, например, вкл/выкл выход тактовой частоты на ногу, или попробовать поизлучать меандр (в цикле передавать 01010101...)? И приборами потыкаться? Частотомер или укв-ка есть?
Если не пробовал, то нада попробовать (код нету силы читать - встал в 5 утра седня)
Panchiks вне форума  
Непрочитано 10.02.2010, 11:59  
radist1982
Частый гость
 
Регистрация: 16.07.2007
Сообщений: 24
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
radist1982 на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Pavel_xx
между посылками байтов по SPI используйте
Код:
while(!(SPSR & (1‹‹SPIF)));
.

Вот это вообще работать не будет:
Код:
void INIT_RX (void)
{
PORTB.0=0; //nSSl;
SPDR=0x82;//PowerManagment
SPDR=0xD9;
PORTB.0=1; //nSSh;
}
Я же выше писал функции по работе с чипом словами по SPI. И причем код под АВР. Регистры те же. Проверено - работает.
radist1982 вне форума  
Непрочитано 10.02.2010, 13:53  
radist1982
Частый гость
 
Регистрация: 16.07.2007
Сообщений: 24
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
radist1982 на пути к лучшему
По умолчанию Re: Однокристальные трансиверы TRC101 от RFM...

Значит еще раз:
1. функции по работе с SPI есть. см. выше.
2. Инициализация чипа выглядит так:
Код:
void RF12_RX_Init_() {    
    RF12_WRT_CMD(0x00);
    RF12_WRT_CMD(0x00);
    RF12_WRT_CMD(0x80D7); //EL,EF,433band,12.0pF
    RF12_WRT_CMD(0x82D9); //    !er,!ebb,!ET,ES,EX,!eb,!ew,DC
    RF12_WRT_CMD(0xA640); //freq select 434MHz
    RF12_WRT_CMD(0xC647); //4.8kbps
    RF12_WRT_CMD(0x9620); ////p20 : VDIout, VDI response time = Slow, Receiver bandwidth = 400 kHz,LNA gain = 0 dB,RSSI threshold = -103 dBm
    RF12_WRT_CMD(0xC2AC); //AL,!ml,DIG,DQD4
    RF12_WRT_CMD(0xCA81); //FIFO8,SYNC,!ff,DR
    RF12_WRT_CMD(0xCED4); // SYNC= (0x2D00 | RF12_SYNC_BYTE);
    RF12_WRT_CMD(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
    RF12_WRT_CMD(0x9850); //!mp,90kHz,MAX OUT
    RF12_WRT_CMD(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
    RF12_WRT_CMD(0xE000); //NOT USE
    RF12_WRT_CMD(0xC800); //NOT USE
    RF12_WRT_CMD(0xC040); //1.66MHz,2.2V
    RF12_WRT_CMD(0);
    RF12_WRT_CMD(0);
    delay_us(200); 

    RF12_FIFOReset_();
    RF12_RX_IRQ_ON; // Разрешаем прерывания по приему байта от RF12    
    RX_TX_STATE=1;          // Переходим в состояние приемника
    RF_TX_PACK_READY=1;     // Флаг готовности передавать пакет
    RF_RX_BUFFER_INDEX=0;   // Индекс буфера приёма в начало
    return;
    }
3. Передача пакета. Да, именно пакета т.к. байты отдельно не передаю. Но можно сделать и байтами, это совсем не сложно
Код:
// Новый вариант с очередями    
uint16 RF12_TX_PACKAGE_(uint8 *rf_tx_buf, uint8 Len) {  // Пакет передается 30мс  (23/(4800/8)[байт/с] = 38,4 мс)
    uint8 i;
    uint16 crc16;  
    // Начинаем передачу
    RF12_SWITCH_RX_TO_TX(); 
  
    // Вычисляем кoнтрольную сумму CRC16
    crc16= (uint16) CRC16((uint8*)rf_tx_buf,Len);  
    
    RF12_WRT_CMD(0x0000);
    //delay_ms(1);  /// Ставить нельзя иначе не будет работать
    for(i=0;i‹5;i++) RF12_SEND_(0xAA);  // Отправляем синхронизацию
    RF12_SEND_(0x2D);
    RF12_SEND_(0xD4);
    RF12_SEND_(RF_PREAMBLE_BYTE); // Отсылаем преамбулу 0xCC  
    for(i=0;i‹Len;i++) RF12_SEND_(rf_tx_buf[i]);       
    RF12_SEND_((uint8) (crc16››8));             // Отправляем старший байт CRC16
    RF12_SEND_((uint8) (0x00FF & crc16));       // Отправляем младший байт CRC16      
    RF12_SEND_(0xAA);                           // Заканчиваем передачу
    RF12_SEND_(0xAA); 
    RF12_SEND_(0xAA);   
     
    RF12_SWITCH_TX_TO_RX();
    return crc16;
    }
либо вот так у меня реализован пинг до другого радиомодуля:
Код:
void RF_TX_PING(uint8 cmd) {        
    
        RF12_SWITCH_RX_TO_TX(); 
    
        RF12_WRT_CMD(0x0000);
        RF12_SEND_(0xAA);  // Отправляем синхронизацию  
        RF12_SEND_(0xAA);
        RF12_SEND_(0xAA);
        RF12_SEND_(0xAA);
        RF12_SEND_(0xAA);
        RF12_SEND_(0x2D);
        RF12_SEND_(0xD4);
        RF12_SEND_(cmd);  // Отсылаем ping или echoping       
        RF12_SEND_(0xAA); // Заканчиваем передачу
        RF12_SEND_(0xAA); 
        RF12_SEND_(0xAA);   
     
        RF12_SWITCH_TX_TO_RX(); 
        
    return;
    }
4. На счет приёма - тут сложнее. У использую nIRQ-пин чипа. Его изменения я поставил на прерывания в контроллере. Вот так у меня выглядит обработчик прерывания:
Код:
// Pin change 0-7 interrupt service routine
interrupt [PCINT0] void pin_change_isr0(void) {
    uint16 data;     
    uint8 *p; 
    uint16 crc; 
    
    RF12_RX_IRQ_OFF;

    if(RX_TX_STATE==1) {                                            
        if(RF12_WRT_CMD(0x0000)&0x8000) { 
            data = RF12_WRT_CMD(0xB000);
            data &= 0x00FF;
 
            // Три условия приема байта сообщения:
            // 1. Если пришел 0хСС и при том индекс = 0 либо индекс != 0
            // 2. Если нет переполнения буфера
            // 3. Если мы в режиме "чистого" приема

                RF_RX_BUFFER[RF_RX_BUFFER_INDEX]= (uint8) data;  // Пишем пришедший байт в буфер
                RF_RX_BUFFER_INDEX++;                         // Инкременитируем индекс буфера    
                if (RF_RX_BUFFER_INDEX==RF_RX_BUFFER_SIZE) {  // Проверяем буфер на заполненность
                    p = RF_RX_BUFFER;
                    p++;       
                    RF12_FIFOReset_(); // !!!!!!!!!!!!!!!!!
                                            
                    RF_RX_BUFFER_INDEX=0; // Принимаем заново   
                    }                    
                }           
                     
    RF12_RX_IRQ_ON;
    return;
    }
Я половину убрал ненужного для освоения работы чипа. Надеюсь при этом не выкинул ничего лишнего

У меня там всё сделано по-взрослому - система очередей, контрольные суммы, контроль прихода байтов в пакете. Всё это я убрал.

Ах да, забыл про сброс фифо. Для него вот такой макрос.

Код:
#define RF12_FIFOReset_() {RF12_WRT_CMD(0xCA81); RF12_WRT_CMD(0xCA83); }
Вот еще макросы.
Код:
#define RX_ON  PORTB |= (1‹‹7)
#define RX_OFF PORTB &= (uint8) ~(1‹‹7)

#define TX_ON  PORTB |= (1‹‹6)
#define TX_OFF PORTB &= (uint8) ~(1‹‹6)

#define RF12_RX_IRQ_ON PCMSK0=0x10  // На PORTB.4 (PCINT4) заведён nIRQ по которому можно в режиме приёма отслеживать приход байта
#define RF12_RX_IRQ_OFF PCMSK0=0x00


#define RF12_SWITCH_TX_TO_RX() {                    \
                RX_TX_STATE=1;   \
                TX_OFF;                             \
                RF12_WRT_CMD(0x82D9);               \
                RX_ON;                              \
                RF12_FIFOReset_();                  \
                RF12_RX_IRQ_ON;                     \
                delay_us(200);}  
#define RF12_SWITCH_RX_TO_TX() {                    \
                RX_TX_STATE=2;  \
                RF12_RX_IRQ_OFF;                    \
                RX_OFF;                             \
                RF12_WRT_CMD(0x8239);               \
                TX_ON;                              \
                delay_us(200); }
В принципе у Вас, Pavel_xx есть всё что нужно. Если будут КОНКРЕТНЫЕ вопросы - пишите тут. Так что если интересна данная тема то потратьте время на её изучение и читайте даташит - там достаточно написано, разве что не разжевано.

Последний раз редактировалось radist1982; 10.02.2010 в 14:04.
radist1982 вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Однокристальные трансиверы CC2500 (СС1100) kassiopay Микроконтроллеры, АЦП, память и т.д 2 07.06.2009 19:08


Часовой пояс GMT +4, время: 04:10.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.