Взялся за небольшую работку, но "увяз" на 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);
}
}
#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);
}
}