nn-petrovich 0 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба Коллеги, спасайте! Взялся за небольшую работку, но "увяз" на 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); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 8 апреля, 2015 Опубликовано 8 апреля, 2015 · Жалоба Коллеги, спасайте! Взялся за небольшую работку, но "увяз" на MRF49XA. Ищите на форуме моё описание работы с si4421 - mrf49 полный его аналог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться