service.c


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
}