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