Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "main.h"
- #include "rfm12.h"
- #include "uart.h"
- void SPI_MasterInit(void)
- {
- PORT_SS |= (1 << P_SS); //Slave deselect HIGH
- /* Set MOSI and SCK and SS output, all others input */
- DDR_SPI = (1 << DD_MOSI) | (1 << DD_SCK) | (1 << DD_SS);
- /* Enable SPI, Master, */
- SPCR = (1 << SPE) | (1 << MSTR);
- //SPCR |= (1 << SPR0); //Seite 144 set clock rate fck/16 kann noch beschleunigt werden?
- //SPR 000 = /4 6144000/4=1.536.000 2.500.000
- //SPCR |= (1 << CPHA); //Input Sampeln on last clock edge
- }
- uint8_t SPI_MasterTransmit(uint8_t cData)
- {
- uint8_t b = 0;
- /* Start transmission */
- SPDR = cData;
- /* Wait for transmission complete */
- while(!(SPSR & (1<<SPIF)));
- b = SPDR;
- return b;
- }
- /* Ende: SPI für RFM12 */
- /* RFM12 */
- uint16_t RFM12_WRT_CMD(uint16_t data)
- {
- uint16_t b = 0;
- //uint8_t t = 0;
- PORT_SS &= ~(1 << P_SS); //Slave select LOW
- b = SPI_MasterTransmit(data >> 8) << 8;
- b |= SPI_MasterTransmit(data & 0x00FF);
- PORT_SS |= (1 << P_SS); //Slave deselect HIGH
- return b;
- }
- void RF12_INIT(void){
- SPI_MasterInit();
- //FFIT auf Eingang, FIFO Interrupt (active high) Number of the bits in
- // the RX FIFO that reach the preprogrammed limit in FIFO mode,
- // when bit ef is set in Config. setting command.
- FFIT_DDR &= ~(1 << FFIT_P); // Eingang
- FFIT_PORT &= ~(1 << FFIT_P); // PullUp Aus
- //VDI auf Eingang (Valid Data Indicator)
- VDI_DDR &= ~(1 << VDI_P); // Eingang
- VDI_PORT &= ~(1 << VDI_P); // PullUp Aus
- //nIRQ auf Eingang, wird low wenn Status abgeholt werden muss
- nIRQ_DDR &= ~(1 << nIRQ_P); // Eingang
- nIRQ_PORT &= ~(1 << nIRQ_P); // PullUp Aus
- //FSK mit PullUp auf High PortPin B3
- FSK_DDR &= ~(1 << FSK_P); // Eingang
- FSK_PORT |= (1 << FSK_P); // PullUp An
- RFM12_WRT_CMD(0x80D7);//EL,EF,11.5pF
- RFM12_WRT_CMD(0x82D9);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
- RFM12_WRT_CMD(0xA640);//434MHz
- RFM12_WRT_CMD(0xC647);//4.8kbps
- RFM12_WRT_CMD(0x94A0);//VDI,FAST,134kHz,0dBm,-103dBm
- RFM12_WRT_CMD(0xC2AC);//AL,!ml,DIG,DQD4
- RFM12_WRT_CMD(0xCA81);//FIFO8,SYNC,!ff,DR
- RFM12_WRT_CMD(0xC483);//@PWR,NO RSTRIC,!st,!fi,OE,EN
- RFM12_WRT_CMD(0x9850);//!mp,9810=30kHz,MAX OUT
- RFM12_WRT_CMD(0xE000);//NOT USE
- RFM12_WRT_CMD(0xC800);//NOT USE
- RFM12_WRT_CMD(0xC400);//1.66MHz,2.2V
- }
- void RFM12_SEND(uint8_t c)
- {
- uint16_t status = 0;
- while (!RFM12_nIRQ); //Warten auf int
- status = RFM12_WRT_CMD(0x0000); //Status abholen
- RFM12_WRT_CMD(0xB800 + c); //Zeichen senden
- }
- void RFM12_SEND_PACKET(uint8_t txdata)
- {
- LED1_ON();
- RFM12_WRT_CMD(0x0000);//read status register
- RFM12_WRT_CMD(0x8239);//!er,!ebb,ET,ES,EX,!eb,!ew,DC
- RFM12_SEND(0xAA);//PREAMBLE
- RFM12_SEND(0xAA);//PREAMBLE
- RFM12_SEND(0xAA);//PREAMBLE
- RFM12_SEND(0x2D);//SYNC HI BYTE
- RFM12_SEND(0xD4);//SYNC LOW BYTE
- RFM12_SEND(txdata);//DATA BYTE 0
- RFM12_SEND(0xAA);//DUMMY BYTE
- RFM12_SEND(0xAA);//DUMMY BYTE
- RFM12_SEND(0xAA);//DUMMY BYTE
- RFM12_WRT_CMD(0x8201);
- LED1_OFF();
- }
- void RFM12_STATUS(void)
- {
- // char s[17];
- uint16_t w;
- if (RFM12_nIRQ) {
- w = RFM12_WRT_CMD(0x0000); //Status abholen
- // uart_puts(" RFM12 Status: ");
- // uart_puts(utoa(w, s, 2 ));
- }
- }
- uint8_t RFM12_RECV()
- {
- uint16_t w = 0;
- uint16_t status = 0;
- uint8_t b = 0;
- uint8_t rxdata;
- RFM12_WRT_CMD(0xCA81); //FIFO initalisieren
- RFM12_WRT_CMD(0xCA83); //FIFO aktivieren
- while (!RFM12_nIRQ)//Warten auf int
- status = RFM12_WRT_CMD(0x0000); //Status abholen
- w = RFM12_WRT_CMD(0xB000); //Daten abholen
- b = w & 0x00FF;
- RFM12_WRT_CMD(0xCA81); //FIFO deaktivieren
- return b;
- }
- void Delay_ms(uint16_t ms)
- {
- for(uint16_t t=0; t<=ms; t++)
- _delay_ms(1);
- }
Add Comment
Please, Sign In to add comment