-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTRC.c
209 lines (176 loc) · 4.64 KB
/
TRC.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include <mega16.h>
#include <delay.h>
#include <trc.h>
void TrcPortInit()
{
TRCDDR = (1<<SDI) | (1<<SCK) | (1<<CS) | (1<<NFSEL);
HI(CS);
HI(SDI);
LO(SCK);
LO(NFSEL);
delay_ms(2000);
}
void TrcInitRcv() // Èíèöèàëèçàöèÿ TRC êàê ïðèåìíèêà
{
writeCmd(0x80D7); //EL,EF,433band,12.0pF
writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC (init as receiver)
writeCmd(0xA640); //freq select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR (FIFO level = 8)
writeCmd(0xCED4); //SYNC=2DD4;
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9850); //!mp,90kHz,MAX OUT
writeCmd(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
writeCmd(0xE000); //NOT USE
writeCmd(0xC800); //NOT USE
writeCmd(0xC000); //1MHz,2.2V
}
void TrcInitSnd() // Èíèöèàëèçàöèÿ TRC êàê ïåðåäàò÷èêà
{
writeCmd(0x80D7); //EL,EF,433band,12.0pF
writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
writeCmd(0xA640); //frequency select
writeCmd(0xC647); //4.8kbps
writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
writeCmd(0xCED4); //SYNC=2DD4 , AG
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
writeCmd(0x9850); //!mp,90kHz,MAX OUT
// writeCmd(0x9855); //!mp,90kHz,MIN OUT
writeCmd(0xCC17); //OB1 , ACOB0, LPX,Iddy,CDDIT,CBW0
writeCmd(0xE000); //NOT USED
writeCmd(0xC800); //NOT USED
writeCmd(0xC000); //1MHz,2.2V
}
unsigned int writeCmd(unsigned int cmd)
{
unsigned char i;
unsigned int recv=0;
recv = 0;
LO(SCK);
LO(CS);
for(i=0; i<16; i++)
{
if(cmd&0x8000) HI(SDI);
else LO(SDI);
HI(SCK);
recv<<=1;
if( TRCPIN & (1<<SDO) )
{
recv|=0x0001;
}
delay_us(1);
LO(SCK);
cmd<<=1;
delay_us(1);
}
HI(CS);
delay_us(10);
return recv;
}
void TrcSendByte(unsigned char cData)
{
writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
delay_ms(5);
LO(CS); // Ïðèçíàê íà÷àëà
HI(NFSEL); // ïåðåäà÷è ïàêåòà
TRCSpiSend(0xB8,0);
TRCSpiSend(0xAA,1);
TRCSpiSend(0xAA,1);
TRCSpiSend(0x2D,1);
TRCSpiSend(0xD4,1);
TRCSpiSend(cData,1); // Ïåðåäàâàåìûé áàéò äàííûõ
TRCSpiSend(0xAA,1);
TRCSpiSend(0x00,1);
HI(CS); // Ïåðåäà÷à ïàêåòà
LO(NFSEL); // îêîí÷åíà
writeCmd(0x8201); //!er,!ebb,ET,ES,EX,!eb,!ew,DC // Îòêëþ÷åíèå ïåðåäàò÷èêà
}
void TrcSendPocket(unsigned char *cData, unsigned char cLong)
{
unsigned char i=0;
writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
delay_ms(5);
LO(CS); // Ïðèçíàê íà÷àëà
HI(NFSEL); // ïåðåäà÷è ïàêåòà
TRCSpiSend(0xB8,0);
TRCSpiSend(0xAA,1);
TRCSpiSend(0xAA,1);
TRCSpiSend(0x2D,1);
TRCSpiSend(0xD4,1);
for(i=0; i<cLong; i++)
{
TRCSpiSend(cData[i],1); // Ïåðåäàâàåìûé áàéò äàííûõ
}
TRCSpiSend(0xAA,1);
TRCSpiSend(0x00,1);
HI(CS); // Ïåðåäà÷à ïàêåòà
LO(NFSEL); // îêîí÷åíà
writeCmd(0x8201); //!er,!ebb,ET,ES,EX,!eb,!ew,DC // Îòêëþ÷åíèå ïåðåäàò÷èêà
}
void FIFOReset()
{
writeCmd(0xCA81);
writeCmd(0xCA83);
}
void TRCSpiSend(unsigned char data, unsigned char WaitSDO)
{
unsigned char i;
if(WaitSDO==1)
{
while(WAIT_SDO_HI());
}
LO(SCK);
for(i=0; i<8; i++)
{
if(data&0x80) HI(SDI);
else LO(SDI);
HI(SCK);
delay_us(1);
LO(SCK);
data<<=1;
delay_us(1);
}
delay_us(10);
}
unsigned char SpiRead()
{
unsigned char i;
unsigned char recv=0;
recv = 0;
LO(NFSEL);
LO(SCK);
for(i=0; i<8; i++)
{
HI(SCK);
recv<<=1;
if( TRCPIN & (1<<SDO) )
{
recv|=0x0001;
}
delay_us(1);
LO(SCK);
delay_us(1);
}
HI(NFSEL);
delay_us(10);
return recv;
}
void GetTRCPoket(unsigned char *cArray, unsigned char nLen)
{
unsigned char i=0, cData=0;
for(i=0;i<nLen;i++)
{
while( WAIT_FINT_HI() ); // Îæèäàíèå ïðèçíàêà íà÷àëà ïàêåòà FINT == 1
if( FINTPIN&(1<<FINT) ) // FINT == 1
{
cData=SpiRead();
*cArray = cData;
cArray++;
}
}
delay_ms(50);
}