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;
70 static uint8_t volatile Event;
73 static void USART_DrvEvent (uint32_t event) {
77 // USART asynchronous transfer
78 int8_t USART_RunTransfer (void *out, void *in, uint32_t cnt);
79 int8_t USART_RunTransfer (void *out, void *in, uint32_t cnt) {
82 Event &= ~ARM_USART_EVENT_RECEIVE_COMPLETE;
84 drv->Receive (in, cnt);
89 if (Event & ARM_USART_EVENT_RECEIVE_COMPLETE) {
93 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
95 drv->Control(ARM_USART_ABORT_TRANSFER, 0);
99 // USART send with callback
100 int8_t USART_RunSend (void *out, uint32_t cnt);
101 int8_t USART_RunSend (void *out, uint32_t cnt) {
104 Event &= ~ARM_USART_EVENT_SEND_COMPLETE;
106 drv->Send (out, cnt);
108 tick = GET_SYSTICK();
110 if (Event & ARM_USART_EVENT_SEND_COMPLETE) {
114 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
116 drv->Control(ARM_USART_ABORT_SEND, 0);
120 // USART send without callback
121 int8_t USART_RunSend_NoCallback (void *out, uint32_t cnt);
122 int8_t USART_RunSend_NoCallback (void *out, uint32_t cnt) {
125 drv->Send (out, cnt);
127 tick = GET_SYSTICK();
129 if (drv->GetTxCount() == cnt) {
133 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
135 drv->Control(ARM_USART_ABORT_SEND, 0);
139 // USART receive with callback
140 int8_t USART_RunReceive (void *in, uint32_t cnt);
141 int8_t USART_RunReceive (void *in, uint32_t cnt) {
144 Event &= ~ARM_USART_EVENT_RECEIVE_COMPLETE;
146 drv->Receive (in, cnt);
148 tick = GET_SYSTICK();
150 if (Event & ARM_USART_EVENT_RECEIVE_COMPLETE) {
154 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
156 drv->Control(ARM_USART_ABORT_RECEIVE, 0);
160 // USART receive without callback
161 int8_t USART_RunReceive_NoCallback (void *in, uint32_t cnt);
162 int8_t USART_RunReceive_NoCallback (void *in, uint32_t cnt) {
165 drv->Receive (in, cnt);
167 tick = GET_SYSTICK();
169 if (drv->GetRxCount() == cnt) {
173 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
175 drv->Control(ARM_USART_ABORT_RECEIVE, 0);
180 /*-----------------------------------------------------------------------------
182 *----------------------------------------------------------------------------*/
185 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
187 \defgroup usart_funcs USART Validation
188 \brief USART test cases
190 The USART validation test performs the following checks:
191 - API interface compliance.
192 - Data communication with various transfer sizes and communication parameters.
193 - Transfer speed of the data communication.
194 - Loopback communication.
196 \anchor usart_loop_back_setup
197 Loopback Communication Setup
198 ----------------------------
200 To perform loopback communication tests, it is required to connect the USART's \b TX signal to the \b RX signal (refer to the
201 schematics of your target hardware for detailed pinout information).
205 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
207 \brief Test case: USART_GetCapabilities
209 The test case \b USART_GetCapabilities verifies the function \b GetCapabilities.
211 void USART_GetCapabilities (void) {
212 /* Get USART capabilities */
213 capab = drv->GetCapabilities();
214 TEST_ASSERT(&capab != NULL);
217 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
219 \brief Test case: USART_Initialization
221 The test case \b USART_Initialization verifies the USART functions with the sequence:
222 - \b Initialize without callback
224 - \b Initialize with callback
227 void USART_Initialization (void) {
229 /* Initialize without callback */
230 TEST_ASSERT(drv->Initialize(NULL) == ARM_DRIVER_OK);
233 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
235 /* Initialize with callback */
236 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
239 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
242 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
244 \brief Test case: USART_CheckInvalidInit
246 The test case \b USART_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
248 - \b PowerControl with Power off
249 - \b PowerControl with Power on
251 - \b PowerControl with Power off
254 void USART_CheckInvalidInit (void) {
257 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
260 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
262 /* Try to power on */
263 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK);
265 /* Try to set configuration */
266 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
267 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) != ARM_DRIVER_OK);
270 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
273 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
276 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
278 \brief Test case: USART_PowerControl
280 The test case \b USART_PowerControl verifies the \b PowerControl function with the sequence:
281 - Initialize with callback
287 void USART_PowerControl (void) {
290 /* Initialize with callback */
291 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
294 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
297 val = drv->PowerControl (ARM_POWER_LOW);
298 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Low power is not supported"); }
299 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
302 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
305 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
308 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
310 \brief Test case: USART_Config_PolarityPhase
312 The test case \b USART_Config_PolarityPhase verifies the \b Control function with the sequence:
313 - Initialize with callback
315 - Set basic SPI bus configuration
318 - Change polarity and phase
322 void USART_Config_PolarityPhase (void) {
324 /* Initialize with callback and power on */
325 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
326 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
328 /* Set basic SPI bus configuration*/
329 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL0 | ARM_USART_CPHA0, USART_BR[0]) == ARM_DRIVER_OK);
331 /* Change polarity */
332 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL1 | ARM_USART_CPHA0, USART_BR[0]) == ARM_DRIVER_OK);
335 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL0 | ARM_USART_CPHA1, USART_BR[0]) == ARM_DRIVER_OK);
337 /* Change polarity and phase */
338 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL1 | ARM_USART_CPHA1, USART_BR[0]) == ARM_DRIVER_OK);
340 /* Power off and uninitialize */
341 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
342 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
345 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
347 \brief Test case: USART_Config_DataBits
349 The test case \b USART_Config_DataBits verifies the \b Control function with the sequence:
350 - Initialize with callback
352 - Data bits = \token{5}
353 - Data bits = \token{6}
354 - Data bits = \token{7}
355 - Data bits = \token{8}
356 - Data bits = \token{9}
360 void USART_Config_DataBits (void) {
363 /* Initialize with callback and power on */
364 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
365 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
367 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_5, USART_BR[0]);
368 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 5 are not supported"); }
369 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
371 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_6, USART_BR[0]);
372 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 6 are not supported"); }
373 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
375 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_7, USART_BR[0]);
376 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 7 are not supported"); }
377 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
379 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_8, USART_BR[0]);
380 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 8 are not supported"); }
381 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
383 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_9, USART_BR[0]);
384 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 9 are not supported"); }
385 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
387 /* Power off and uninitialize */
388 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
389 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
392 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
394 \brief Test case: USART_Config_StopBits
396 The test case \b USART_Config_StopBits verifies the \b Control function with the sequence:
397 - Initialize with callback
399 - Stop bits = \token{1}
400 - Stop bits = \token{2}
401 - Stop bits = \token{1.5}
402 - Stop bits = \token{0.5}
406 void USART_Config_StopBits (void) {
409 /* Initialize with callback and power on */
410 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
411 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
413 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_1, USART_BR[0]);
414 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 1 are not supported"); }
415 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
417 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_2, USART_BR[0]);
418 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 2 are not supported"); }
419 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
421 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_1_5, USART_BR[0]);
422 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 1.5 are not supported"); }
423 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
425 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_0_5, USART_BR[0]);
426 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 0.5 are not supported"); }
427 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
429 /* Power off and uninitialize */
430 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
431 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
434 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
436 \brief Test case: USART_Config_Parity
438 The test case \b USART_Config_Parity verifies the \b Control function with the sequence:
439 - Initialize with callback
441 - Sets parity bits: even parity
442 - Sets parity bits: no parity
443 - Sets parity bits: odd parity
447 void USART_Config_Parity (void) {
450 /* Initialize with callback and power on */
451 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
452 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
454 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_EVEN, USART_BR[0]);
455 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] Even parity is not supported"); }
456 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
458 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_NONE, USART_BR[0]);
459 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] No parity is not supported"); }
460 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
462 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_ODD, USART_BR[0]);
463 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] Odd parity not supported"); }
464 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
466 /* Power off and uninitialize */
467 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
468 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
471 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
473 \brief Test case: USART_Config_Baudrate
475 The test case \b USART_Config_Baudrate verifies the \b Control function and configures various baudrates with the sequence:
476 - Initialize with callback
482 \note This test needs to pass to be able to transfer data via the USART correctly. Usually, USART communication is set to a
483 certain baudrate with a defined tolerance. If the driver is not able to set the baudrate correctly, data exchange will not be
486 void USART_Config_Baudrate (void) {
489 /* Initialize with callback and power on */
490 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
491 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
493 /* Change baud rate*/
494 for (speed=0; speed<USART_BR_NUM; speed++) {
496 TEST_ASSERT (drv->Control(ARM_USART_MODE_ASYNCHRONOUS, USART_BR[speed])
500 /* Power off and uninitialize */
501 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
502 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
505 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
507 \brief Test case: USART_Loopback_CheckBaudrate
509 The test case \b USART_Loopback_CheckBaudrate verifies the \b Control function, configures various baudrates, and measures
510 the transfer time with this sequence:
512 - Initialize with callback
514 - Change baud rate with specific control parameter
515 - Measure transfer time
519 \note If this test issues errors or warnings, refer to the \ref test_results section for more information.
521 void USART_Loopback_CheckBaudrate (void) {
524 uint32_t ticks_measured;
525 uint32_t ticks_expected;
528 /* Allocate buffer */
529 buffer_out = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
530 TEST_ASSERT(buffer_out != NULL);
531 buffer_in = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
532 TEST_ASSERT(buffer_in != NULL);
534 /* Initialize with callback, power on and configure USART bus */
535 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
536 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
537 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
538 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
541 for (speed=0; speed<USART_BR_NUM; speed++) {
543 /* Set output buffer with random data*/
544 srand(GET_SYSTICK());
545 for (cnt = 0; cnt<BUFFER_SIZE_BR; cnt++) {
546 buffer_out[cnt] = (buf_t)rand()&((1U<<USART_DATA_BITS)-1U);
549 /* Change baud rate*/
550 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,0) == ARM_DRIVER_OK);
551 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,0) == ARM_DRIVER_OK);
552 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS, USART_BR[speed])
554 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
555 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
557 /* Set Local Loopback */
558 USART_LOCAL_LOOPBACK();
560 /* Measure transfer time */
561 ticks_measured = GET_SYSTICK();
562 USART_RunTransfer(buffer_out, buffer_in, BUFFER_SIZE_BR);
563 ticks_measured = GET_SYSTICK() - ticks_measured;
564 ticks_expected = SYSTICK_MICROSEC(BUFFER_SIZE_BR*10000/(USART_BR[speed]/100));
565 ticks_expected *= USART_DATA_BITS+2;
567 rate = (double)ticks_measured/ticks_expected;
569 if ((rate>(1.0+(double)TOLERANCE_BR/100))||(rate<(1.0-(double)TOLERANCE_BR/100))) {
570 snprintf(str,sizeof(str),"[WARNING] At %dbps: measured time is %f x expected time", USART_BR[speed], rate);
574 /* Check received data against sent data */
575 if (memcmp(buffer_in, buffer_out, BUFFER_SIZE_BR)!=0) {
576 snprintf(str,sizeof(str),"[FAILED] At %dbps: fail to check block of %d bytes", USART_BR[speed], BUFFER_SIZE_BR);
577 TEST_FAIL_MESSAGE(str);
581 /* Power off and uninitialize */
582 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
583 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
590 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
592 \brief Test case: USART_Config_CommonParams
594 The test case \b USART_Config_CommonParams verifies the \b Control function with the sequence:
595 - Initialize with callback
597 - Configure USART bus
603 void USART_Config_CommonParams (void) {
605 /* Initialize with callback and power on */
606 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
607 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
609 /* Configure USART bus*/
610 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
611 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
612 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
613 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
615 /* Power off and uninitialize */
616 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
617 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
620 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
622 \brief Test case: USART_Send
624 The test case \b USART_Send verifies the \b Send function with the sequence:
625 - Initialize with callback
627 - Send data using callback
628 - Send data without callback
632 void USART_Send (void) {
635 /* Allocate buffer */
636 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
637 TEST_ASSERT(buffer_out != NULL);
639 /* Initialize with callback, power on and configure USART bus */
640 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
641 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
642 TEST_ASSERT(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 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
645 TEST_ASSERT(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 snprintf(str,sizeof(str),"[FAILED] Fail to send %d bytes",BUFFER[cnt]);
653 TEST_FAIL_MESSAGE(str);
656 /* Send without callback */
657 if (USART_RunSend_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
658 snprintf(str,sizeof(str),"[FAILED] Fail to send without callback %d bytes",BUFFER[cnt]);
659 TEST_FAIL_MESSAGE(str);
663 /* Power off and uninitialize */
664 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
665 TEST_ASSERT(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) {
686 /* Allocate buffer */
687 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
688 TEST_ASSERT(buffer_out != NULL);
690 /* Initialize with callback, power on and configure USART bus */
691 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
692 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
693 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
694 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
695 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
696 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
698 /* Send data chunks */
699 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
701 /* Send using callback */
702 if (USART_RunReceive(buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
703 snprintf(str,sizeof(str),"[FAILED] Fail to receive %d bytes",BUFFER[cnt]);
704 TEST_FAIL_MESSAGE(str);
707 /* Send without callback */
708 if (USART_RunReceive_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
709 snprintf(str,sizeof(str),"[FAILED] Fail to send without callback %d bytes",BUFFER[cnt]);
710 TEST_FAIL_MESSAGE(str);
714 /* Power off and uninitialize */
715 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
716 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
722 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
724 \brief Test case: USART_Loopback_Transfer
726 The test case \b USART_Loopback_Transfer verifies the \b Transfer function with the sequence:
727 - Initialize with callback
731 - Check received data against sent data
735 void USART_Loopback_Transfer (void) {
737 uint8_t pattern[] = BUFFER_PATTERN;
739 /* Allocate buffer */
740 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
741 TEST_ASSERT(buffer_out != NULL);
742 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
743 TEST_ASSERT(buffer_in != NULL);
745 /* Initialize with callback, power on and configure USART bus */
746 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
747 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
748 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
749 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
750 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
751 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
753 /* Set Local Loopback */
754 USART_LOCAL_LOOPBACK();
756 /* Set output buffer pattern*/
757 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1];) {
758 for (i = 0; i<ARRAY_SIZE(pattern);) {
759 buffer_out[cnt] = pattern[i++];
760 if (USART_DATA_BITS>8U) buffer_out[cnt] |= pattern[i++]<<8U;
761 buffer_out[cnt++] &= (1U<<USART_DATA_BITS)-1U;
765 /* Transfer data chunks */
766 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
767 /* Clear input buffer*/
768 memset(buffer_in,0,BUFFER[cnt]);
769 if (USART_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
770 snprintf(str,sizeof(str),"[FAILED] Fail to transfer block of %d bytes",BUFFER[cnt]);
771 TEST_FAIL_MESSAGE(str);
773 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
774 snprintf(str,sizeof(str),"[FAILED] Fail to check block of %d bytes",BUFFER[cnt]);
775 TEST_FAIL_MESSAGE(str);
779 /* Set output buffer with random data*/
780 srand(GET_SYSTICK());
781 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1]; cnt++) {
782 buffer_out[cnt] = (buf_t)rand()&((1U<<USART_DATA_BITS)-1U);
785 /* Transfer data chunks */
786 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
787 /* Clear input buffer*/
788 memset(buffer_in,0,BUFFER[cnt]);
789 if (USART_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
790 snprintf(str,sizeof(str),"[FAILED] Fail to transfer block of %d bytes",BUFFER[cnt]);
791 TEST_FAIL_MESSAGE(str);
793 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
794 snprintf(str,sizeof(str),"[FAILED] Fail to check block of %d bytes",BUFFER[cnt]);
795 TEST_FAIL_MESSAGE(str);
799 /* Power off and uninitialize */
800 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
801 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
811 // end of group usart_funcs