1 /*-----------------------------------------------------------------------------
3 * Purpose: USART test cases
4 *----------------------------------------------------------------------------
5 * Copyright(c) KEIL - An ARM Company
6 *----------------------------------------------------------------------------*/
9 #include "DV_Framework.h"
10 #include "Driver_USART.h"
16 #if (USART_DATA_BITS>8U)
17 typedef uint16_t buf_t;
19 typedef uint8_t buf_t;
22 // USART buffer pointers
23 static buf_t *buffer_out;
24 static buf_t *buffer_in;
27 #if (USART_DATA_BITS==5U)
28 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_5
29 #elif (USART_DATA_BITS==6U)
30 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_6
31 #elif (USART_DATA_BITS==7U)
32 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_7
33 #elif (USART_DATA_BITS==8U)
34 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_8
35 #elif (USART_DATA_BITS==9U)
36 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_9
40 static const uint32_t USART_BR[] = {
60 static const uint32_t USART_BR_NUM = ARRAY_SIZE(USART_BR);
62 // Register Driver_USART#
63 extern ARM_DRIVER_USART CREATE_SYMBOL(Driver_USART, DRV_USART);
64 static ARM_DRIVER_USART *drv = &CREATE_SYMBOL(Driver_USART, DRV_USART);
65 static ARM_USART_CAPABILITIES capab;
68 static uint8_t volatile Event;
71 static void USART_DrvEvent (uint32_t event) {
75 // USART asynchronous transfer
76 int8_t USART_RunTransfer (void *out, void *in, uint32_t cnt);
77 int8_t USART_RunTransfer (void *out, void *in, uint32_t cnt) {
80 Event &= ~ARM_USART_EVENT_RECEIVE_COMPLETE;
82 drv->Receive (in, cnt);
87 if (Event & ARM_USART_EVENT_RECEIVE_COMPLETE) {
91 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
93 drv->Control(ARM_USART_ABORT_TRANSFER, 0);
97 // USART send with callback
98 int8_t USART_RunSend (void *out, uint32_t cnt);
99 int8_t USART_RunSend (void *out, uint32_t cnt) {
102 Event &= ~ARM_USART_EVENT_SEND_COMPLETE;
104 drv->Send (out, cnt);
106 tick = GET_SYSTICK();
108 if (Event & ARM_USART_EVENT_SEND_COMPLETE) {
112 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
114 drv->Control(ARM_USART_ABORT_SEND, 0);
118 // USART send without callback
119 int8_t USART_RunSend_NoCallback (void *out, uint32_t cnt);
120 int8_t USART_RunSend_NoCallback (void *out, uint32_t cnt) {
123 drv->Send (out, cnt);
125 tick = GET_SYSTICK();
127 if (drv->GetTxCount() == cnt) {
131 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
133 drv->Control(ARM_USART_ABORT_SEND, 0);
137 // USART receive with callback
138 int8_t USART_RunReceive (void *in, uint32_t cnt);
139 int8_t USART_RunReceive (void *in, uint32_t cnt) {
142 Event &= ~ARM_USART_EVENT_RECEIVE_COMPLETE;
144 drv->Receive (in, cnt);
146 tick = GET_SYSTICK();
148 if (Event & ARM_USART_EVENT_RECEIVE_COMPLETE) {
152 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
154 drv->Control(ARM_USART_ABORT_RECEIVE, 0);
158 // USART receive without callback
159 int8_t USART_RunReceive_NoCallback (void *in, uint32_t cnt);
160 int8_t USART_RunReceive_NoCallback (void *in, uint32_t cnt) {
163 drv->Receive (in, cnt);
165 tick = GET_SYSTICK();
167 if (drv->GetRxCount() == cnt) {
171 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
173 drv->Control(ARM_USART_ABORT_RECEIVE, 0);
178 /*-----------------------------------------------------------------------------
180 *----------------------------------------------------------------------------*/
183 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
185 \defgroup usart_funcs USART Validation
186 \brief USART test cases
188 The USART validation test performs the following checks:
189 - API interface compliance.
190 - Data communication with various transfer sizes and communication parameters.
191 - Transfer speed of the data communication.
192 - Loopback communication.
194 \anchor usart_loop_back_setup
195 Loopback Communication Setup
196 ----------------------------
198 To perform loopback communication tests, it is required to connect the USART's \b TX signal to the \b RX signal (refer to the
199 schematics of your target hardware for detailed pinout information).
203 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
205 \brief Test case: USART_GetCapabilities
207 The test case \b USART_GetCapabilities verifies the function \b GetCapabilities.
209 void USART_GetCapabilities (void) {
210 /* Get USART capabilities */
211 capab = drv->GetCapabilities();
212 ASSERT_TRUE(&capab != NULL);
215 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
217 \brief Test case: USART_Initialization
219 The test case \b USART_Initialization verifies the USART functions with the sequence:
220 - \b Initialize without callback
222 - \b Initialize with callback
225 void USART_Initialization (void) {
227 /* Initialize without callback */
228 ASSERT_TRUE(drv->Initialize(NULL) == ARM_DRIVER_OK);
231 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
233 /* Initialize with callback */
234 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
237 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
240 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
242 \brief Test case: USART_CheckInvalidInit
244 The test case \b USART_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
246 - \b PowerControl with Power off
247 - \b PowerControl with Power on
249 - \b PowerControl with Power off
252 void USART_CheckInvalidInit (void) {
255 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
258 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
260 /* Try to power on */
261 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK);
263 /* Try to set configuration */
264 ASSERT_TRUE(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
265 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) != ARM_DRIVER_OK);
268 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
271 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
274 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
276 \brief Test case: USART_PowerControl
278 The test case \b USART_PowerControl verifies the \b PowerControl function with the sequence:
279 - Initialize with callback
285 void USART_PowerControl (void) {
288 /* Initialize with callback */
289 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
292 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
295 val = drv->PowerControl (ARM_POWER_LOW);
296 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { SET_RESULT(WARNING, "Low power is not supported"); }
297 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
300 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
303 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
306 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
308 \brief Test case: USART_Config_PolarityPhase
310 The test case \b USART_Config_PolarityPhase verifies the \b Control function with the sequence:
311 - Initialize with callback
313 - Set basic SPI bus configuration
316 - Change polarity and phase
320 void USART_Config_PolarityPhase (void) {
322 /* Initialize with callback and power on */
323 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
324 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
326 /* Set basic SPI bus configuration*/
327 ASSERT_TRUE(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL0 | ARM_USART_CPHA0, USART_BR[0]) == ARM_DRIVER_OK);
329 /* Change polarity */
330 ASSERT_TRUE(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL1 | ARM_USART_CPHA0, USART_BR[0]) == ARM_DRIVER_OK);
333 ASSERT_TRUE(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL0 | ARM_USART_CPHA1, USART_BR[0]) == ARM_DRIVER_OK);
335 /* Change polarity and phase */
336 ASSERT_TRUE(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL1 | ARM_USART_CPHA1, USART_BR[0]) == ARM_DRIVER_OK);
338 /* Power off and uninitialize */
339 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
340 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
343 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
345 \brief Test case: USART_Config_DataBits
347 The test case \b USART_Config_DataBits verifies the \b Control function with the sequence:
348 - Initialize with callback
350 - Data bits = \token{5}
351 - Data bits = \token{6}
352 - Data bits = \token{7}
353 - Data bits = \token{8}
354 - Data bits = \token{9}
358 void USART_Config_DataBits (void) {
361 /* Initialize with callback and power on */
362 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
363 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
365 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_5, USART_BR[0]);
366 if (val == ARM_USART_ERROR_DATA_BITS) { SET_RESULT(WARNING, "Data Bits = 5 are not supported"); }
367 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
369 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_6, USART_BR[0]);
370 if (val == ARM_USART_ERROR_DATA_BITS) { SET_RESULT(WARNING, "Data Bits = 6 are not supported"); }
371 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
373 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_7, USART_BR[0]);
374 if (val == ARM_USART_ERROR_DATA_BITS) { SET_RESULT(WARNING, "Data Bits = 7 are not supported"); }
375 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
377 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_8, USART_BR[0]);
378 if (val == ARM_USART_ERROR_DATA_BITS) { SET_RESULT(WARNING, "Data Bits = 8 are not supported"); }
379 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
381 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_9, USART_BR[0]);
382 if (val == ARM_USART_ERROR_DATA_BITS) { SET_RESULT(WARNING, "Data Bits = 9 are not supported"); }
383 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
385 /* Power off and uninitialize */
386 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
387 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
390 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
392 \brief Test case: USART_Config_StopBits
394 The test case \b USART_Config_StopBits verifies the \b Control function with the sequence:
395 - Initialize with callback
397 - Stop bits = \token{1}
398 - Stop bits = \token{2}
399 - Stop bits = \token{1.5}
400 - Stop bits = \token{0.5}
404 void USART_Config_StopBits (void) {
407 /* Initialize with callback and power on */
408 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
409 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
411 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_1, USART_BR[0]);
412 if (val == ARM_USART_ERROR_STOP_BITS) { SET_RESULT(WARNING, "Stop Bits = 1 are not supported"); }
413 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
415 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_2, USART_BR[0]);
416 if (val == ARM_USART_ERROR_STOP_BITS) { SET_RESULT(WARNING, "Stop Bits = 2 are not supported"); }
417 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
419 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_1_5, USART_BR[0]);
420 if (val == ARM_USART_ERROR_STOP_BITS) { SET_RESULT(WARNING, "Stop Bits = 1.5 are not supported"); }
421 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
423 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_0_5, USART_BR[0]);
424 if (val == ARM_USART_ERROR_STOP_BITS) { SET_RESULT(WARNING, "Stop Bits = 0.5 are not supported"); }
425 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
427 /* Power off and uninitialize */
428 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
429 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
432 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
434 \brief Test case: USART_Config_Parity
436 The test case \b USART_Config_Parity verifies the \b Control function with the sequence:
437 - Initialize with callback
439 - Sets parity bits: even parity
440 - Sets parity bits: no parity
441 - Sets parity bits: odd parity
445 void USART_Config_Parity (void) {
448 /* Initialize with callback and power on */
449 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
450 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
452 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_EVEN, USART_BR[0]);
453 if (val == ARM_USART_ERROR_PARITY) { SET_RESULT(WARNING, "Even parity is not supported"); }
454 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
456 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_NONE, USART_BR[0]);
457 if (val == ARM_USART_ERROR_PARITY) { SET_RESULT(WARNING, "No parity is not supported"); }
458 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
460 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_ODD, USART_BR[0]);
461 if (val == ARM_USART_ERROR_PARITY) { SET_RESULT(WARNING, "Odd parity not supported"); }
462 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
464 /* Power off and uninitialize */
465 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
466 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
469 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
471 \brief Test case: USART_Config_Baudrate
473 The test case \b USART_Config_Baudrate verifies the \b Control function and configures various baudrates with the sequence:
474 - Initialize with callback
480 \note This test needs to pass to be able to transfer data via the USART correctly. Usually, USART communication is set to a
481 certain baudrate with a defined tolerance. If the driver is not able to set the baudrate correctly, data exchange will not be
484 void USART_Config_Baudrate (void) {
487 /* Initialize with callback and power on */
488 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
489 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
491 /* Change baud rate*/
492 for (speed=0; speed<USART_BR_NUM; speed++) {
494 ASSERT_TRUE (drv->Control(ARM_USART_MODE_ASYNCHRONOUS, USART_BR[speed])
498 /* Power off and uninitialize */
499 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
500 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
503 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
505 \brief Test case: USART_Loopback_CheckBaudrate
507 The test case \b USART_Loopback_CheckBaudrate verifies the \b Control function, configures various baudrates, and measures
508 the transfer time with this sequence:
510 - Initialize with callback
512 - Change baud rate with specific control parameter
513 - Measure transfer time
517 \note If this test issues errors or warnings, refer to the \ref test_results section for more information.
519 void USART_Loopback_CheckBaudrate (void) {
522 uint32_t ticks_measured;
523 uint32_t ticks_expected;
527 /* Allocate buffer */
528 buffer_out = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
529 ASSERT_TRUE(buffer_out != NULL);
530 buffer_in = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
531 ASSERT_TRUE(buffer_in != NULL);
533 /* Initialize with callback, power on and configure USART bus */
534 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
535 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
536 ASSERT_TRUE(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
537 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
540 for (speed=0; speed<USART_BR_NUM; speed++) {
542 /* Set output buffer with random data*/
543 srand(GET_SYSTICK());
544 for (cnt = 0; cnt<BUFFER_SIZE_BR; cnt++) {
545 buffer_out[cnt] = (buf_t)rand()&((1U<<USART_DATA_BITS)-1U);
548 /* Change baud rate*/
549 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_TX,0) == ARM_DRIVER_OK);
550 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_RX,0) == ARM_DRIVER_OK);
551 ASSERT_TRUE(drv->Control(ARM_USART_MODE_ASYNCHRONOUS, USART_BR[speed])
553 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
554 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
556 /* Set Local Loopback */
557 USART_LOCAL_LOOPBACK();
559 /* Measure transfer time */
560 ticks_measured = GET_SYSTICK();
561 USART_RunTransfer(buffer_out, buffer_in, BUFFER_SIZE_BR);
562 ticks_measured = GET_SYSTICK() - ticks_measured;
563 ticks_expected = SYSTICK_MICROSEC(BUFFER_SIZE_BR*10000/(USART_BR[speed]/100));
564 ticks_expected *= USART_DATA_BITS+2;
566 rate = (double)ticks_measured/ticks_expected;
568 if ((rate>(1.0+(double)TOLERANCE_BR/100))||(rate<(1.0-(double)TOLERANCE_BR/100))) {
569 sprintf(str,"At %dbps: measured time is %f x expected time", USART_BR[speed], rate);
570 SET_RESULT(WARNING, str);
571 } else SET_RESULT(PASSED, NULL);
573 /* Check received data against sent data */
574 if (memcmp(buffer_in, buffer_out, BUFFER_SIZE_BR)!=0) {
575 sprintf(str,"At %dbps: fail to check block of %d bytes", USART_BR[speed], BUFFER_SIZE_BR);
576 SET_RESULT(FAILED, str);
577 } else SET_RESULT(PASSED, NULL);
580 /* Power off and uninitialize */
581 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
582 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
589 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
591 \brief Test case: USART_Config_CommonParams
593 The test case \b USART_Config_CommonParams verifies the \b Control function with the sequence:
594 - Initialize with callback
596 - Configure USART bus
602 void USART_Config_CommonParams (void) {
604 /* Initialize with callback and power on */
605 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
606 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
608 /* Configure USART bus*/
609 ASSERT_TRUE(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
610 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
611 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
612 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
614 /* Power off and uninitialize */
615 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
616 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
619 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
621 \brief Test case: USART_Send
623 The test case \b USART_Send verifies the \b Send function with the sequence:
624 - Initialize with callback
626 - Send data using callback
627 - Send data without callback
631 void USART_Send (void) {
635 /* Allocate buffer */
636 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
637 ASSERT_TRUE(buffer_out != NULL);
639 /* Initialize with callback, power on and configure USART bus */
640 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
641 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
642 ASSERT_TRUE(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
643 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
644 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
645 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
647 /* Send data chunks */
648 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
650 /* Send using callback */
651 if (USART_RunSend(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
652 sprintf(str,"Fail to send %d bytes",BUFFER[cnt]);
653 SET_RESULT(FAILED, str);
654 } else SET_RESULT(PASSED, NULL);
656 /* Send without callback */
657 if (USART_RunSend_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
658 sprintf(str,"Fail to send without callback %d bytes",BUFFER[cnt]);
659 SET_RESULT(FAILED, str);
660 } else SET_RESULT(PASSED, NULL);
663 /* Power off and uninitialize */
664 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
665 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
671 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
673 \brief Test case: USART_AsynchronousReceive
675 The test case \b USART_AsynchronousReceive verifies the \b Receive function with the sequence:
676 - Initialize with callback
678 - Send data using callback
679 - Send data without callback
683 void USART_AsynchronousReceive (void) {
687 /* Allocate buffer */
688 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
689 ASSERT_TRUE(buffer_out != NULL);
691 /* Initialize with callback, power on and configure USART bus */
692 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
693 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
694 ASSERT_TRUE(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
695 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
696 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
697 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
699 /* Send data chunks */
700 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
702 /* Send using callback */
703 if (USART_RunReceive(buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
704 sprintf(str,"Fail to receive %d bytes",BUFFER[cnt]);
705 SET_RESULT(FAILED, str);
706 } else SET_RESULT(PASSED, NULL);
708 /* Send without callback */
709 if (USART_RunReceive_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
710 sprintf(str,"Fail to send without callback %d bytes",BUFFER[cnt]);
711 SET_RESULT(FAILED, str);
712 } else SET_RESULT(PASSED, NULL);
715 /* Power off and uninitialize */
716 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
717 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
723 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
725 \brief Test case: USART_Loopback_Transfer
727 The test case \b USART_Loopback_Transfer verifies the \b Transfer function with the sequence:
728 - Initialize with callback
732 - Check received data against sent data
736 void USART_Loopback_Transfer (void) {
738 uint8_t pattern[] = BUFFER_PATTERN;
741 /* Allocate buffer */
742 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
743 ASSERT_TRUE(buffer_out != NULL);
744 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
745 ASSERT_TRUE(buffer_in != NULL);
747 /* Initialize with callback, power on and configure USART bus */
748 ASSERT_TRUE(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
749 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
750 ASSERT_TRUE(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
751 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
752 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
753 ASSERT_TRUE(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
755 /* Set Local Loopback */
756 USART_LOCAL_LOOPBACK();
758 /* Set output buffer pattern*/
759 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1];) {
760 for (i = 0; i<ARRAY_SIZE(pattern);) {
761 buffer_out[cnt] = pattern[i++];
762 if (USART_DATA_BITS>8U) buffer_out[cnt] |= pattern[i++]<<8U;
763 buffer_out[cnt++] &= (1U<<USART_DATA_BITS)-1U;
767 /* Transfer data chunks */
768 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
769 /* Clear input buffer*/
770 memset(buffer_in,0,BUFFER[cnt]);
771 if (USART_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
772 sprintf(str,"Fail to transfer block of %d bytes",BUFFER[cnt]);
773 SET_RESULT(FAILED, str);
774 } else SET_RESULT(PASSED, NULL);
775 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
776 sprintf(str,"Fail to check block of %d bytes",BUFFER[cnt]);
777 SET_RESULT(FAILED, str);
778 } else SET_RESULT(PASSED, NULL);
781 /* Set output buffer with random data*/
782 srand(GET_SYSTICK());
783 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1]; cnt++) {
784 buffer_out[cnt] = (buf_t)rand()&((1U<<USART_DATA_BITS)-1U);
787 /* Transfer data chunks */
788 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
789 /* Clear input buffer*/
790 memset(buffer_in,0,BUFFER[cnt]);
791 if (USART_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
792 sprintf(str,"Fail to transfer block of %d bytes",BUFFER[cnt]);
793 SET_RESULT(FAILED, str);
794 } else SET_RESULT(PASSED, NULL);
795 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
796 sprintf(str,"Fail to check block of %d bytes",BUFFER[cnt]);
797 SET_RESULT(FAILED, str);
798 } else SET_RESULT(PASSED, NULL);
801 /* Power off and uninitialize */
802 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
803 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
813 // end of group usart_funcs