1 #include "Driver_SPI.h"
2 #include "cmsis_os.h"                   // ARM::CMSIS:RTOS:Keil RTX
3 
4 
5 void mySPI_Thread(void const *argument);
6 osThreadId tid_mySPI_Thread;
7 
8 
9 /* SPI Driver */
10 extern ARM_DRIVER_SPI Driver_SPI0;
11 
12 
mySPI_callback(uint32_t event)13 void mySPI_callback(uint32_t event)
14 {
15     switch (event)
16     {
17     case ARM_SPI_EVENT_TRANSFER_COMPLETE:
18         /* Success: Wakeup Thread */
19         osSignalSet(tid_mySPI_Thread, 0x01);
20         break;
21     case ARM_SPI_EVENT_DATA_LOST:
22         /*  Occurs in slave mode when data is requested/sent by master
23             but send/receive/transfer operation has not been started
24             and indicates that data is lost. Occurs also in master mode
25             when driver cannot transfer data fast enough. */
26         __breakpoint(0);  /* Error: Call debugger or replace with custom error handling */
27         break;
28     case ARM_SPI_EVENT_MODE_FAULT:
29         /*  Occurs in master mode when Slave Select is deactivated and
30             indicates Master Mode Fault. */
31         __breakpoint(0);  /* Error: Call debugger or replace with custom error handling */
32         break;
33     }
34 }
35 
36 /* Test data buffers */
37 const uint8_t testdata_out[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
38 uint8_t       testdata_in [8];
39 
mySPI_Thread(void const * arg)40 void mySPI_Thread(void const* arg)
41 {
42     ARM_DRIVER_SPI* SPIdrv = &Driver_SPI0;
43     osEvent evt;
44 
45 #ifdef DEBUG
46     ARM_DRIVER_VERSION   version;
47     ARM_SPI_CAPABILITIES drv_capabilities;
48 
49     version = SPIdrv->GetVersion();
50     if (version.api < 0x200) /* requires at minimum API version 2.00 or higher */
51     {                        /* error handling                                 */
52         return;
53     }
54 
55     drv_capabilities = SPIdrv->GetCapabilities();
56     if (drv_capabilities.event_mode_fault == 0)
57     {                        /* error handling */
58         return;
59     }
60 #endif
61 
62     /* Initialize the SPI driver */
63     SPIdrv->Initialize(mySPI_callback);
64     /* Power up the SPI peripheral */
65     SPIdrv->PowerControl(ARM_POWER_FULL);
66     /* Configure the SPI to Master, 8-bit mode @10000 kBits/sec */
67     SPIdrv->Control(ARM_SPI_MODE_MASTER | ARM_SPI_CPOL1_CPHA1 | ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_SW | ARM_SPI_DATA_BITS(8), 10000000);
68 
69     /* SS line = INACTIVE = HIGH */
70     SPIdrv->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE);
71 
72     /* thread loop */
73     while (1)
74     {
75         /* SS line = ACTIVE = LOW */
76         SPIdrv->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_ACTIVE);
77         /* Transmit some data */
78         SPIdrv->Send(testdata_out, sizeof(testdata_out));
79         /* Wait for completion */
80         evt = osSignalWait(0x01, 100);
81         if (evt.status == osEventTimeout) {
82             __breakpoint(0); /* Timeout error: Call debugger */
83         }
84         /* SS line = INACTIVE = HIGH */
85         SPIdrv->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE);
86 
87         /* SS line = ACTIVE = LOW */
88         SPIdrv->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_ACTIVE);
89         /* Receive 8 bytes of reply */
90         SPIdrv->Receive(testdata_in, 8);
91         evt = osSignalWait(0x01, 100);
92         if (evt.status == osEventTimeout) {
93             __breakpoint(0); /* Timeout error: Call debugger */
94         }
95         /* SS line = INACTIVE = HIGH */
96         SPIdrv->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE);
97     }
98 }
99