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;
59 static uint8_t volatile Event;
62 static void SPI_DrvEvent (uint32_t event) {
67 int8_t SPI_RunTransfer (void *out, void *in, uint32_t cnt);
68 int8_t SPI_RunTransfer (void *out, void *in, uint32_t cnt) {
71 Event &= ~ARM_SPI_EVENT_TRANSFER_COMPLETE;
72 drv->Transfer (out, in, cnt);
76 if (Event & ARM_SPI_EVENT_TRANSFER_COMPLETE) {
80 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
82 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
87 int8_t SPI_RunSend (void *out, uint32_t cnt);
88 int8_t SPI_RunSend (void *out, uint32_t cnt) {
91 Event &= ~ARM_SPI_EVENT_TRANSFER_COMPLETE;
96 if (Event & ARM_SPI_EVENT_TRANSFER_COMPLETE) {
100 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
102 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
106 // SPI send without callback
107 int8_t SPI_RunSend_NoCallback (void *out, uint32_t cnt);
108 int8_t SPI_RunSend_NoCallback (void *out, uint32_t cnt) {
111 drv->Send (out, cnt);
113 tick = GET_SYSTICK();
115 if (drv->GetDataCount() == cnt) {
118 if (drv->GetStatus().data_lost) {
122 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
124 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
129 int8_t SPI_RunReceive (void *in, uint32_t cnt);
130 int8_t SPI_RunReceive (void *in, uint32_t cnt) {
133 Event &= ~ARM_SPI_EVENT_TRANSFER_COMPLETE;
134 drv->Receive (in, cnt);
136 tick = GET_SYSTICK();
138 if (Event & ARM_SPI_EVENT_TRANSFER_COMPLETE) {
142 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
144 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
149 int8_t SPI_RunReceiveNoCallback (void *in, uint32_t cnt);
150 int8_t SPI_RunReceiveNoCallback (void *in, uint32_t cnt) {
154 drv->Receive (in, cnt);
156 tick = GET_SYSTICK();
158 if (drv->GetDataCount() == cnt) {
161 if (drv->GetStatus().data_lost) {
165 while ((GET_SYSTICK() - tick) < SYSTICK_MICROSEC(SPI_TRANSFER_TIMEOUT));
167 drv->Control(ARM_SPI_ABORT_TRANSFER, 0);
171 /*-----------------------------------------------------------------------------
173 *----------------------------------------------------------------------------*/
175 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
177 \defgroup spi_funcs SPI Validation
178 \brief SPI test cases
180 The SPI validation test performs the following checks:
181 - API interface compliance.
182 - Data communication with various transfer sizes and communication parameters.
183 - Transfer speed of the data communication.
184 - Loopback communication.
186 \anchor spi_loop_back_setup
187 Loopback Communication Setup
188 ----------------------------
190 To perform loopback communication tests, it is required to connect the SPI's \b MISO signal to the \b MOSI signal (refer to
191 the schematics of your target hardware for detailed pinout information).
195 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
197 \brief Test case: SPI_GetCapabilities
199 The test case \b SPI_GetCapabilities verifies the function \b GetCapabilities.
201 void SPI_GetCapabilities (void) {
202 /* Get SPI capabilities */
203 capab = drv->GetCapabilities();
204 TEST_ASSERT(&capab != NULL);
207 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
209 \brief Test case: SPI_Initialization
211 The test case \b SPI_Initialization verifies the SPI functions with the sequence:
212 - \b Initialize without callback
214 - \b Initialize with callback
217 void SPI_Initialization (void) {
219 /* Initialize without callback */
220 TEST_ASSERT(drv->Initialize(NULL) == ARM_DRIVER_OK);
223 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
225 /* Initialize with callback */
226 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
229 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
232 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
234 \brief Test case: SPI_CheckInvalidInit
236 The test case \b SPI_CheckInvalidInit verifies the driver behaviour when receiving an invalid initialization sequence:
238 - \b PowerControl with Power off
239 - \b PowerControl with Power on
241 - \b PowerControl with Power off
244 void SPI_CheckInvalidInit (void) {
247 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
250 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
252 /* Try to power on */
253 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) != ARM_DRIVER_OK);
255 /* Try to set configuration */
256 TEST_ASSERT(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)
260 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
263 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
266 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
268 \brief Test case: SPI_PowerControl
270 The test case \b SPI_PowerControl verifies the \b PowerControl function with the sequence:
271 - Initialize with callback
277 void SPI_PowerControl (void) {
280 /* Initialize with callback */
281 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
284 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
287 val = drv->PowerControl (ARM_POWER_LOW);
288 if (val == ARM_DRIVER_ERROR_UNSUPPORTED) { TEST_MESSAGE("[WARNING] Low power is not supported"); }
289 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
292 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
295 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
299 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
301 \brief Test case: SPI_Config_PolarityPhase
303 The test case \b SPI_Config_PolarityPhase verifies the \b Control function with the sequence:
304 - Initialize with callback
306 - Set basic SPI bus configuration
309 - Change polarity and phase
313 void SPI_Config_PolarityPhase (void) {
315 /* Initialize with callback and power on*/
316 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
317 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
319 /* Set basic SPI bus configuration*/
320 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS), SPI_BR[0]*1000) == ARM_DRIVER_OK);
322 /* Change polarity */
323 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL1_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS), SPI_BR[0]*1000) == ARM_DRIVER_OK);
326 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA1 | ARM_SPI_DATA_BITS(SPI_DATA_BITS), SPI_BR[0]*1000) == ARM_DRIVER_OK);
328 /* Change polarity and phase */
329 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL1_CPHA1 | ARM_SPI_DATA_BITS(SPI_DATA_BITS), SPI_BR[0]*1000) == ARM_DRIVER_OK);
331 /* Power off and uninitialize*/
332 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
333 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
336 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
338 \brief Test case: SPI_Config_DataBits
340 The test case \b SPI_Config_DataBits verifies the \b Control function with the sequence:
341 - Initialize with callback
343 - Data bits = \token{8}
344 - Data bits = \token{16}
348 void SPI_Config_DataBits (void) {
351 /* Initialize with callback and power on*/
352 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
353 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
356 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8), SPI_BR[0]*1000);
357 if (val == ARM_SPI_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 8 are not supported"); }
358 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
361 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(16), SPI_BR[0]*1000);
362 if (val == ARM_SPI_ERROR_DATA_BITS) { TEST_MESSAGE("[WARNING] Data Bits = 16 are not supported"); }
363 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
365 /* Power off and uninitialize*/
366 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
367 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
370 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
372 \brief Test case: SPI_Config_BitOrder
374 The test case \b SPI_Config_BitOrder verifies the \b Control function with the sequence:
375 - Initialize with callback
382 void SPI_Config_BitOrder (void) {
385 /* Initialize with callback and power on*/
386 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
387 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
389 /* Bit order LSB_MSB */
390 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_LSB_MSB, SPI_BR[0]*1000);
391 if (val == ARM_SPI_ERROR_BIT_ORDER) { TEST_MESSAGE("[WARNING] Bit order LSB_MSB is not supported"); }
392 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
394 /* Bit order MSB_LSB */
395 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_MSB_LSB, SPI_BR[0]*1000);
396 if (val == ARM_SPI_ERROR_BIT_ORDER) { TEST_MESSAGE("[WARNING] Bit order MSB_LSB is not supported"); }
397 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
399 /* Power off and uninitialize*/
400 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
401 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
404 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
406 \brief Test case: SPI_Config_SSMode
408 The test case \b SPI_Config_SSMode verifies the \b Control function with the sequence:
409 - Initialize with callback
411 - SS Mode MASTER_HW_OUTPUT
412 - SS Mode MASTER_HW_INPUT
417 void SPI_Config_SSMode (void) {
420 /* Initialize with callback and power on*/
421 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
422 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
424 /* SS Mode MASTER_HW_OUTPUT */
425 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_SS_MASTER_HW_OUTPUT, SPI_BR[0]*1000);
426 if (val == ARM_SPI_ERROR_SS_MODE) { TEST_MESSAGE("[WARNING] Slave select MASTER_HW_OUTPUT is not supported"); }
427 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
429 /* SS Mode MASTER_HW_INPUT */
430 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_SS_MASTER_HW_INPUT, SPI_BR[0]*1000);
431 if (val == ARM_SPI_ERROR_SS_MODE) { TEST_MESSAGE("[WARNING] Slave select MASTER_HW_INPUT is not supported"); }
432 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
434 /* SS Mode MASTER_SW */
435 val = drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_DATA_BITS(8) | ARM_SPI_SS_MASTER_SW, SPI_BR[0]*1000);
436 if (val == ARM_SPI_ERROR_SS_MODE) { TEST_MESSAGE("[WARNING] Slave select MASTER_SW is not supported"); }
437 else { TEST_ASSERT(val == ARM_DRIVER_OK); }
439 /* Power off and uninitialize*/
440 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
441 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
444 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
446 \brief Test case: SPI_Config_CommonParams
448 The test case \b SPI_Config_CommonParams verifies the \b Control function with the sequence:
449 - Initialize with callback
455 void SPI_Config_CommonParams (void) {
457 /* Initialize with callback and power on*/
458 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
459 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
461 /* Configure SPI bus */
462 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
463 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
465 /* Power off and uninitialize*/
466 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
467 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
470 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
472 \brief Test case: SPI_Config_BusSpeed
474 The test case \b SPI_Config_BusSpeed verifies the \b Control function and tests bus speeds with the sequence:
475 - Initialize with callback
477 - Change bus speed with specific control parameter
479 - Change bus speed with general control parameter
484 \note Typically, the SPI bus speed is limited to a maximum number. This means that for a bus speed of 25 MHz, values below
485 25 MHz are also acceptable. If this test returns a higher value than the one that is being set, you need to check the
488 void SPI_Config_BusSpeed (void) {
492 /* Initialize with callback, power on and configure SPI bus */
493 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
494 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
495 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
496 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
498 /* Test bus speeds */
499 for (speed=0; speed<SPI_BR_NUM; speed++) {
501 /* Change bus speed with specific control parameter*/
502 TEST_ASSERT (drv->Control(ARM_SPI_SET_BUS_SPEED, SPI_BR[speed]*1000)
506 val = drv->Control(ARM_SPI_GET_BUS_SPEED,0)/1000;
507 if ((uint32_t)val != SPI_BR[speed]) {
508 snprintf(str,sizeof(str),"[WARNING] Specific control set speed: %dkHz, Get speed: %dkHz",SPI_BR[speed], val);
512 /* Change bus speed with general control parameter*/
513 TEST_ASSERT(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)
517 val = drv->Control(ARM_SPI_GET_BUS_SPEED,0)/1000;
518 if ((uint32_t)val != SPI_BR[speed]) {
519 snprintf(str,sizeof(str),"[WARNING] General control set speed: %dkHz, Get speed: %dkHz",SPI_BR[speed], val);
525 /* Power off and uninitialize*/
526 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
527 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
530 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
532 \brief Test case: SPI_Send
534 The test case \b SPI_Send verifies the function \b Send with the sequence:
535 - Initialize with callback
537 - Send using callback
538 - Send without callback
542 void SPI_Send (void) {
545 /* Allocate buffer */
546 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
547 TEST_ASSERT(buffer_out != NULL);
549 /* Initialize with callback, power on and configure SPI bus */
550 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
551 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
552 TEST_ASSERT(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 snprintf(str,sizeof(str),"[FAILED] Fail to send %d bytes",BUFFER[cnt]);
561 TEST_FAIL_MESSAGE(str);
564 /* Send without callback */
565 if (SPI_RunSend_NoCallback(buffer_out, BUFFER[cnt]) != ARM_DRIVER_OK) {
566 snprintf(str,sizeof(str),"[FAILED] Fail to send without callback %d bytes",BUFFER[cnt]);
567 TEST_FAIL_MESSAGE(str);
571 /* Power off and uninitialize*/
572 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
573 TEST_ASSERT(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) {
594 /* Allocate buffer */
595 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
596 TEST_ASSERT(buffer_in != NULL);
598 /* Initialize with callback, power on and configure SPI bus */
599 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
600 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
601 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
602 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
604 /* Receive data chunks */
605 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
607 /* Receive using callback */
608 if (SPI_RunReceive(buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
609 snprintf(str,sizeof(str),"[FAILED] Fail to receive %d bytes",BUFFER[cnt]);
610 TEST_FAIL_MESSAGE(str);
613 /* Receive without callback */
614 if (SPI_RunReceiveNoCallback(buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
615 snprintf(str,sizeof(str),"[FAILED] Fail to receive without callback %d bytes",BUFFER[cnt]);
616 TEST_FAIL_MESSAGE(str);
620 /* Power off and uninitialize*/
621 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
622 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
628 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
630 \brief Test case: SPI_Loopback_CheckBusSpeed
632 The test case \b SPI_Loopback_CheckBusSpeed verifies the \b Control function, configures various bus speeds, and measures
633 the transfer time with this sequence:
634 - Initialize with callback
636 - Change bus speed with specific control parameter
637 - Measure transfer time
641 \note If this test issues errors or warnings, refer to the \ref test_results section for more information.
643 void SPI_Loopback_CheckBusSpeed (void) {
647 uint32_t ticks_measured;
648 uint32_t ticks_expected;
651 /* Allocate buffer */
652 buffer_out = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
653 TEST_ASSERT(buffer_out != NULL);
654 buffer_in = malloc(BUFFER_SIZE_BR*sizeof(buf_t));
655 TEST_ASSERT(buffer_in != NULL);
657 /* Initialize with callback, power on and configure SPI bus */
658 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
659 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
660 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
661 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
663 /* Set Local Loopback */
664 SPI_LOCAL_LOOPBACK();
666 /* Test bus speeds */
667 for (speed=0; speed<SPI_BR_NUM; speed++) {
669 /* Set output buffer with random data */
670 srand(GET_SYSTICK());
671 for (cnt = 0; cnt<BUFFER_SIZE_BR; cnt++) {
672 buffer_out[cnt] = (buf_t)rand()&((1U<<SPI_DATA_BITS)-1U);
675 /* Change bus speed with specific control parameter*/
676 TEST_ASSERT (drv->Control(ARM_SPI_SET_BUS_SPEED, SPI_BR[speed]*1000)
680 val = drv->Control(ARM_SPI_GET_BUS_SPEED,0)/1000;
682 /* Measure transfer time */
683 ticks_measured = GET_SYSTICK();
684 SPI_RunTransfer(buffer_out, buffer_in, BUFFER_SIZE_BR);
685 ticks_measured = GET_SYSTICK() - ticks_measured;
686 ticks_expected = SYSTICK_MICROSEC(BUFFER_SIZE_BR*1000/(uint32_t)val);
687 ticks_expected *= SPI_DATA_BITS;
689 rate = (double)ticks_measured/ticks_expected;
691 if ((rate>(1.0+(double)MIN_BUS_SPEED/100))||(rate<1.0)) {
692 snprintf(str,sizeof(str),"[WARNING] At %dkHz: measured time is %f x expected time", val, rate);
696 /* Check received data against sent data*/
697 if (memcmp(buffer_in, buffer_out, BUFFER_SIZE_BR)!=0) {
698 snprintf(str,sizeof(str),"[FAILED] At %dkHz: fail to check block of %d bytes", val, BUFFER_SIZE_BR);
699 TEST_FAIL_MESSAGE(str);
703 /* Power off and uninitialize*/
704 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
705 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
712 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
714 \brief Test case: SPI_Loopback_Transfer
716 The test case \b SPI_Loopback_Transfer verifies the function \b Transfer with the sequence:
717 - Initialize with callback
720 - Check received data against sent data
724 void SPI_Loopback_Transfer (void) {
726 uint8_t pattern[] = BUFFER_PATTERN;
728 /* Allocate buffer */
729 buffer_out = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
730 TEST_ASSERT(buffer_out != NULL);
731 buffer_in = malloc(BUFFER[BUFFER_NUM-1]*sizeof(buf_t));
732 TEST_ASSERT(buffer_in != NULL);
734 /* Initialize with callback, power on and configure SPI bus */
735 TEST_ASSERT(drv->Initialize(SPI_DrvEvent) == ARM_DRIVER_OK);
736 TEST_ASSERT(drv->PowerControl (ARM_POWER_FULL) == ARM_DRIVER_OK);
737 TEST_ASSERT(drv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_DATA_BITS(SPI_DATA_BITS) |
738 ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_UNUSED, SPI_BR[0]*1000) == ARM_DRIVER_OK);
740 /* Set Local Loopback */
741 SPI_LOCAL_LOOPBACK();
743 /* Set output buffer pattern*/
744 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1];) {
745 for (i = 0; i<ARRAY_SIZE(pattern);) {
746 buffer_out[cnt] = pattern[i++];
747 if (SPI_DATA_BITS>8U) {
748 buffer_out[cnt] |= pattern[i++]<<8U;
750 if (SPI_DATA_BITS>16U) {
751 buffer_out[cnt] |= pattern[i++]<<16U;
752 buffer_out[cnt] |= pattern[i++]<<24U;
754 buffer_out[cnt++] &= (1U<<SPI_DATA_BITS)-1U;
758 /* Transfer data chunks */
759 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
760 /* Clear input buffer */
761 memset(buffer_in,0,BUFFER[cnt]);
762 if (SPI_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
763 snprintf(str,sizeof(str),"[FAILED] Fail to transfer block of %d bytes",BUFFER[cnt]);
764 TEST_FAIL_MESSAGE(str);
766 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
767 snprintf(str,sizeof(str),"[FAILED] Fail to check block of %d bytes",BUFFER[cnt]);
768 TEST_FAIL_MESSAGE(str);
772 /* Set output buffer with random data */
773 srand(GET_SYSTICK());
774 for (cnt = 0; cnt<BUFFER[BUFFER_NUM-1]; cnt++) {
775 buffer_out[cnt] = (buf_t)rand()&((1U<<SPI_DATA_BITS)-1U);
778 /* Transfer data chunks */
779 for (cnt = 0; cnt<BUFFER_NUM; cnt++) {
780 /* Clear input buffer */
781 memset(buffer_in,0,BUFFER[cnt]);
782 if (SPI_RunTransfer(buffer_out, buffer_in, BUFFER[cnt]) != ARM_DRIVER_OK) {
783 snprintf(str,sizeof(str),"[FAILED] Fail to transfer block of %d bytes",BUFFER[cnt]);
784 TEST_FAIL_MESSAGE(str);
786 if (memcmp(buffer_in, buffer_out, BUFFER[cnt])!=0) {
787 snprintf(str,sizeof(str),"[FAILED] Fail to check block of %d bytes",BUFFER[cnt]);
788 TEST_FAIL_MESSAGE(str);
792 /* Power off and uninitialize*/
793 TEST_ASSERT(drv->PowerControl (ARM_POWER_OFF) == ARM_DRIVER_OK);
794 TEST_ASSERT(drv->Uninitialize() == ARM_DRIVER_OK);
804 // end of group spi_funcs