|
Всем привет! Осваиваю трансивер TR24а (даташиты http://delanet.ru/content/view/532/39/) для передачи данных между МК по радиоканалу. Пытаюсь прицепить модуль к ATMega8L, но что-то не очень пока получается. Все делаю на основе кода китайца (http://delanet.ru/content/view/767/46/) Может, кто-то это уже сделал? Или сможете обнаружить ошибку незамыленным глазом? Вот код //www.bulkin.info //Code for ATMega8L + TR24A #include <mega8.h> #include <delay.h> #define IN 0 #define OUT 1 // Pins definitions Определение пинов ATMega8L - TR24A #define nRST PORTB.1 // PB1 (OC1A) - RESET_n Сброс. Активный при низком сигнале. #define SS PORTB.2 // PB2 (SS) - SPI_SS Slave select input Выбор активного устройства с SPI (высокий - активен?) #define MOSI PORTB.3 // PB3 (MOSI) - SPI_MOSI Master Output Slave Input #define MISO PORTB.4 // PB4 (MISO) - SPI_MISO Master Input Slave Out #define CLK PORTB.5 // PB5 (SCK) - SPI_CLK SPI Clock. Тактирование обмена по SPI #define FIFO PORTC.5 // PC5 - FIFO_FLAG First input First out buffer full/empty #define TXRX PORTC.4 // PC4 - PKT_FLAG Transfer/Recive packet Отпрака/прием пакета // Pins init Инифиализация пинов void init_pins(void){ //Direction set. Установка пинов //Измените имя порта и номер пина, если требуется: DDRB.4 -> DDRC.3 Порт B, пин 4 -> Порт С, пин 3 DDRB.1 = OUT; // nRST as out pin of MC ATMega8L DDRB.2 = OUT; // SS as out pin DDRB.3 = OUT; // MOSI DDRB.4 = IN; // MISO as input DDRB.5 = OUT; // CLK DDRC.5 = IN; // FIFO DDRC.4 = IN; // TXRX flag //Очистка состояний пинов Default pin states setting nRST = 0; SS = 0; MOSI = 0; CLK = 0; } // Sends char (8 bits) through SPI to the module // Посылает символ (8 бит) через SPI модулю void Spi_Tx_Loop(unsigned char tx_data){ unsigned char temp; int i; for(i=0;i<8;i++){ // Send 8 bits CLK = 1; // SPI_CLK high temp = tx_data & 1; if(temp) MOSI=1; //if first bit of tx_data = 1 then MOSI = 1 else MOSI=0; //else MOSI=0 tx_data=1; //Shift bit: 101000 -> 010001 delay_ms(1); // delay 1 ms CLK = 0; // SPI_CLK low delay_ms(1); // delay 1 ms } } // Send register to SPI. Отправляет регистр по SPI. void SpiTxReg(unsigned char rf_com, unsigned char rf_hb, unsigned char rf_lb){ SS = 1; // SS high (nonactive) CLK = 0; // CLK low SS = 0; // SS low (active) Spi_Tx_Loop(rf_com); // command send Spi_Tx_Loop(rf_hb); // high byte send Spi_Tx_Loop(rf_lb); // low byte send SS = 1; // SS high (nonactive) CLK = 0; // CLK low } void INTO_TX(void){ SpiTxReg(0x52,0x80,0x00); //RESET TX delay_ms(5); SpiTxReg(0x07,0x01,0x10); //INTO TX delay_ms(5); } // RF module init void init_TR24A(void){ nRST = 0; // Reset active delay_ms(30); // Wait 30 ms nRST = 1; // Reset not active delay_ms(30); // Wait 30 ms //unsigned int rec_data; debug answer //INITIAL REG48~REG58 SpiTxReg(0x30,0x98,0x00); //reg48 // rec_data=SpiRxReg(0x30); SpiTxReg(0x31,0xFF,0x0F); //reg49 // rec_data=SpiRxReg(0x31); SpiTxReg(0x32,0x80,0x28); //reg50 SpiTxReg(0x33,0x80,0x56); //reg51 SpiTxReg(0x34,0x4E,0xF6); //reg52 SpiTxReg(0x35,0xF6,0xF5); //reg53 SpiTxReg(0x36,0x18,0x5C); //reg54 SpiTxReg(0x37,0xD6,0x51); //reg55 SpiTxReg(0x38,0x44,0x04); //reg56 SpiTxReg(0x39,0xE0,0x00); //reg57 SpiTxReg(0x3a,0x00,0x00); //reg58 delay_ms(20); // delay for 20 ms //INITIAL REG0~REG28 SpiTxReg(0x00,0x35,0x4F); //reg00 SpiTxReg(0x02,0x1F,0x01); //reg02 SpiTxReg(0x04,0x38,0xD8); //reg04 SpiTxReg(0x05,0x00,0xA1); //reg05 SpiTxReg(0x07,0x12,0x4C); //reg07 SpiTxReg(0x08,0x80,0x08); //reg08 SpiTxReg(0x09,0x21,0x01); //reg09 SpiTxReg(0x0A,0x00,0x04); //reg10 SpiTxReg(0x0B,0x40,0x41); //reg11 SpiTxReg(0x0C,0x7E,0x00); //reg12 SpiTxReg(0x0D,0x00,0x00); //reg13 SpiTxReg(0x0E,0x16,0x9D); //reg14 SpiTxReg(0x0F,0x80,0x2F); //reg15 SpiTxReg(0x10,0xB0,0xF8); //reg16 // SpiTxReg(0x11,0x00,0x66); //reg17 SpiTxReg(0x12,0xE0,0x00); //reg18 SpiTxReg(0x13,0xA1,0x14); //reg19 SpiTxReg(0x14,0x81,0x91); //reg20 SpiTxReg(0x15,0x69,0x62); //reg21 SpiTxReg(0x16,0x00,0x02); //reg22 SpiTxReg(0x17,0x00,0x02); //reg23 SpiTxReg(0x18,0xB1,0x40); //reg24 SpiTxReg(0x19,0x78,0x0F); //reg25 SpiTxReg(0x1A,0x3F,0x04); //reg26 // SpiTxReg(0x1B,0x80,0x00); //reg27 SpiTxReg(0x1C,0x58,0x00); //reg28 SpiTxReg(0x07,0x00,0x00); //Completed to enter the Idle Mode } void Write_FIFO_Start(unsigned char rf_com,unsigned char tx_leng){ // FIFO write start Начало записи в буффер FIFO SS = 1; CLK = 0; SS = 0; Spi_Tx_Loop(rf_com); //SPI command Spi_Tx_Loop(tx_leng); //SPI TX length } void Write_FIFO_End(void){ SS = 1; CLK = 0; } void Write_FIFO_data(unsigned char tx_data){ Spi_Tx_Loop(tx_data); } void WRITE_FIFO(unsigned char tx_leng,unsigned char tx_data){ // Write data in First-in-first-out buffer to TX // Запись данных в буффер FIFO для передачи int i; SpiTxReg(0x52,0x80,0x00); //RESET TX Сброс передачи delay_ms(5); //delay 5 ms Write_FIFO_Start(0x50,tx_leng); //WRITE FIFO Запуск записи в FIFO for(i=0; itx_leng; i++) Write_FIFO_data(tx_data); //Запись данных Write_FIFO_End(); //Окончание записи в FIFO SpiTxReg(0x07,0x01,0x10); //INTO TX В режим передачи delay_ms(5); //delay 5 ms // i = 0; //while( i == 0) //If PKT_FLAG = 0 while waiting, one down the implementation of equal //{ //i = Port_B; //But here there is no role Application Notes Say io can read this data to determine whether the transfer is complete //i &= PKT_FLAG; //Check pkt_flag //} SpiTxReg(0x52,0x80,0x00); //RESET TX delay_ms(5); //delay 5 ms SpiTxReg(0x07,0x00,0x00); //TX completed, enter the Idle Mode delay_ms(5); } void main(void){ init_pins(); //Microcontroller's pins init init_TR24A(); //TX. Отправка данных INTO_TX(); while (1){ WRITE_FIFO(0x04,0x99); //SEND 4BYTE LENGTH 0x99 0x99 0x99 0x99 } }
|
|