1 /*-----------------------------------------------------------------------------
3 * Purpose: USART test cases
4 *----------------------------------------------------------------------------
5 * Copyright(c) KEIL - An ARM Company
6 *----------------------------------------------------------------------------*/
10 #include "DV_Framework.h"
11 #include "Driver_USART.h"
17 #if (USART_DATA_BITS>8U)
18 typedef uint16_t buf_t;
20 typedef uint8_t buf_t;
23 // USART buffer pointers
24 static buf_t *buffer_out;
25 static buf_t *buffer_in;
28 #if (USART_DATA_BITS==5U)
29 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_5
30 #elif (USART_DATA_BITS==6U)
31 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_6
32 #elif (USART_DATA_BITS==7U)
33 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_7
34 #elif (USART_DATA_BITS==8U)
35 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_8
36 #elif (USART_DATA_BITS==9U)
37 #define USART_DATA_BITS_CTRL_CODE ARM_USART_DATA_BITS_9
41 static const uint32_t USART_BR[] = {
61 static const uint32_t USART_BR_NUM = ARRAY_SIZE(USART_BR);
63 // Register Driver_USART#
64 extern ARM_DRIVER_USART CREATE_SYMBOL(Driver_USART, DRV_USART);
65 static ARM_DRIVER_USART *drv = &CREATE_SYMBOL(Driver_USART, DRV_USART);
66 static ARM_USART_CAPABILITIES capab;
71 static uint8_t volatile Event;
74 static void USART_DrvEvent (uint32_t event) {
78 // USART asynchronous transfer
79 int8_t USART_RunTransfer (void *out, void *in, uint32_t cnt);
80 int8_t USART_RunTransfer (void *out, void *in, uint32_t cnt) {
83 Event &= ~ARM_USART_EVENT_RECEIVE_COMPLETE;
85 drv->Receive (in, cnt);
90 if (Event & ARM_USART_EVENT_RECEIVE_COMPLETE) {
94 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
96 drv->Control(ARM_USART_ABORT_TRANSFER, 0);
100 // USART send with callback
101 int8_t USART_RunSend (void *out, uint32_t cnt);
102 int8_t USART_RunSend (void *out, uint32_t cnt) {
105 Event &= ~ARM_USART_EVENT_SEND_COMPLETE;
107 drv->Send (out, cnt);
109 tick = GET_SYSTICK();
111 if (Event & ARM_USART_EVENT_SEND_COMPLETE) {
115 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
117 drv->Control(ARM_USART_ABORT_SEND, 0);
121 // USART send without callback
122 int8_t USART_RunSend_NoCallback (void *out, uint32_t cnt);
123 int8_t USART_RunSend_NoCallback (void *out, uint32_t cnt) {
126 drv->Send (out, cnt);
128 tick = GET_SYSTICK();
130 if (drv->GetTxCount() == cnt) {
134 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
136 drv->Control(ARM_USART_ABORT_SEND, 0);
140 // USART receive with callback
141 int8_t USART_RunReceive (void *in, uint32_t cnt);
142 int8_t USART_RunReceive (void *in, uint32_t cnt) {
145 Event &= ~ARM_USART_EVENT_RECEIVE_COMPLETE;
147 drv->Receive (in, cnt);
149 tick = GET_SYSTICK();
151 if (Event & ARM_USART_EVENT_RECEIVE_COMPLETE) {
155 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
157 drv->Control(ARM_USART_ABORT_RECEIVE, 0);
161 // USART receive without callback
162 int8_t USART_RunReceive_NoCallback (void *in, uint32_t cnt);
163 int8_t USART_RunReceive_NoCallback (void *in, uint32_t cnt) {
166 drv->Receive (in, cnt);
168 tick = GET_SYSTICK();
170 if (drv->GetRxCount() == cnt) {
174 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
176 drv->Control(ARM_USART_ABORT_RECEIVE, 0);
181 /*-----------------------------------------------------------------------------
183 *----------------------------------------------------------------------------*/
186 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
188 \defgroup usart_funcs USART Validation
189 \brief USART test cases
191 The USART validation test performs the following checks:
192 - API interface compliance.
193 - Data communication with various transfer sizes and communication parameters.
194 - Transfer speed of the data communication.
195 - Loopback communication.
197 \anchor usart_loop_back_setup
198 Loopback Communication Setup
199 ----------------------------
201 To perform loopback communication tests, it is required to connect the USART's \b TX signal to the \b RX signal (refer to the
202 schematics of your target hardware for detailed pinout information).
206 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
208 \brief Test case: USART_GetCapabilities
210 The test case \b USART_GetCapabilities verifies the function \b GetCapabilities.
212 void USART_GetCapabilities (void) {
213 /* Get USART capabilities */
214 capab = drv->GetCapabilities();
215 TEST_ASSERT(&capab != NULL);
218 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
220 \brief Test case: USART_Initialization
222 The test case \b USART_Initialization verifies the USART functions with the sequence:
223 - \b Initialize without callback
225 - \b Initialize with callback
228 void USART_Initialization (void) {
230 /* Initialize without callback */
231 TEST_ASSERT(drv->Initialize(NULL) == ARM_DRIVER_OK);
234 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
236 /* Initialize with callback */
237 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
240 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
243 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
245 \brief Test case: USART_CheckInvalidInit
247 The test case \b USART_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
249 - \b PowerControl with Power off
250 - \b PowerControl with Power on
252 - \b PowerControl with Power off
255 void USART_CheckInvalidInit (void) {
258 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
261 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
263 /* Try to power on */
264 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK);
266 /* Try to set configuration */
267 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
268 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) != ARM_DRIVER_OK);
271 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
274 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
277 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
279 \brief Test case: USART_PowerControl
281 The test case \b USART_PowerControl verifies the \b PowerControl function with the sequence:
282 - Initialize with callback
288 void USART_PowerControl (void) {
291 /* Initialize with callback */
292 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
295 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
298 val = drv->PowerControl (ARM_POWER_LOW);
299 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Low power is not supported"); }
300 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
303 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
306 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
309 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
311 \brief Test case: USART_Config_PolarityPhase
313 The test case \b USART_Config_PolarityPhase verifies the \b Control function with the sequence:
314 - Initialize with callback
316 - Set basic SPI bus configuration
319 - Change polarity and phase
323 void USART_Config_PolarityPhase (void) {
325 /* Initialize with callback and power on */
326 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
327 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
329 /* Set basic SPI bus configuration*/
330 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL0 | ARM_USART_CPHA0, USART_BR[0]) == ARM_DRIVER_OK);
332 /* Change polarity */
333 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL1 | ARM_USART_CPHA0, USART_BR[0]) == ARM_DRIVER_OK);
336 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL0 | ARM_USART_CPHA1, USART_BR[0]) == ARM_DRIVER_OK);
338 /* Change polarity and phase */
339 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL1 | ARM_USART_CPHA1, USART_BR[0]) == ARM_DRIVER_OK);
341 /* Power off and uninitialize */
342 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
343 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
346 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
348 \brief Test case: USART_Config_DataBits
350 The test case \b USART_Config_DataBits verifies the \b Control function with the sequence:
351 - Initialize with callback
353 - Data bits = \token{5}
354 - Data bits = \token{6}
355 - Data bits = \token{7}
356 - Data bits = \token{8}
357 - Data bits = \token{9}
361 void USART_Config_DataBits (void) {
364 /* Initialize with callback and power on */
365 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
366 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
368 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_5, USART_BR[0]);
369 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 5 are not supported"); }
370 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
372 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_6, USART_BR[0]);
373 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 6 are not supported"); }
374 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
376 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_7, USART_BR[0]);
377 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 7 are not supported"); }
378 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
380 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_8, USART_BR[0]);
381 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 8 are not supported"); }
382 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
384 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_9, USART_BR[0]);
385 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 9 are not supported"); }
386 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
388 /* Power off and uninitialize */
389 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
390 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
393 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
395 \brief Test case: USART_Config_StopBits
397 The test case \b USART_Config_StopBits verifies the \b Control function with the sequence:
398 - Initialize with callback
400 - Stop bits = \token{1}
401 - Stop bits = \token{2}
402 - Stop bits = \token{1.5}
403 - Stop bits = \token{0.5}
407 void USART_Config_StopBits (void) {
410 /* Initialize with callback and power on */
411 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
412 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
414 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_1, USART_BR[0]);
415 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 1 are not supported"); }
416 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
418 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_2, USART_BR[0]);
419 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 2 are not supported"); }
420 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
422 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_1_5, USART_BR[0]);
423 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 1.5 are not supported"); }
424 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
426 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_0_5, USART_BR[0]);
427 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 0.5 are not supported"); }
428 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
430 /* Power off and uninitialize */
431 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
432 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
435 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
437 \brief Test case: USART_Config_Parity
439 The test case \b USART_Config_Parity verifies the \b Control function with the sequence:
440 - Initialize with callback
442 - Sets parity bits: even parity
443 - Sets parity bits: no parity
444 - Sets parity bits: odd parity
448 void USART_Config_Parity (void) {
451 /* Initialize with callback and power on */
452 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
453 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
455 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_EVEN, USART_BR[0]);
456 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] Even parity is not supported"); }
457 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
459 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_NONE, USART_BR[0]);
460 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] No parity is not supported"); }
461 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
463 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_ODD, USART_BR[0]);
464 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] Odd parity not supported"); }
465 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
467 /* Power off and uninitialize */
468 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
469 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
472 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
474 \brief Test case: USART_Config_Baudrate
476 The test case \b USART_Config_Baudrate verifies the \b Control function and configures various baudrates with the sequence:
477 - Initialize with callback
483 \note This test needs to pass to be able to transfer data via the USART correctly. Usually, USART communication is set to a
484 certain baudrate with a defined tolerance. If the driver is not able to set the baudrate correctly, data exchange will not be
487 void USART_Config_Baudrate (void) {
490 /* Initialize with callback and power on */
491 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
492 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
494 /* Change baud rate*/
495 for (speed=0; speed<USART_BR_NUM; speed++) {
497 TEST_ASSERT (drv->Control(ARM_USART_MODE_ASYNCHRONOUS, USART_BR[speed])
501 /* Power off and uninitialize */
502 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
503 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
506 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
508 \brief Test case: USART_Loopback_CheckBaudrate
510 The test case \b USART_Loopback_CheckBaudrate verifies the \b Control function, configures various baudrates, and measures
511 the transfer time with this sequence:
513 - Initialize with callback
515 - Change baud rate with specific control parameter
516 - Measure transfer time
520 \note If this test issues errors or warnings, refer to the \ref test_results section for more information.
522 void USART_Loopback_CheckBaudrate (void) {
525 uint32_t ticks_measured;
526 uint32_t ticks_expected;
529 /* Allocate buffer */
530 buffer_out = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
531 TEST_ASSERT(buffer_out != NULL);
532 buffer_in = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
533 TEST_ASSERT(buffer_in != NULL);
535 /* Initialize with callback, power on and configure USART bus */
536 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
537 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
538 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
539 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
542 for (speed=0; speed<USART_BR_NUM; speed++) {
544 /* Set output buffer with random data*/
545 srand(GET_SYSTICK());
546 for (cnt = 0; cnt<BUFFER_SIZE_BR; cnt++) {
547 buffer_out[cnt] = (buf_t)rand()&((1U<<USART_DATA_BITS)-1U);
550 /* Change baud rate*/
551 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,0) == ARM_DRIVER_OK);
552 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,0) == ARM_DRIVER_OK);
553 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS, USART_BR[speed])
555 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
556 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
558 /* Set Local Loopback */
559 USART_LOCAL_LOOPBACK();
561 /* Measure transfer time */
562 ticks_measured = GET_SYSTICK();
563 USART_RunTransfer(buffer_out, buffer_in, BUFFER_SIZE_BR);
564 ticks_measured = GET_SYSTICK() - ticks_measured;
565 ticks_expected = SYSTICK_MICROSEC(BUFFER_SIZE_BR*10000/(USART_BR[speed]/100));
566 ticks_expected *= USART_DATA_BITS+2;
568 rate = (double)ticks_measured/ticks_expected;
570 if ((rate>(1.0+(double)TOLERANCE_BR/100))||(rate<(1.0-(double)TOLERANCE_BR/100))) {
571 snprintf(str,sizeof(str),"[WARNING] At %dbps: measured time is %f x expected time", USART_BR[speed], rate);
575 /* Check received data against sent data */
576 if (memcmp(buffer_in, buffer_out, BUFFER_SIZE_BR)!=0) {
577 snprintf(str,sizeof(str),"[FAILED] At %dbps: fail to check block of %d bytes", USART_BR[speed], BUFFER_SIZE_BR);
578 TEST_FAIL_MESSAGE(str);
582 /* Power off and uninitialize */
583 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
584 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
591 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
593 \brief Test case: USART_Config_CommonParams
595 The test case \b USART_Config_CommonParams verifies the \b Control function with the sequence:
596 - Initialize with callback
598 - Configure USART bus
604 void USART_Config_CommonParams (void) {
606 /* Initialize with callback and power on */
607 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
608 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
610 /* Configure USART bus*/
611 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
612 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
613 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
614 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
616 /* Power off and uninitialize */
617 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
618 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
621 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
623 \brief Test case: USART_Send
625 The test case \b USART_Send verifies the \b Send function with the sequence:
626 - Initialize with callback
628 - Send data using callback
629 - Send data without callback
633 void USART_Send (void) {
636 /* Allocate buffer */
637 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
638 TEST_ASSERT(buffer_out != NULL);
640 /* Initialize with callback, power on and configure USART bus */
641 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
642 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
643 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
644 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
645 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
646 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
648 /* Send data chunks */
649 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
651 /* Send using callback */
652 if (USART_RunSend(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
653 snprintf(str,sizeof(str),"[FAILED] Fail to send %d bytes",BUFFER[cnt]);
654 TEST_FAIL_MESSAGE(str);
657 /* Send without callback */
658 if (USART_RunSend_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
659 snprintf(str,sizeof(str),"[FAILED] Fail to send without callback %d bytes",BUFFER[cnt]);
660 TEST_FAIL_MESSAGE(str);
664 /* Power off and uninitialize */
665 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
666 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
672 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
674 \brief Test case: USART_AsynchronousReceive
676 The test case \b USART_AsynchronousReceive verifies the \b Receive function with the sequence:
677 - Initialize with callback
679 - Send data using callback
680 - Send data without callback
684 void USART_AsynchronousReceive (void) {
687 /* Allocate buffer */
688 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
689 TEST_ASSERT(buffer_out != NULL);
691 /* Initialize with callback, power on and configure USART bus */
692 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
693 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
694 TEST_ASSERT(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 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
697 TEST_ASSERT(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 snprintf(str,sizeof(str),"[FAILED] Fail to receive %d bytes",BUFFER[cnt]);
705 TEST_FAIL_MESSAGE(str);
708 /* Send without callback */
709 if (USART_RunReceive_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
710 snprintf(str,sizeof(str),"[FAILED] Fail to send without callback %d bytes",BUFFER[cnt]);
711 TEST_FAIL_MESSAGE(str);
715 /* Power off and uninitialize */
716 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
717 TEST_ASSERT(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;
740 /* Allocate buffer */
741 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
742 TEST_ASSERT(buffer_out != NULL);
743 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
744 TEST_ASSERT(buffer_in != NULL);
746 /* Initialize with callback, power on and configure USART bus */
747 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
748 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
749 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
750 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
751 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
752 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
754 /* Set Local Loopback */
755 USART_LOCAL_LOOPBACK();
757 /* Set output buffer pattern*/
758 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1];) {
759 for (i = 0; i<ARRAY_SIZE(pattern);) {
760 buffer_out[cnt] = pattern[i++];
761 if (USART_DATA_BITS>8U) buffer_out[cnt] |= pattern[i++]<<8U;
762 buffer_out[cnt++] &= (1U<<USART_DATA_BITS)-1U;
766 /* Transfer data chunks */
767 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
768 /* Clear input buffer*/
769 memset(buffer_in,0,BUFFER[cnt]);
770 if (USART_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
771 snprintf(str,sizeof(str),"[FAILED] Fail to transfer block of %d bytes",BUFFER[cnt]);
772 TEST_FAIL_MESSAGE(str);
774 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
775 snprintf(str,sizeof(str),"[FAILED] Fail to check block of %d bytes",BUFFER[cnt]);
776 TEST_FAIL_MESSAGE(str);
780 /* Set output buffer with random data*/
781 srand(GET_SYSTICK());
782 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1]; cnt++) {
783 buffer_out[cnt] = (buf_t)rand()&((1U<<USART_DATA_BITS)-1U);
786 /* Transfer data chunks */
787 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
788 /* Clear input buffer*/
789 memset(buffer_in,0,BUFFER[cnt]);
790 if (USART_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
791 snprintf(str,sizeof(str),"[FAILED] Fail to transfer block of %d bytes",BUFFER[cnt]);
792 TEST_FAIL_MESSAGE(str);
794 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
795 snprintf(str,sizeof(str),"[FAILED] Fail to check block of %d bytes",BUFFER[cnt]);
796 TEST_FAIL_MESSAGE(str);
800 /* Power off and uninitialize */
801 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
802 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
812 // end of group usart_funcs