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 *out, void *in, uint32_t cnt);
142 int8_t USART_RunReceive (void *out, void *in, uint32_t cnt) {
145 Event &= ~ARM_USART_EVENT_RECEIVE_COMPLETE;
147 drv->Receive (in, cnt);
148 drv->Send (out, cnt); // Send data that will be received with loopback
150 tick = GET_SYSTICK();
152 if (Event & ARM_USART_EVENT_RECEIVE_COMPLETE) {
156 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
158 drv->Control(ARM_USART_ABORT_RECEIVE, 0);
162 // USART receive without callback
163 int8_t USART_RunReceive_NoCallback (void *out, void *in, uint32_t cnt);
164 int8_t USART_RunReceive_NoCallback (void *out, void *in, uint32_t cnt) {
167 drv->Receive (in, cnt);
168 drv->Send (out, cnt); // Send data that will be received with loopback
170 tick = GET_SYSTICK();
172 if (drv->GetRxCount() == cnt) {
176 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(USART_TRANSFER_TIMEOUT));
178 drv->Control(ARM_USART_ABORT_RECEIVE, 0);
183 /*-----------------------------------------------------------------------------
185 *----------------------------------------------------------------------------*/
188 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
190 \defgroup usart_funcs USART Validation
191 \brief USART test cases
193 The USART validation test performs the following checks:
194 - API interface compliance.
195 - Data communication with various transfer sizes and communication parameters.
196 - Transfer speed of the data communication.
197 - Loopback communication.
199 \anchor usart_loop_back_setup
200 Loopback Communication Setup
201 ----------------------------
203 To perform loopback communication tests, it is required to connect the USART's \b TX signal to the \b RX signal (refer to the
204 schematics of your target hardware for detailed pinout information).
208 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
210 \brief Test case: USART_GetCapabilities
212 The test case \b USART_GetCapabilities verifies the function \b GetCapabilities.
214 void USART_GetCapabilities (void) {
215 /* Get USART capabilities */
216 capab = drv->GetCapabilities();
217 TEST_ASSERT(&capab != NULL);
220 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
222 \brief Test case: USART_Initialization
224 The test case \b USART_Initialization verifies the USART functions with the sequence:
225 - \b Initialize without callback
227 - \b Initialize with callback
230 void USART_Initialization (void) {
232 /* Initialize without callback */
233 TEST_ASSERT(drv->Initialize(NULL) == ARM_DRIVER_OK);
236 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
238 /* Initialize with callback */
239 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
242 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
245 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
247 \brief Test case: USART_CheckInvalidInit
249 The test case \b USART_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
251 - \b PowerControl with Power off
252 - \b PowerControl with Power on
254 - \b PowerControl with Power off
257 void USART_CheckInvalidInit (void) {
260 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
263 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
265 /* Try to power on */
266 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK);
268 /* Try to set configuration */
269 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
270 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) != ARM_DRIVER_OK);
273 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
276 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
279 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
281 \brief Test case: USART_PowerControl
283 The test case \b USART_PowerControl verifies the \b PowerControl function with the sequence:
284 - Initialize with callback
290 void USART_PowerControl (void) {
293 /* Initialize with callback */
294 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
297 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
300 val = drv->PowerControl (ARM_POWER_LOW);
301 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Low power is not supported"); }
302 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
305 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
308 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
311 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
313 \brief Test case: USART_Config_PolarityPhase
315 The test case \b USART_Config_PolarityPhase verifies the \b Control function with the sequence:
316 - Initialize with callback
318 - Set basic SPI bus configuration
321 - Change polarity and phase
325 void USART_Config_PolarityPhase (void) {
327 /* Initialize with callback and power on */
328 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
329 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
331 /* Set basic SPI bus configuration*/
332 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL0 | ARM_USART_CPHA0, USART_BR[0]) == ARM_DRIVER_OK);
334 /* Change polarity */
335 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL1 | ARM_USART_CPHA0, USART_BR[0]) == ARM_DRIVER_OK);
338 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL0 | ARM_USART_CPHA1, USART_BR[0]) == ARM_DRIVER_OK);
340 /* Change polarity and phase */
341 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_CPOL1 | ARM_USART_CPHA1, USART_BR[0]) == ARM_DRIVER_OK);
343 /* Power off and uninitialize */
344 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
345 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
348 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
350 \brief Test case: USART_Config_DataBits
352 The test case \b USART_Config_DataBits verifies the \b Control function with the sequence:
353 - Initialize with callback
355 - Data bits = \token{5}
356 - Data bits = \token{6}
357 - Data bits = \token{7}
358 - Data bits = \token{8}
359 - Data bits = \token{9}
363 void USART_Config_DataBits (void) {
366 /* Initialize with callback and power on */
367 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
368 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
370 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_5, USART_BR[0]);
371 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 5 are not supported"); }
372 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
374 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_6, USART_BR[0]);
375 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 6 are not supported"); }
376 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
378 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_7, USART_BR[0]);
379 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 7 are not supported"); }
380 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
382 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_8, USART_BR[0]);
383 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 8 are not supported"); }
384 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
386 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_9, USART_BR[0]);
387 if (val == ARM_USART_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 9 are not supported"); }
388 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
390 /* Power off and uninitialize */
391 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
392 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
395 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
397 \brief Test case: USART_Config_StopBits
399 The test case \b USART_Config_StopBits verifies the \b Control function with the sequence:
400 - Initialize with callback
402 - Stop bits = \token{1}
403 - Stop bits = \token{2}
404 - Stop bits = \token{1.5}
405 - Stop bits = \token{0.5}
409 void USART_Config_StopBits (void) {
412 /* Initialize with callback and power on */
413 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
414 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
416 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_1, USART_BR[0]);
417 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 1 are not supported"); }
418 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
420 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_2, USART_BR[0]);
421 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 2 are not supported"); }
422 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
424 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_1_5, USART_BR[0]);
425 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 1.5 are not supported"); }
426 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
428 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_STOP_BITS_0_5, USART_BR[0]);
429 if (val == ARM_USART_ERROR_STOP_BITS) { TEST_MESSAGE("[WARNING] Stop Bits = 0.5 are not supported"); }
430 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
432 /* Power off and uninitialize */
433 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
434 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
437 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
439 \brief Test case: USART_Config_Parity
441 The test case \b USART_Config_Parity verifies the \b Control function with the sequence:
442 - Initialize with callback
444 - Sets parity bits: even parity
445 - Sets parity bits: no parity
446 - Sets parity bits: odd parity
450 void USART_Config_Parity (void) {
453 /* Initialize with callback and power on */
454 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
455 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
457 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_EVEN, USART_BR[0]);
458 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] Even parity is not supported"); }
459 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
461 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_NONE, USART_BR[0]);
462 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] No parity is not supported"); }
463 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
465 val = drv->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_PARITY_ODD, USART_BR[0]);
466 if (val == ARM_USART_ERROR_PARITY) { TEST_MESSAGE("[WARNING] Odd parity not supported"); }
467 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
469 /* Power off and uninitialize */
470 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
471 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
474 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
476 \brief Test case: USART_Config_Baudrate
478 The test case \b USART_Config_Baudrate verifies the \b Control function and configures various baudrates with the sequence:
479 - Initialize with callback
485 \note This test needs to pass to be able to transfer data via the USART correctly. Usually, USART communication is set to a
486 certain baudrate with a defined tolerance. If the driver is not able to set the baudrate correctly, data exchange will not be
489 void USART_Config_Baudrate (void) {
492 /* Initialize with callback and power on */
493 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
494 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
496 /* Change baud rate*/
497 for (speed=0; speed<USART_BR_NUM; speed++) {
499 TEST_ASSERT (drv->Control(ARM_USART_MODE_ASYNCHRONOUS, USART_BR[speed])
503 /* Power off and uninitialize */
504 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
505 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
508 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
510 \brief Test case: USART_Loopback_CheckBaudrate
512 The test case \b USART_Loopback_CheckBaudrate verifies the \b Control function, configures various baudrates, and measures
513 the transfer time with this sequence:
515 - Initialize with callback
517 - Change baud rate with specific control parameter
518 - Measure transfer time
522 \note If this test issues errors or warnings, refer to the \ref test_results section for more information.
524 void USART_Loopback_CheckBaudrate (void) {
527 uint32_t ticks_measured;
528 uint32_t ticks_expected;
531 /* Allocate buffer */
532 buffer_out = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
533 TEST_ASSERT(buffer_out != NULL);
534 buffer_in = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
535 TEST_ASSERT(buffer_in != NULL);
537 /* Initialize with callback, power on and configure USART bus */
538 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
539 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
540 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
541 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
544 for (speed=0; speed<USART_BR_NUM; speed++) {
546 /* Set output buffer with random data*/
547 srand(GET_SYSTICK());
548 for (cnt = 0; cnt<BUFFER_SIZE_BR; cnt++) {
549 buffer_out[cnt] = (buf_t)rand()&((1U<<USART_DATA_BITS)-1U);
552 /* Change baud rate*/
553 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,0) == ARM_DRIVER_OK);
554 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,0) == ARM_DRIVER_OK);
555 TEST_ASSERT(drv->Control(ARM_USART_MODE_ASYNCHRONOUS, USART_BR[speed])
557 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
558 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
560 /* Set Local Loopback */
561 USART_LOCAL_LOOPBACK();
563 /* Measure transfer time */
564 ticks_measured = GET_SYSTICK();
565 USART_RunTransfer(buffer_out, buffer_in, BUFFER_SIZE_BR);
566 ticks_measured = GET_SYSTICK() - ticks_measured;
567 ticks_expected = SYSTICK_MICROSEC(BUFFER_SIZE_BR*10000/(USART_BR[speed]/100));
568 ticks_expected *= USART_DATA_BITS+2;
570 rate = (double)ticks_measured/ticks_expected;
572 if ((rate>(1.0+(double)TOLERANCE_BR/100))||(rate<(1.0-(double)TOLERANCE_BR/100))) {
573 snprintf(str,sizeof(str),"[WARNING] At %dbps: measured time is %f x expected time", USART_BR[speed], rate);
577 /* Check received data against sent data */
578 if (memcmp(buffer_in, buffer_out, BUFFER_SIZE_BR)!=0) {
579 snprintf(str,sizeof(str),"[FAILED] At %dbps: fail to check block of %d bytes", USART_BR[speed], BUFFER_SIZE_BR);
580 TEST_FAIL_MESSAGE(str);
584 /* Power off and uninitialize */
585 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
586 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
593 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
595 \brief Test case: USART_Config_CommonParams
597 The test case \b USART_Config_CommonParams verifies the \b Control function with the sequence:
598 - Initialize with callback
600 - Configure USART bus
606 void USART_Config_CommonParams (void) {
608 /* Initialize with callback and power on */
609 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
610 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
612 /* Configure USART bus*/
613 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
614 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
615 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
616 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
618 /* Power off and uninitialize */
619 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
620 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
623 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
625 \brief Test case: USART_Send
627 The test case \b USART_Send verifies the \b Send function with the sequence:
628 - Initialize with callback
630 - Send data using callback
631 - Send data without callback
635 void USART_Send (void) {
638 /* Allocate buffer */
639 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
640 TEST_ASSERT(buffer_out != NULL);
642 /* Initialize with callback, power on and configure USART bus */
643 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
644 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
645 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
646 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
647 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
648 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
650 /* Send data chunks */
651 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
653 /* Send using callback */
654 if (USART_RunSend(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
655 snprintf(str,sizeof(str),"[FAILED] Fail to send %d bytes",BUFFER[cnt]);
656 TEST_FAIL_MESSAGE(str);
659 /* Send without callback */
660 if (USART_RunSend_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
661 snprintf(str,sizeof(str),"[FAILED] Fail to send without callback %d bytes",BUFFER[cnt]);
662 TEST_FAIL_MESSAGE(str);
666 /* Power off and uninitialize */
667 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
668 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
674 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
676 \brief Test case: USART_AsynchronousReceive
678 The test case \b USART_AsynchronousReceive verifies the \b Receive function with the sequence:
679 - Initialize with callback
681 - Send data using callback
682 - Send data without callback
686 void USART_AsynchronousReceive (void) {
689 /* Allocate buffer */
690 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
691 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
692 TEST_ASSERT(buffer_in != NULL);
693 TEST_ASSERT(buffer_out != NULL);
695 /* Initialize with callback, power on and configure USART bus */
696 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
697 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
698 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
699 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
700 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
701 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
703 /* Receive data chunks */
704 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
706 /* Receive using callback */
707 if (USART_RunReceive(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
708 snprintf(str,sizeof(str),"[FAILED] Fail to receive %d bytes",BUFFER[cnt]);
709 TEST_FAIL_MESSAGE(str);
712 /* Receive without callback */
713 if (USART_RunReceive_NoCallback(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
714 snprintf(str,sizeof(str),"[FAILED] Fail to send without callback %d bytes",BUFFER[cnt]);
715 TEST_FAIL_MESSAGE(str);
719 /* Power off and uninitialize */
720 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
721 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
727 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
729 \brief Test case: USART_Loopback_Transfer
731 The test case \b USART_Loopback_Transfer verifies the \b Transfer function with the sequence:
732 - Initialize with callback
736 - Check received data against sent data
740 void USART_Loopback_Transfer (void) {
742 uint8_t pattern[] = BUFFER_PATTERN;
744 /* Allocate buffer */
745 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
746 TEST_ASSERT(buffer_out != NULL);
747 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
748 TEST_ASSERT(buffer_in != NULL);
750 /* Initialize with callback, power on and configure USART bus */
751 TEST_ASSERT(drv->Initialize(USART_DrvEvent) == ARM_DRIVER_OK);
752 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
753 TEST_ASSERT(drv->Control (ARM_USART_MODE_ASYNCHRONOUS | USART_DATA_BITS_CTRL_CODE | ARM_USART_PARITY_NONE |
754 ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BR[0]) == ARM_DRIVER_OK);
755 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_TX,1) == ARM_DRIVER_OK);
756 TEST_ASSERT(drv->Control (ARM_USART_CONTROL_RX,1) == ARM_DRIVER_OK);
758 /* Set Local Loopback */
759 USART_LOCAL_LOOPBACK();
761 /* Set output buffer pattern*/
762 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1];) {
763 for (i = 0; i<ARRAY_SIZE(pattern);) {
764 buffer_out[cnt] = pattern[i++];
765 if (USART_DATA_BITS>8U) buffer_out[cnt] |= pattern[i++]<<8U;
766 buffer_out[cnt++] &= (1U<<USART_DATA_BITS)-1U;
770 /* Transfer data chunks */
771 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
772 /* Clear input buffer*/
773 memset(buffer_in,0,BUFFER[cnt]);
774 if (USART_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
775 snprintf(str,sizeof(str),"[FAILED] Fail to transfer block of %d bytes",BUFFER[cnt]);
776 TEST_FAIL_MESSAGE(str);
778 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
779 snprintf(str,sizeof(str),"[FAILED] Fail to check block of %d bytes",BUFFER[cnt]);
780 TEST_FAIL_MESSAGE(str);
784 /* Set output buffer with random data*/
785 srand(GET_SYSTICK());
786 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1]; cnt++) {
787 buffer_out[cnt] = (buf_t)rand()&((1U<<USART_DATA_BITS)-1U);
790 /* Transfer data chunks */
791 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
792 /* Clear input buffer*/
793 memset(buffer_in,0,BUFFER[cnt]);
794 if (USART_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
795 snprintf(str,sizeof(str),"[FAILED] Fail to transfer block of %d bytes",BUFFER[cnt]);
796 TEST_FAIL_MESSAGE(str);
798 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
799 snprintf(str,sizeof(str),"[FAILED] Fail to check block of %d bytes",BUFFER[cnt]);
800 TEST_FAIL_MESSAGE(str);
804 /* Power off and uninitialize */
805 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
806 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
816 // end of group usart_funcs