1 #include "Driver_SPI.h"
2 #include "cmsis_os.h" // ARM::CMSIS:RTOS:Keil RTX
5 void mySPI_Thread(void const *argument);
6 osThreadId tid_mySPI_Thread;
10 extern ARM_DRIVER_SPI Driver_SPI0;
13 void mySPI_callback(uint32_t event)
17 case ARM_SPI_EVENT_TRANSFER_COMPLETE:
18 /* Success: Wakeup Thread */
19 osSignalSet(tid_mySPI_Thread, 0x01);
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 */
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 */
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];
40 void mySPI_Thread(void const* arg)
42 ARM_DRIVER_SPI* SPIdrv = &Driver_SPI0;
46 ARM_DRIVER_VERSION version;
47 ARM_SPI_CAPABILITIES drv_capabilities;
49 version = SPIdrv->GetVersion();
50 if (version.api < 0x200) /* requires at minimum API version 2.00 or higher */
51 { /* error handling */
55 drv_capabilities = SPIdrv->GetCapabilities();
56 if (drv_capabilities.event_mode_fault == 0)
57 { /* error handling */
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);
69 /* SS line = INACTIVE = HIGH */
70 SPIdrv->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE);
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 */
84 /* SS line = INACTIVE = HIGH */
85 SPIdrv->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE);
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 */
95 /* SS line = INACTIVE = HIGH */
96 SPIdrv->Control(ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE);