1 | /*
|
2 | * service.c
|
3 | *
|
4 | * Created: 17.11.2016 22:58:31
|
5 | * Author: Bone
|
6 | */
|
7 |
|
8 | #include "service.h"
|
9 |
|
10 |
|
11 |
|
12 | void Net_NewFrameStart(void) {
|
13 | DataOk = false;
|
14 | RxHeader = 0x00;
|
15 | RxBody = 0x00;
|
16 | RxCrc16 = 0;
|
17 | InitCRC();
|
18 | stRxData.TxAddress = NULL;
|
19 |
|
20 | }
|
21 |
|
22 |
|
23 | void Net_SendFrame(void)
|
24 | {
|
25 | int i, loop;
|
26 | i = 0;
|
27 | InitCRC();
|
28 | CalcCRC(stTxData.RxAddress);
|
29 | i++;
|
30 | CalcCRC(stTxData.InfoByte);
|
31 | i++;
|
32 | CalcCRC(stTxData.TxAddress);
|
33 | i++;
|
34 | CalcCRC((stTxData.DataLength += (INCLUDE_CRC(stTxData.InfoByte))));
|
35 | i++;
|
36 | for (loop = 0; loop < (stTxData.DataLength - (INCLUDE_CRC(stTxData.InfoByte))); loop++) // Framedaten
|
37 | {
|
38 | CalcCRC(stTxData.Data[loop]);
|
39 | i++;
|
40 | }
|
41 | CalcCRC(0);
|
42 | CalcCRC(0);
|
43 | stTxData.Data[loop++] = (crc16>>8) & 0xff;
|
44 | stTxData.Data[loop] = (crc16) & 0xff;
|
45 | NetTxCount = i+(INCLUDE_CRC(stTxData.InfoByte));
|
46 | NetTxCount_temp = NetTxCount;
|
47 | NetTxPtr = & stTxData.RxAddress;
|
48 | NetSetTxEnable(true);
|
49 | NET_UCSRB |= (1<< TXB80); // nur beim Master
|
50 | NET_UCSRB |= (1<<UDRIE0); // Tx Empty einschalten
|
51 |
|
52 | }
|
53 |
|
54 |
|
55 |
|
56 | void Net_SendChar(unsigned char ptr_RXAddress,unsigned char *val, unsigned int len)
|
57 | {
|
58 | int loop;
|
59 | stTxData.RxAddress = ptr_RXAddress;
|
60 | stTxData.TxAddress = NET_ADRESS;
|
61 | stTxData.InfoByte = CRC_BIT;
|
62 | stTxData.DataLength = len;
|
63 | for(loop = 0; loop < len; loop++){
|
64 | stTxData.Data[loop] = *val++;
|
65 | }
|
66 | Net_SendFrame();
|
67 | }
|
68 |
|
69 |
|
70 |
|
71 |
|
72 | ISR(USART_UDRE_vect) // TxBuffer ist leer und braucht nachschub
|
73 | {
|
74 |
|
75 | if (NetTxCount)
|
76 | {
|
77 | if(NetTxCount != NetTxCount_temp)NET_UCSRB &= ~(1<< TXB80);
|
78 | NET_UDR = *NetTxPtr;
|
79 | NetTxPtr++;
|
80 | NetTxCount--;
|
81 |
|
82 | }
|
83 | else
|
84 | NET_UCSRB &= ~(1<<UDRIE0); // Tx Empty abschalten
|
85 | }
|
86 |
|
87 |
|
88 |
|
89 |
|
90 | ISR(USART_TX_vect) // Leztes Byte wurde gesendet
|
91 | {
|
92 | NetSetTxEnable(false);
|
93 | NOP;
|
94 | NOP;
|
95 |
|
96 |
|
97 | }
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 | ISR(USART_RX_vect) {
|
104 | unsigned char ucRxByte;
|
105 |
|
106 | if (NET_UCSRA & ((1<< FE0) + (1<< DOR0))) // Fehler
|
107 | {
|
108 | ucRxByte = NET_UDR; // RxBuffer leeren
|
109 | NET_UCSRA |= (1<< MPCM0); // MPCM Mode einschalten
|
110 | DataOk = false;
|
111 | return;
|
112 | }
|
113 |
|
114 | if ((NET_UCSRB & (1<< RXB80)) ) // OK mit 9. bit
|
115 | {
|
116 |
|
117 | ucRxByte = NET_UDR;
|
118 | if (ucRxByte == NET_ADRESS) {
|
119 | NET_UCSRA &= ~(1<< MPCM0); // MPCM Mode ausschalten
|
120 | stRxData.RxAddress = ucRxByte;
|
121 | NET_UDR = ucRxByte;
|
122 | Net_NewFrameStart();
|
123 | CalcCRC(ucRxByte);
|
124 | RxHeader++;
|
125 | return;
|
126 | }
|
127 | else// Packet ist nicht für mich gedacht.
|
128 | {
|
129 | NET_UCSRA |= (1<< MPCM0);
|
130 | return;
|
131 | }
|
132 |
|
133 | }
|
134 | // ab hier geht es weiter mit 8 bit
|
135 | ucRxByte = NET_UDR;
|
136 |
|
137 | if (RxHeader == 1) // Info BYTE
|
138 | {
|
139 | stRxData.InfoByte = ucRxByte;
|
140 | RxHeader++;
|
141 | CalcCRC(ucRxByte);
|
142 | return;
|
143 | }
|
144 | if (RxHeader == 2) // Sender ADR
|
145 | {
|
146 | stRxData.TxAddress = ucRxByte;
|
147 | RxHeader++;
|
148 | CalcCRC(ucRxByte);
|
149 | return;
|
150 | }
|
151 | if (RxHeader != 0xFF) // DATA Länge
|
152 | {
|
153 |
|
154 | RxHeader = 0xFF;
|
155 | stRxData.DataLength = ucRxByte;
|
156 | CalcCRC(ucRxByte);
|
157 | return;
|
158 | }
|
159 |
|
160 | if (RxBody< (stRxData.DataLength - (INCLUDE_CRC(stRxData.InfoByte)))) // DATA
|
161 | {
|
162 |
|
163 | stRxData.Data[RxBody] = ucRxByte;
|
164 | CalcCRC(ucRxByte);
|
165 | RxBody += 1;
|
166 | if (!INCLUDE_CRC(stRxData.InfoByte) && (RxBody == stRxData.DataLength)) // Keine CRC nötig
|
167 | {
|
168 | NET_UCSRA |= (1<< MPCM0);
|
169 | DataOk = true;
|
170 | }
|
171 | return;
|
172 | }
|
173 | if (RxBody == (stRxData.DataLength - 2)) // CRC16 High
|
174 | {
|
175 | RxCrc16 = ucRxByte<<8;
|
176 | stRxData.Data[RxBody] = ucRxByte;
|
177 | RxBody++;
|
178 | return;
|
179 | }
|
180 | if (RxBody == (stRxData.DataLength - 1)) // CRC16 Low
|
181 | {
|
182 |
|
183 | RxCrc16 |= ucRxByte;
|
184 | stRxData.Data[RxBody] = ucRxByte;
|
185 | CalcCRC(0);
|
186 | CalcCRC(0);
|
187 | RxBody = RxHeader = 0;
|
188 | if (crc16 != RxCrc16) // fehler CRC
|
189 | {
|
190 | NET_UCSRA |= (1<< MPCM0);
|
191 | return;
|
192 | }
|
193 | else// alles OK
|
194 | {
|
195 | NET_UCSRA |= (1<< MPCM0);
|
196 | DataOk = true;
|
197 | return;
|
198 | }
|
199 | }
|
200 |
|
201 | if (RxBody==MAX_DATA_LENGTH)
|
202 | {
|
203 | NET_UCSRA |= (1<< MPCM0);
|
204 | return;
|
205 | }
|
206 |
|
207 | }
|