1 /*-----------------------------------------------------------------------------
3 * Purpose: SPI test cases
4 *----------------------------------------------------------------------------
5 * Copyright(c) KEIL - An ARM Company
6 *----------------------------------------------------------------------------*/
9 #include "DV_Framework.h"
10 #include "Driver_SPI.h"
16 #if (SPI_DATA_BITS>16U)
17 typedef uint32_t buf_t;
18 #elif (SPI_DATA_BITS>8U)
19 typedef uint16_t buf_t;
21 typedef uint8_t buf_t;
24 // SPI buffer pointers
25 static buf_t *buffer_out;
26 static buf_t *buffer_in;
28 // SPI baudrates (kHz)
29 static const uint32_t SPI_BR[] = {
49 static const uint32_t SPI_BR_NUM = ARRAY_SIZE(SPI_BR);
51 // Register Driver_SPI#
52 extern ARM_DRIVER_SPI CREATE_SYMBOL(Driver_SPI, DRV_SPI);
53 static ARM_DRIVER_SPI *drv = &CREATE_SYMBOL(Driver_SPI, DRV_SPI);
54 static ARM_SPI_CAPABILITIES capab;
57 static uint8_t volatile Event;
60 static void SPI_DrvEvent (uint32_t event) {
65 int8_t SPI_RunTransfer (void *out, void *in, uint32_t cnt);
66 int8_t SPI_RunTransfer (void *out, void *in, uint32_t cnt) {
69 Event &= ~ARM_SPI_EVENT_TRANSFER_COMPLETE;
70 drv->Transfer (out, in, cnt);
74 if (Event & ARM_SPI_EVENT_TRANSFER_COMPLETE) {
78 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
80 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
85 int8_t SPI_RunSend (void *out, uint32_t cnt);
86 int8_t SPI_RunSend (void *out, uint32_t cnt) {
89 Event &= ~ARM_SPI_EVENT_TRANSFER_COMPLETE;
94 if (Event & ARM_SPI_EVENT_TRANSFER_COMPLETE) {
98 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
100 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
104 // SPI send without callback
105 int8_t SPI_RunSend_NoCallback (void *out, uint32_t cnt);
106 int8_t SPI_RunSend_NoCallback (void *out, uint32_t cnt) {
109 drv->Send (out, cnt);
111 tick = GET_SYSTICK();
113 if (drv->GetDataCount() == cnt) {
116 if (drv->GetStatus().data_lost) {
120 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
122 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
127 int8_t SPI_RunReceive (void *in, uint32_t cnt);
128 int8_t SPI_RunReceive (void *in, uint32_t cnt) {
131 Event &= ~ARM_SPI_EVENT_TRANSFER_COMPLETE;
132 drv->Receive (in, cnt);
134 tick = GET_SYSTICK();
136 if (Event & ARM_SPI_EVENT_TRANSFER_COMPLETE) {
140 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
142 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
147 int8_t SPI_RunReceiveNoCallback (void *in, uint32_t cnt);
148 int8_t SPI_RunReceiveNoCallback (void *in, uint32_t cnt) {
152 drv->Receive (in, cnt);
154 tick = GET_SYSTICK();
156 if (drv->GetDataCount() == cnt) {
159 if (drv->GetStatus().data_lost) {
163 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
165 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
169 /*-----------------------------------------------------------------------------
171 *----------------------------------------------------------------------------*/
173 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
175 \defgroup spi_funcs SPI Validation
176 \brief SPI test cases
178 The SPI validation test performs the following checks:
179 - API interface compliance.
180 - Data communication with various transfer sizes and communication parameters.
181 - Transfer speed of the data communication.
182 - Loopback communication.
184 \anchor spi_loop_back_setup
185 Loopback Communication Setup
186 ----------------------------
188 To perform loopback communication tests, it is required to connect the SPI's \b MISO signal to the \b MOSI signal (refer to
189 the schematics of your target hardware for detailed pinout information).
193 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
195 \brief Test case: SPI_GetCapabilities
197 The test case \b SPI_GetCapabilities verifies the function \b GetCapabilities.
199 void SPI_GetCapabilities (void) {
200 /* Get SPI capabilities */
201 capab = drv->GetCapabilities();
202 ASSERT_TRUE(&capab != NULL);
205 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
207 \brief Test case: SPI_Initialization
209 The test case \b SPI_Initialization verifies the SPI functions with the sequence:
210 - \b Initialize without callback
212 - \b Initialize with callback
215 void SPI_Initialization (void) {
217 /* Initialize without callback */
218 ASSERT_TRUE(drv->Initialize(NULL) == ARM_DRIVER_OK);
221 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
223 /* Initialize with callback */
224 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
227 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
230 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
232 \brief Test case: SPI_CheckInvalidInit
234 The test case \b SPI_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
236 - \b PowerControl with Power off
237 - \b PowerControl with Power on
239 - \b PowerControl with Power off
242 void SPI_CheckInvalidInit (void) {
245 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
248 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
250 /* Try to power on */
251 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK);
253 /* Try to set configuration */
254 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(8) | ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000)
258 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
261 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
264 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
266 \brief Test case: SPI_PowerControl
268 The test case \b SPI_PowerControl verifies the \b PowerControl function with the sequence:
269 - Initialize with callback
275 void SPI_PowerControl (void) {
278 /* Initialize with callback */
279 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
282 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
285 val = drv->PowerControl (ARM_POWER_LOW);
286 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { SET_RESULT(WARNING, "Low power is not supported"); }
287 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
290 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
293 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
297 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
299 \brief Test case: SPI_Config_PolarityPhase
301 The test case \b SPI_Config_PolarityPhase verifies the \b Control function with the sequence:
302 - Initialize with callback
304 - Set basic SPI bus configuration
307 - Change polarity and phase
311 void SPI_Config_PolarityPhase (void) {
313 /* Initialize with callback and power on*/
314 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
315 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
317 /* Set basic SPI bus configuration*/
318 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS), SPI_BR[0]*1000) == ARM_DRIVER_OK);
320 /* Change polarity */
321 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL1_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS), SPI_BR[0]*1000) == ARM_DRIVER_OK);
324 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA1 | ARM_SPI_DATA_BITS(SPI_DATA_BITS), SPI_BR[0]*1000) == ARM_DRIVER_OK);
326 /* Change polarity and phase */
327 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL1_CPHA1 | ARM_SPI_DATA_BITS(SPI_DATA_BITS), SPI_BR[0]*1000) == ARM_DRIVER_OK);
329 /* Power off and uninitialize*/
330 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
331 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
334 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
336 \brief Test case: SPI_Config_DataBits
338 The test case \b SPI_Config_DataBits verifies the \b Control function with the sequence:
339 - Initialize with callback
341 - Data bits = \token{8}
342 - Data bits = \token{16}
346 void SPI_Config_DataBits (void) {
349 /* Initialize with callback and power on*/
350 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
351 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
354 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8), SPI_BR[0]*1000);
355 if (val == ARM_SPI_ERROR_DATA_BITS) { SET_RESULT(WARNING, "Data Bits = 8 are not supported"); }
356 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
359 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(16), SPI_BR[0]*1000);
360 if (val == ARM_SPI_ERROR_DATA_BITS) { SET_RESULT(WARNING, "Data Bits = 16 are not supported"); }
361 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
363 /* Power off and uninitialize*/
364 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
365 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
368 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
370 \brief Test case: SPI_Config_BitOrder
372 The test case \b SPI_Config_BitOrder verifies the \b Control function with the sequence:
373 - Initialize with callback
380 void SPI_Config_BitOrder (void) {
383 /* Initialize with callback and power on*/
384 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
385 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
387 /* Bit order LSB_MSB */
388 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_LSB_MSB, SPI_BR[0]*1000);
389 if (val == ARM_SPI_ERROR_BIT_ORDER) { SET_RESULT(WARNING, "Bit order LSB_MSB is not supported"); }
390 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
392 /* Bit order MSB_LSB */
393 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_MSB_LSB, SPI_BR[0]*1000);
394 if (val == ARM_SPI_ERROR_BIT_ORDER) { SET_RESULT(WARNING, "Bit order MSB_LSB is not supported"); }
395 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
397 /* Power off and uninitialize*/
398 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
399 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
402 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
404 \brief Test case: SPI_Config_SSMode
406 The test case \b SPI_Config_SSMode verifies the \b Control function with the sequence:
407 - Initialize with callback
409 - SS Mode MASTER_HW_OUTPUT
410 - SS Mode MASTER_HW_INPUT
415 void SPI_Config_SSMode (void) {
418 /* Initialize with callback and power on*/
419 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
420 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
422 /* SS Mode MASTER_HW_OUTPUT */
423 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_SS_MASTER_HW_OUTPUT, SPI_BR[0]*1000);
424 if (val == ARM_SPI_ERROR_SS_MODE) { SET_RESULT(WARNING, "Slave select MASTER_HW_OUTPUT is not supported"); }
425 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
427 /* SS Mode MASTER_HW_INPUT */
428 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_SS_MASTER_HW_INPUT, SPI_BR[0]*1000);
429 if (val == ARM_SPI_ERROR_SS_MODE) { SET_RESULT(WARNING, "Slave select MASTER_HW_INPUT is not supported"); }
430 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
432 /* SS Mode MASTER_SW */
433 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_SS_MASTER_SW, SPI_BR[0]*1000);
434 if (val == ARM_SPI_ERROR_SS_MODE) { SET_RESULT(WARNING, "Slave select MASTER_SW is not supported"); }
435 else { ASSERT_TRUE(val == ARM_DRIVER_OK); }
437 /* Power off and uninitialize*/
438 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
439 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
442 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
444 \brief Test case: SPI_Config_CommonParams
446 The test case \b SPI_Config_CommonParams verifies the \b Control function with the sequence:
447 - Initialize with callback
453 void SPI_Config_CommonParams (void) {
455 /* Initialize with callback and power on*/
456 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
457 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
459 /* Configure SPI bus */
460 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
461 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
463 /* Power off and uninitialize*/
464 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
465 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
468 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
470 \brief Test case: SPI_Config_BusSpeed
472 The test case \b SPI_Config_BusSpeed verifies the \b Control function and tests bus speeds with the sequence:
473 - Initialize with callback
475 - Change bus speed with specific control parameter
477 - Change bus speed with general control parameter
482 \note Typically, the SPI bus speed is limited to a maximum number. This means that for a bus speed of 25 MHz, values below
483 25 MHz are also acceptable. If this test returns a higher value than the one that is being set, you need to check the
486 void SPI_Config_BusSpeed (void) {
491 /* Initialize with callback, power on and configure SPI bus */
492 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
493 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
494 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
495 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
497 /* Test bus speeds */
498 for (speed=0; speed<SPI_BR_NUM; speed++) {
500 /* Change bus speed with specific control parameter*/
501 ASSERT_TRUE (drv->Control(ARM_SPI_SET_BUS_SPEED, SPI_BR[speed]*1000)
505 val = drv->Control(ARM_SPI_GET_BUS_SPEED,0)/1000;
506 if ((uint32_t)val != SPI_BR[speed]) {
507 sprintf(str,"Specific control set speed: %dkHz, Get speed: %dkHz",SPI_BR[speed], val);
508 SET_RESULT(WARNING, str);
509 } else SET_RESULT(PASSED, NULL);
511 /* Change bus speed with general control parameter*/
512 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(8) | ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_SW, SPI_BR[speed]*1000)
516 val = drv->Control(ARM_SPI_GET_BUS_SPEED,0)/1000;
517 if ((uint32_t)val != SPI_BR[speed]) {
518 sprintf(str,"General control set speed: %dkHz, Get speed: %dkHz",SPI_BR[speed], val);
519 SET_RESULT(WARNING, str);
520 } else SET_RESULT(PASSED, NULL);
524 /* Power off and uninitialize*/
525 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
526 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
529 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
531 \brief Test case: SPI_Send
533 The test case \b SPI_Send verifies the function \b Send with the sequence:
534 - Initialize with callback
536 - Send using callback
537 - Send without callback
541 void SPI_Send (void) {
545 /* Allocate buffer */
546 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
547 ASSERT_TRUE(buffer_out != NULL);
549 /* Initialize with callback, power on and configure SPI bus */
550 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
551 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
552 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
553 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
555 /* Send data chunks */
556 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
558 /* Send using callback */
559 if (SPI_RunSend(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
560 sprintf(str,"Fail to send %d bytes",BUFFER[cnt]);
561 SET_RESULT(FAILED, str);
562 } else SET_RESULT(PASSED, NULL);
564 /* Send without callback */
565 if (SPI_RunSend_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
566 sprintf(str,"Fail to send without callback %d bytes",BUFFER[cnt]);
567 SET_RESULT(FAILED, str);
568 } else SET_RESULT(PASSED, NULL);
571 /* Power off and uninitialize*/
572 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
573 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
579 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
581 \brief Test case: SPI_Receive
583 The test case \b SPI_Receive verifies the function \b Receive with the sequence:
584 - Initialize with callback
586 - Receive using callback
587 - Receive without callback
591 void SPI_Receive (void) {
595 /* Allocate buffer */
596 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
597 ASSERT_TRUE(buffer_in != NULL);
599 /* Initialize with callback, power on and configure SPI bus */
600 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
601 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
602 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
603 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
605 /* Receive data chunks */
606 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
608 /* Receive using callback */
609 if (SPI_RunReceive(buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
610 sprintf(str,"Fail to receive %d bytes",BUFFER[cnt]);
611 SET_RESULT(FAILED, str);
612 } else SET_RESULT(PASSED, NULL);
614 /* Receive without callback */
615 if (SPI_RunReceiveNoCallback(buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
616 sprintf(str,"Fail to receive without callback %d bytes",BUFFER[cnt]);
617 SET_RESULT(FAILED, str);
618 } else SET_RESULT(PASSED, NULL);
621 /* Power off and uninitialize*/
622 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
623 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
629 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
631 \brief Test case: SPI_Loopback_CheckBusSpeed
633 The test case \b SPI_Loopback_CheckBusSpeed verifies the \b Control function, configures various bus speeds, and measures
634 the transfer time with this sequence:
635 - Initialize with callback
637 - Change bus speed with specific control parameter
638 - Measure transfer time
642 \note If this test issues errors or warnings, refer to the \ref test_results section for more information.
644 void SPI_Loopback_CheckBusSpeed (void) {
648 uint32_t ticks_measured;
649 uint32_t ticks_expected;
653 /* Allocate buffer */
654 buffer_out = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
655 ASSERT_TRUE(buffer_out != NULL);
656 buffer_in = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
657 ASSERT_TRUE(buffer_in != NULL);
659 /* Initialize with callback, power on and configure SPI bus */
660 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
661 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
662 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
663 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
665 /* Set Local Loopback */
666 SPI_LOCAL_LOOPBACK();
668 /* Test bus speeds */
669 for (speed=0; speed<SPI_BR_NUM; speed++) {
671 /* Set output buffer with random data */
672 srand(GET_SYSTICK());
673 for (cnt = 0; cnt<BUFFER_SIZE_BR; cnt++) {
674 buffer_out[cnt] = (buf_t)rand()&((1U<<SPI_DATA_BITS)-1U);
677 /* Change bus speed with specific control parameter*/
678 ASSERT_TRUE (drv->Control(ARM_SPI_SET_BUS_SPEED, SPI_BR[speed]*1000)
682 val = drv->Control(ARM_SPI_GET_BUS_SPEED,0)/1000;
684 /* Measure transfer time */
685 ticks_measured = GET_SYSTICK();
686 SPI_RunTransfer(buffer_out, buffer_in, BUFFER_SIZE_BR);
687 ticks_measured = GET_SYSTICK() - ticks_measured;
688 ticks_expected = SYSTICK_MICROSEC(BUFFER_SIZE_BR*1000/(uint32_t)val);
689 ticks_expected *= SPI_DATA_BITS;
691 rate = (double)ticks_measured/ticks_expected;
693 if ((rate>(1.0+(double)MIN_BUS_SPEED/100))||(rate<1.0)) {
694 sprintf(str,"At %dkHz: measured time is %f x expected time", val, rate);
695 SET_RESULT(WARNING, str);
696 } else SET_RESULT(PASSED, NULL);
698 /* Check received data against sent data*/
699 if (memcmp(buffer_in, buffer_out, BUFFER_SIZE_BR)!=0) {
700 sprintf(str,"At %dkHz: fail to check block of %d bytes", val, BUFFER_SIZE_BR);
701 SET_RESULT(FAILED, str);
702 } else SET_RESULT(PASSED, NULL);
705 /* Power off and uninitialize*/
706 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
707 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
714 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
716 \brief Test case: SPI_Loopback_Transfer
718 The test case \b SPI_Loopback_Transfer verifies the function \b Transfer with the sequence:
719 - Initialize with callback
722 - Check received data against sent data
726 void SPI_Loopback_Transfer (void) {
728 uint8_t pattern[] = BUFFER_PATTERN;
731 /* Allocate buffer */
732 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
733 ASSERT_TRUE(buffer_out != NULL);
734 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
735 ASSERT_TRUE(buffer_in != NULL);
737 /* Initialize with callback, power on and configure SPI bus */
738 ASSERT_TRUE(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
739 ASSERT_TRUE(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
740 ASSERT_TRUE(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
741 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
743 /* Set Local Loopback */
744 SPI_LOCAL_LOOPBACK();
746 /* Set output buffer pattern*/
747 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1];) {
748 for (i = 0; i<ARRAY_SIZE(pattern);) {
749 buffer_out[cnt] = pattern[i++];
750 if (SPI_DATA_BITS>8U) {
751 buffer_out[cnt] |= pattern[i++]<<8U;
753 if (SPI_DATA_BITS>16U) {
754 buffer_out[cnt] |= pattern[i++]<<16U;
755 buffer_out[cnt] |= pattern[i++]<<24U;
757 buffer_out[cnt++] &= (1U<<SPI_DATA_BITS)-1U;
761 /* Transfer data chunks */
762 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
763 /* Clear input buffer */
764 memset(buffer_in,0,BUFFER[cnt]);
765 if (SPI_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
766 sprintf(str,"Fail to transfer block of %d bytes",BUFFER[cnt]);
767 SET_RESULT(FAILED, str);
768 } else SET_RESULT(PASSED, NULL);
769 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
770 sprintf(str,"Fail to check block of %d bytes",BUFFER[cnt]);
771 SET_RESULT(FAILED, str);
772 } else SET_RESULT(PASSED, NULL);
775 /* Set output buffer with random data */
776 srand(GET_SYSTICK());
777 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1]; cnt++) {
778 buffer_out[cnt] = (buf_t)rand()&((1U<<SPI_DATA_BITS)-1U);
781 /* Transfer data chunks */
782 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
783 /* Clear input buffer */
784 memset(buffer_in,0,BUFFER[cnt]);
785 if (SPI_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
786 sprintf(str,"Fail to transfer block of %d bytes",BUFFER[cnt]);
787 SET_RESULT(FAILED, str);
788 } else SET_RESULT(PASSED, NULL);
789 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
790 sprintf(str,"Fail to check block of %d bytes",BUFFER[cnt]);
791 SET_RESULT(FAILED, str);
792 } else SET_RESULT(PASSED, NULL);
795 /* Power off and uninitialize*/
796 ASSERT_TRUE(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
797 ASSERT_TRUE(drv->Uninitialize() == ARM_DRIVER_OK);
807 // end of group spi_funcs