Synergia AVR 0.1
|
00001 /* Project info here */ 00002 00003 #include <avr/io.h> 00004 #include <avr/interrupt.h> 00005 #include <util/delay.h> 00006 00007 #include "usart.h" 00008 00009 #define SCK 7 00010 #define SDI 6 00011 #define SDO 5 00012 #define CS 4 // NSEL 00013 #define NIRQ 2 00014 00015 #define HI(x) PORTB |= (1<<(x)) 00016 #define LO(x) PORTB &= ~(1<<(x)) 00017 #define WAIT_NIRQ_LOW() while(PIND & (1<<NIRQ)) 00018 00019 00020 USART32(usb); 00021 00022 void portInit(){ 00023 HI(CS); 00024 HI(SDI); 00025 LO(SCK); 00026 DDRB = (1<<CS)|(1<<SDI)|(1<<SCK); 00027 DDRD = (1 << PD6); 00028 } 00029 00030 unsigned int writeCmd(unsigned int cmd){ 00031 unsigned char i; 00032 unsigned int recv; 00033 recv = 0; 00034 LO(SCK); 00035 LO(CS); 00036 for(i=0; i<16; i++){ 00037 if(cmd & 0x8000) HI(SDI); 00038 else LO(SDI); 00039 00040 HI(SCK); 00041 recv <<= 1; 00042 if(PINB & (1<<SDO)){ 00043 recv |= 0x0001; 00044 } 00045 00046 LO(SCK); 00047 cmd <<= 1; 00048 } 00049 HI(CS); 00050 return recv; 00051 } 00052 00053 void rfInit(){ 00054 writeCmd(0x80E7); // EL,EF,868band,12.0pF 00055 writeCmd(0x8299); // !er,!ebb,ET,ES,EX,!eb,!ew,DC 00056 writeCmd(0xA640); // frequency select 00057 writeCmd(0xC647); // 4.8kbps 00058 writeCmd(0x94A0); // VDI,FAST,134kHz,0dBm,-103dBm 00059 writeCmd(0xC2AC); // AL,!ml,DIG,DQD4 00060 writeCmd(0xCA81); // FIFO8,SYNC,!ff,DR 00061 writeCmd(0xCED4); // SYNC=2DD4AG 00062 writeCmd(0xC483); // @PWR,NO RSTRIC,!st,!fi,OE,EN 00063 writeCmd(0x9850); // !mp,90kHz,MAX OUT 00064 writeCmd(0xCC17); // OB1ACOB0, LPX,Iddy,CDDIT,CBW0 00065 writeCmd(0xE000); // NOT USED 00066 writeCmd(0xC800); // NOT USED 00067 writeCmd(0xC040); // 1.66MHz,2.2V 00068 } 00069 00070 unsigned char rfRecv(){ 00071 unsigned int data; 00072 while(1){ 00073 usb << "rfRecv: "; 00074 data = writeCmd(0x0000); 00075 usb << (int)data << '\n' << '\r'; 00076 if ( (data & 0x8000) ) { 00077 data = writeCmd(0xB000); 00078 return (data & 0x00FF); 00079 } 00080 } 00081 } 00082 00083 void FIFOReset(){ 00084 writeCmd(0xCA81); 00085 writeCmd(0xCA83); 00086 } 00087 00088 void rfSend(unsigned char data){ 00089 WAIT_NIRQ_LOW(); 00090 writeCmd(0xB800 + data); 00091 } 00092 00093 void rfSendPackage(){ 00094 writeCmd(0x0000); 00095 rfSend(0xAA); // PREAMBLE 00096 rfSend(0xAA); // PREAMBLE 00097 rfSend(0xAA); // PREAMBLE 00098 rfSend(0x2D); // SYNC 00099 rfSend(0xD4); 00100 00101 // send 16 bytes package 00102 for(int i=0; i<16; i++){ 00103 rfSend(0x30 + i); 00104 } 00105 00106 rfSend(0xAA); // DUMMY 00107 rfSend(0xAA); // DUMMY 00108 rfSend(0xAA); // DUMMY 00109 } 00110 00111 int main(){ 00112 00113 sei(); 00114 unsigned char data, i; 00115 portInit(); 00116 rfInit(); 00117 FIFOReset(); 00118 00119 usb << "READY TO GO\n"; 00120 00121 while(1){ 00122 for(i=0; i<16; i++){ 00123 data = rfRecv(); 00124 // usart send 00125 usb << "data: "; 00126 usb << data; 00127 usb << " num: "; 00128 usb << (int)data; 00129 usb << "\n\r"; 00130 } 00131 FIFOReset(); 00132 } 00133 00134 00135 return 0; 00136 } 00137