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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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, время: 20:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot