Bar Logo 4kW dsPIC33C PSFB DC-DC DA (Part-No. )
 
Content
     
Loading...
Searching...
No Matches
app_PBV_UART.c
1/*
2 * @file app_PBV_UART.c
3 * @ingroup PBV_UART
4 * @brief Power Board Visualizer UART interface
5 */
6
7//includes
8#include <stdint.h>
9#include <stdbool.h>
10
11#include "app_PBV_UART.h"
12// MCC header files
13
16
17
23#define PBV_CRC_POLYNOM 0x8005
24
25
30#define PBV_CRC_POLYNOM_REV 0xA001
31
32
37#define PBV_ReadyToSend UART1_IsTxReady
38
39
44#define PBV_Write UART1_Write
45
46
51#define PBV_IsRxReady UART1_IsRxReady
52
53
58#define PBV_Read UART1_Read
59
60
65#define PBV_START_OF_FRAME 0x55
66
67
72#define PBV_END_OF_FRAME 0x0d
73
74
80#define RCV_WAIT_FOR_STARTBYTE 0
81#define RCV_READ_ID_HIGHBYTE 1
82#define RCV_READ_ID_LOWBYTE 2
83#define RCV_READ_LENGTH_HIGHBYTE 3
84#define RCV_READ_LENGTH_LOWBYTE 4
85#define RCV_READ_DATA 5
86#define RCV_READ_CRC_HIGHBYTE 6
87#define RCV_READ_CRC_LOWBYTE 7
88#define RCV_READ_EOF 8
89#define RCV_MESSAGE_RECEIVED 9
90
91
96#define PBV_RCV_DATABUFFER_SIZE 64 // MAX..
97
98
103#define PBV_HEADER_SIZE 5 // in bytes 0x55 + protocol ID (2 bytes) + length (2 bytes)?
104
105
109typedef struct UART_MSG_RX_OBJ
110{
113 uint16_t Protocol_ID;
114 uint16_t offset;
115 uint16_t CRC;
116 uint8_t PBV_Header[PBV_HEADER_SIZE];
117 uint8_t data[PBV_RCV_DATABUFFER_SIZE];
119
120
124typedef struct UART_MSG_TX_OBJ
125{
128 uint16_t Protocol_ID;
129 uint16_t offset;
130 uint16_t CRC;
131 uint8_t PBV_Header[PBV_HEADER_SIZE];
132 uint8_t * data;
134
135uint32_t PBV_calculated_CRC = 0;
136
137static bool uartActiveTx;
138static bool uartActiveTxAscii;
139
140// private function declaration
141uint16_t PBV_Calculate_CRC(uint8_t *message, uint16_t length);
142
143
148
149
154
155
160
161
171void PBV_UART_Init(PBV_Datatype_TX_t * Board_To_PBV, PBV_Datatype_TX_t * Board_To_PBVAscii, PBV_Datatype_RX_t * Pbv_To_Board)
172{
176 PBV_UART_Object_TX.data = Board_To_PBV->Data_Buffer;
177
179
182 PBV_UART_Object_ASCII.Length_in_Bytes = Board_To_PBVAscii->Length;
183 PBV_UART_Object_ASCII.data = Board_To_PBVAscii->Data_Buffer;
184
185 uartActiveTx = false;
186 uartActiveTxAscii = false;
187}
188
189
198{
199 static uint16_t rcv_data_index = 0;
200 static uint16_t rcv_CRC = 0;
201 static uint16_t rcv_timeout = 0;
202 static uint8_t rcv_copy_for_CRC[PBV_RCV_DATABUFFER_SIZE + PBV_HEADER_SIZE];
203 uint8_t data;
204
205 while (1)
206 {
207 if (PBV_IsRxReady() == false)
208 {
209 if (++rcv_timeout >= 10000)
210 {
211 rcv_timeout = 0;
212 PBV_UART_Object_RX.UART_Frame_State = RCV_WAIT_FOR_STARTBYTE;
213 }
215 }
216 // ok, we have some data coming in, lets read and process
217 rcv_timeout = 0;
218 data = PBV_Read();
220 {
221 case RCV_WAIT_FOR_STARTBYTE:
222 if (data == PBV_START_OF_FRAME)
223 {
224 PBV_UART_Object_RX.UART_Frame_State = RCV_READ_ID_HIGHBYTE;
227 rcv_copy_for_CRC[rcv_data_index] = data; // for CRC
228 rcv_data_index++; // for CRC
230 }
231 return PBV_STATE_RECEIVING;
232
233 case RCV_READ_ID_HIGHBYTE:
235 PBV_UART_Object_RX.UART_Frame_State = RCV_READ_ID_LOWBYTE;
237 rcv_copy_for_CRC[rcv_data_index] = data; // for CRC
238 rcv_data_index++; // for CRC
240 return PBV_STATE_RECEIVING;
241
242 case RCV_READ_ID_LOWBYTE:
244 PBV_UART_Object_RX.UART_Frame_State = RCV_READ_LENGTH_HIGHBYTE;
246 rcv_copy_for_CRC[rcv_data_index] = data; // for CRC
247 rcv_data_index++; // for CRC
249 return PBV_STATE_RECEIVING;
250
251 case RCV_READ_LENGTH_HIGHBYTE:
252 // clear CRC flag, for now, as the firmware doesn't support it
253 // With PBV version 2.0.0, dsPIC cannot receive
254 // messages from the GUI if this flag is not cleared
256 rcv_copy_for_CRC[rcv_data_index] = data; // for CRC
257 rcv_data_index++; // for CRC
258 data = data & 0x7F; // clear bit 7 (CRC flag)
260 PBV_UART_Object_RX.UART_Frame_State = RCV_READ_LENGTH_LOWBYTE;
262 return PBV_STATE_RECEIVING;
263
264 case RCV_READ_LENGTH_LOWBYTE:
267 rcv_copy_for_CRC[rcv_data_index] = data; // for CRC
268 rcv_data_index++; // for CRC
269 PBV_UART_Object_RX.UART_Frame_State = RCV_READ_DATA;
271 return PBV_STATE_RECEIVING;
272
273 case RCV_READ_DATA:
274 if (PBV_UART_Object_RX.offset < PBV_RCV_DATABUFFER_SIZE + PBV_HEADER_SIZE ) // MAX
275 {
278
279 rcv_copy_for_CRC[rcv_data_index] = data; // for CRC
280 rcv_data_index++; // for CRC
281 }
282 if (PBV_UART_Object_RX.offset >= PBV_UART_Object_RX.Length_in_Bytes) //are we finished receiving data???
283 {
284 PBV_UART_Object_RX.UART_Frame_State = RCV_READ_CRC_HIGHBYTE;
285 }
286 return PBV_STATE_RECEIVING;
287
288 case RCV_READ_CRC_HIGHBYTE:
289 rcv_CRC = data << 8;
290 PBV_UART_Object_RX.UART_Frame_State = RCV_READ_CRC_LOWBYTE;
291 return PBV_STATE_RECEIVING;
292
293 case RCV_READ_CRC_LOWBYTE:
294 rcv_CRC |= data;
296 return PBV_STATE_RECEIVING;
297
298 case RCV_READ_EOF:
299 if (data == 0x0d)
300 {
302 PBV_calculated_CRC = PBV_Calculate_CRC(rcv_copy_for_CRC, PBV_UART_Object_RX.Length_in_Bytes + PBV_HEADER_SIZE);
303 if (PBV_calculated_CRC == rcv_CRC)
304 {
305 rcv_data_index = 0;
306 rcv_CRC = 0;
307 PBV_calculated_CRC = 0;
308 PBV_UART_Object_RX.UART_Frame_State = RCV_MESSAGE_RECEIVED;
310 }
311 else {
312 rcv_data_index = 0; //for CRC
314 }
315 }
316 }
317 }
318}
319
320
328{
329 uint8_t temp;
330 if (uartActiveTx == true)
331 {
333 }
334
336 {
337 case 0:
338 PBV_UART_Object_ASCII.PBV_Header[0] = PBV_START_OF_FRAME;
345 uartActiveTxAscii = true;
346 //break;
348
349 case 1: //transfer header
350 while (PBV_ReadyToSend())// && (MsCounter_++ > 1)) //@ftx
351 {
356 {
359 return PBV_MESSAGE_TRANSMITTING; // Why is this here?
360 }
361 }
363 //break;
364
365 case 2: //transfer data
366 while (PBV_ReadyToSend())// && (MsCounter_++ > 1)) //@ftx
367 {
371 {
375 }
376 }
378 case 3: //calculate CRC make end header
379 //IMPORTANT calculate crc before reusing PBV_HEADER
381 PBV_UART_Object_ASCII.PBV_Header[1] = 0; //add crc
382 PBV_UART_Object_ASCII.PBV_Header[2] = PBV_END_OF_FRAME;
385
386 case 4: //transfer header
387 while (PBV_ReadyToSend())
388 {
392 {
395 uartActiveTxAscii = false;
397 }
398 }
400 }
401}
402
403
411{
412 uint16_t temp;
413 if (uartActiveTxAscii == true)
414 {
416 }
417
419 {
420 case 0:
421 PBV_UART_Object_TX.PBV_Header[0] = PBV_START_OF_FRAME;
428 uartActiveTx = true;
429 //break;
431
432 case 1: //transfer header
433 while (PBV_ReadyToSend())// && (MsCounter_++ > 1)) //@ftx
434 {
439 {
443 }
444 }
446 //break;
447
448 case 2: //transfer data
449 while (PBV_ReadyToSend())// && (MsCounter_++ > 1)) //@ftx
450 {
454 {
458 }
459 }
461 case 3: //calculate CRC make end header
462 //IMPORTANT calculate crc before reusing PBV_HEADER
464 PBV_UART_Object_TX.PBV_Header[1] = 0; //add crc
465 PBV_UART_Object_TX.PBV_Header[2] = PBV_END_OF_FRAME;
468
469 case 4: //transfer header
470 while (PBV_ReadyToSend())
471 {
474 if (PBV_UART_Object_TX.offset >= 3)
475 {
478 uartActiveTx = false;
480 }
481 }
483 }
484}
485
486
493void PBV_UART_Reinit(PBV_Datatype_TX_t * ptr)
494{
497 else
499}
500
501
510void PBV_UART_Link_Data_TX(PBV_Datatype_TX_t * ptr)
511{
513 {
516 }
517 else
518 {
521 }
522}
523
524
533void PBV_UART_Link_Data_RX(PBV_Datatype_RX_t * ptr)
534{
539 }
540}
541
542
555uint16_t PBV_Calculate_CRC(uint8_t *message, uint16_t length)
556{
557 //CRC_Initialize();
558 uint8_t message_odd = (uint8_t) (length & 0x01);
559 uint16_t length_t = 0;
560 uint16_t i, j;
561 //uint16_t * message16bit;
562 uint32_t trycount = 0;
563 uint16_t resultCRC = 0;
564 uint16_t message16bit[PBV_RCV_DATABUFFER_SIZE];
565
566 //calCRCTEMP = 0; //
567
568 if (message_odd)
569 length_t = (length & 0xFFFE);
570 else
571 length_t = length;
572
573 for (i = 0, j = 0; i < length_t; i += 2, j++)
574 {
575 //*(message16bit + j) = (message[i + 1 ] << 8 ) | message[i] ;
576 message16bit[j] = (message[i + 1 ] << 8) | message[i];
577 }
578
579 CRC_CalculateBufferStart(message16bit, length_t);
580
581 while (!CRC_CalculationIsDone() && trycount < 2000)
582 {
583 CRC_Tasks();
584 trycount++;
585 }
586
588
589 if (message_odd)
590 {
591 resultCRC ^= message[length - 1];
592 for (i = 0; i < 8; ++i)
593 {
594 if (resultCRC & 0x0001)
595 {
596 resultCRC = (resultCRC >> 1)^ PBV_CRC_POLYNOM_REV;
597 }
598 else
599 {
600 resultCRC = (resultCRC >> 1);
601 }
602 }
603 }
604 // clearing shift registers.
605 CRCWDATL = 0x0;
606 CRCWDATH = 0x0;
607
608 return resultCRC;
609}
This is the generated driver header file for the CRC driver.
This is the generated driver header file for the UART1 driver.
float temp
Definition pwrctrl_sm.c:27
struct UART_MSG_TX_OBJ UART_MSG_TX_OBJ_t
UART msg Transmit object.
UART_MSG_TX_OBJ_t PBV_UART_Object_TX
UART object for numeric tx.
struct UART_MSG_RX_OBJ UART_MSG_RX_OBJ_t
UART msg receive object.
#define PBV_ReadyToSend
linking functions with UART mcc driver functions
uint8_t PBV_UART_Transmit_to_GUI()
void PBV_UART_Init(PBV_Datatype_TX_t *Board_To_PBV, PBV_Datatype_TX_t *Board_To_PBVAscii, PBV_Datatype_RX_t *Pbv_To_Board)
uint8_t PBV_UART_Transmit_Ascii_to_GUI()
uint8_t PBV_UART_Receive_from_GUI()
implements the state machine for UART Frame receiving from PBV.
UART_MSG_TX_OBJ_t PBV_UART_Object_ASCII
UART object for ascii tx.
#define PBV_CRC_POLYNOM_REV
Reversed polynomial. needed for odd byte in the data stream.
UART_MSG_RX_OBJ_t PBV_UART_Object_RX
UART object for numeric rx.
#define PBV_Read
linking functions with UART mcc driver functions
#define PBV_Write
linking functions with UART mcc driver functions
#define PBV_IsRxReady
linking functions with UART mcc driver functions
@ PBV_MESSAGE_READY_TO_RECEIVE
Message Reception triggered.
@ PBV_STATE_RECEIVING
Message beinf received.
@ PBV_MESSAGE_RECEIVED
Message Received.
@ PBV_MESSAGE_RX_ERROR
if some error happens (CRC ?)
@ PBV_SIGNAL_MODE
Object will transmit/receive signals.
@ PBV_MESSAGE_TRANSMITTED
Message transmitted. successful transmit.
@ PBV_MESSAGE_TX_ERROR
if some error happens. unsuccessful transmit
@ PBV_MESSAGE_TRANSMITTING
Transmitting Message.
void CRC_CalculateBufferStart(void *buffer, uint32_t sizeBytes)
CRC module calculation on a buffer in data space.
Definition crc.c:373
void CRC_Tasks(void)
This function cycles through the CRC calculations. This function will load the CRC module FIFO with...
Definition crc.c:487
uint32_t CRC_CalculationResultReverseGet(void)
Gets the CRC reversed value of result if the calculation is done.
Definition crc.c:447
bool CRC_CalculationIsDone(void)
Returns the CRC calculation complete status
Definition crc.c:420
uint32_t PBV_Protcol_ID
Protocol ID.
uint8_t * Data_Buffer
Pointer to the data to be transmitted.
enum PBV_SIGNAL_ASCII_MODE PBV_Signal_Ascii
Object will transmit Signals or ASCII.
uint16_t Length
Length of transmitted message in Bytes.
uint32_t PBV_Protcol_ID
Protocol ID of the received message.
PBV_MESSAGE_RX_STATE_t PBV_Message_State
State of the received message.
uint8_t * Data_Buffer
Received Data pointer.
uint16_t Length
Length of received message in Bytes.
UART msg receive object.
uint8_t Length_in_Bytes
UART bytes Received
uint8_t PBV_Header[PBV_HEADER_SIZE]
recived Header. 5bytes ( SOF + ID + Length)
uint8_t UART_Frame_State
UART Receive Frame states.
uint16_t Protocol_ID
Received Frame ID.
uint16_t offset
Offset needed to store data in data
uint8_t data[PBV_RCV_DATABUFFER_SIZE]
data buffer. linked by the calling application. STATIC(64) bytes for now.
uint16_t CRC
received CRC
UART msg Transmit object.
uint8_t Length_in_Bytes
UART Bytes to be Transmitted.
uint8_t PBV_Header[PBV_HEADER_SIZE]
sent Header. 5bytes ( SOF + ID + Length)
uint8_t UART_Frame_State
UART Transmit Frame states.
uint8_t * data
data buffer. linked by the calling application. STATIC(64) bytes for now.
uint16_t Protocol_ID
Frame ID to be appended.
uint16_t offset
Offset needed for data transmission.
uint16_t CRC
calculated CRC