Guest User

Untitled

a guest
May 23rd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.76 KB | None | 0 0
  1. #include "main.h"
  2. #include "rfm12.h"
  3. #include "uart.h"
  4.  
  5. void SPI_MasterInit(void)
  6. {
  7.   PORT_SS |= (1 << P_SS);    //Slave deselect HIGH
  8.  
  9.   /* Set MOSI and SCK and SS output, all others input */
  10.   DDR_SPI = (1 << DD_MOSI) | (1 << DD_SCK) | (1 << DD_SS);
  11.   /* Enable SPI, Master,  */
  12.   SPCR = (1 << SPE) | (1 << MSTR);
  13.   //SPCR |= (1 << SPR0); //Seite 144 set clock rate fck/16 kann noch beschleunigt werden?
  14.   //SPR 000 = /4    6144000/4=1.536.000    2.500.000
  15.   //SPCR |= (1 << CPHA); //Input Sampeln on last clock edge
  16. }
  17.  
  18. uint8_t SPI_MasterTransmit(uint8_t cData)
  19. {
  20.   uint8_t  b = 0;
  21.   /* Start transmission */
  22.   SPDR = cData;
  23.   /* Wait for transmission complete */
  24.   while(!(SPSR & (1<<SPIF)));
  25.   b = SPDR;
  26.  
  27.   return  b;
  28. }
  29. /* Ende: SPI für RFM12 */
  30.  
  31. /* RFM12 */
  32. uint16_t RFM12_WRT_CMD(uint16_t data)
  33. {
  34.   uint16_t  b = 0;
  35.   //uint8_t    t = 0;
  36.  
  37.   PORT_SS &= ~(1 << P_SS);   //Slave select LOW
  38.    
  39.   b = SPI_MasterTransmit(data >> 8) << 8;
  40.   b |= SPI_MasterTransmit(data & 0x00FF);
  41.  
  42.   PORT_SS |= (1 << P_SS);    //Slave deselect HIGH
  43.  
  44.   return  b;
  45. }
  46.  
  47. void RF12_INIT(void){
  48.    
  49.     SPI_MasterInit();
  50.  
  51.     //FFIT auf Eingang, FIFO Interrupt (active high) Number of the bits in
  52.     //          the RX FIFO that reach the preprogrammed limit in FIFO mode,
  53.     //          when bit ef is set in Config. setting command.
  54.     FFIT_DDR &= ~(1 << FFIT_P);  // Eingang
  55.     FFIT_PORT &= ~(1 << FFIT_P);  // PullUp Aus
  56.     //VDI auf Eingang (Valid Data Indicator)
  57.     VDI_DDR &= ~(1 << VDI_P);  // Eingang
  58.     VDI_PORT &= ~(1 << VDI_P);  // PullUp Aus
  59.     //nIRQ auf Eingang, wird low wenn Status abgeholt werden muss
  60.     nIRQ_DDR &= ~(1 << nIRQ_P);  // Eingang
  61.     nIRQ_PORT &= ~(1 << nIRQ_P);  // PullUp Aus
  62.     //FSK mit PullUp auf High PortPin B3
  63.     FSK_DDR &= ~(1 << FSK_P);  // Eingang
  64.     FSK_PORT |= (1 << FSK_P);  // PullUp An
  65.        
  66.     RFM12_WRT_CMD(0x80D7);//EL,EF,11.5pF
  67.     RFM12_WRT_CMD(0x82D9);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
  68.     RFM12_WRT_CMD(0xA640);//434MHz
  69.     RFM12_WRT_CMD(0xC647);//4.8kbps
  70.     RFM12_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
  71.     RFM12_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
  72.     RFM12_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
  73.     RFM12_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
  74.     RFM12_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
  75.     RFM12_WRT_CMD(0xE000);//NOT USE
  76.     RFM12_WRT_CMD(0xC800);//NOT USE
  77.     RFM12_WRT_CMD(0xC400);//1.66MHz,2.2V
  78. }
  79.  
  80. void RFM12_SEND(uint8_t c)
  81. {
  82.   uint16_t status = 0;
  83.  
  84.   while (!RFM12_nIRQ); //Warten auf int
  85.   status = RFM12_WRT_CMD(0x0000);   //Status abholen
  86.   RFM12_WRT_CMD(0xB800 + c); //Zeichen senden
  87. }
  88.  
  89. void RFM12_SEND_PACKET(uint8_t txdata)
  90. {
  91.     LED1_ON();
  92.     RFM12_WRT_CMD(0x0000);//read status register
  93.     RFM12_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
  94.     RFM12_SEND(0xAA);//PREAMBLE
  95.     RFM12_SEND(0xAA);//PREAMBLE
  96.     RFM12_SEND(0xAA);//PREAMBLE
  97.     RFM12_SEND(0x2D);//SYNC HI BYTE
  98.     RFM12_SEND(0xD4);//SYNC LOW BYTE
  99.    
  100.     RFM12_SEND(txdata);//DATA BYTE 0
  101.    
  102.     RFM12_SEND(0xAA);//DUMMY BYTE
  103.     RFM12_SEND(0xAA);//DUMMY BYTE
  104.     RFM12_SEND(0xAA);//DUMMY BYTE
  105.     RFM12_WRT_CMD(0x8201);
  106.     LED1_OFF();
  107. }
  108.  
  109. void RFM12_STATUS(void)
  110. {
  111. //  char s[17];
  112.   uint16_t  w;
  113.  
  114.   if (RFM12_nIRQ) {
  115.  
  116.     w = RFM12_WRT_CMD(0x0000);  //Status abholen
  117.  
  118. //    uart_puts("  RFM12 Status: ");
  119. //    uart_puts(utoa(w, s, 2 ));
  120.  
  121.   }
  122. }
  123.  
  124. uint8_t RFM12_RECV()
  125. {  
  126.     uint16_t   w = 0;
  127.     uint16_t   status = 0;
  128.  
  129.     uint8_t   b = 0;
  130.  
  131.     uint8_t rxdata;
  132.    
  133.     RFM12_WRT_CMD(0xCA81);  //FIFO initalisieren
  134.          
  135.     RFM12_WRT_CMD(0xCA83); //FIFO aktivieren
  136.     while (!RFM12_nIRQ)//Warten auf int    
  137.  
  138.     status = RFM12_WRT_CMD(0x0000);   //Status abholen
  139.        
  140.     w = RFM12_WRT_CMD(0xB000);  //Daten abholen
  141.  
  142.     b = w & 0x00FF;    
  143.  
  144.     RFM12_WRT_CMD(0xCA81);  //FIFO deaktivieren
  145.     return b;
  146. }
  147.  
  148. void Delay_ms(uint16_t ms)
  149. {
  150.     for(uint16_t t=0; t<=ms; t++)
  151.         _delay_ms(1);
  152. }
Add Comment
Please, Sign In to add comment