spi.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. /**
  2. * \file
  3. *
  4. * \brief SAM Serial Peripheral Interface Driver for SAMB
  5. *
  6. * Copyright (C) 2015-2016 Atmel Corporation. All rights reserved.
  7. *
  8. * \asf_license_start
  9. *
  10. * \page License
  11. *
  12. * Redistribution and use in source and binary forms, with or without
  13. * modification, are permitted provided that the following conditions are met:
  14. *
  15. * 1. Redistributions of source code must retain the above copyright notice,
  16. * this list of conditions and the following disclaimer.
  17. *
  18. * 2. Redistributions in binary form must reproduce the above copyright notice,
  19. * this list of conditions and the following disclaimer in the documentation
  20. * and/or other materials provided with the distribution.
  21. *
  22. * 3. The name of Atmel may not be used to endorse or promote products derived
  23. * from this software without specific prior written permission.
  24. *
  25. * 4. This software may only be redistributed and used in connection with an
  26. * Atmel microcontroller product.
  27. *
  28. * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
  29. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  30. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  31. * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
  32. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  34. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  36. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  37. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  38. * POSSIBILITY OF SUCH DAMAGE.
  39. *
  40. * \asf_license_stop
  41. *
  42. */
  43. /*
  44. * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
  45. */
  46. #ifndef SPI_H_INCLUDED
  47. #define SPI_H_INCLUDED
  48. /**
  49. * \defgroup asfdoc_samb_drivers_spi_group SAM Serial Peripheral Interface (SPI) Driver
  50. *
  51. * This driver for Atmel&reg; | SMART ARM-based microcontrollers provides
  52. * an interface for the configuration and management of the module in
  53. * its SPI mode to transfer SPI data frames. The following driver API modes
  54. * are covered by this manual:
  55. *
  56. * - Polled APIs
  57. * \if SPI_CALLBACK_MODE
  58. * - Callback APIs
  59. * \endif
  60. *
  61. * The following peripheral is used by this module:
  62. * - SPI (Serial Peripheral Interface)
  63. *
  64. * The following devices can use this module:
  65. * - Atmel | SMART SAM B11
  66. *
  67. * The outline of this documentation is as follows:
  68. * - \ref asfdoc_samb_drivers_spi_prerequisites
  69. * - \ref asfdoc_samb_drivers_spi_module_overview
  70. * - \ref asfdoc_samb_drivers_spi_special_considerations
  71. * - \ref asfdoc_samb_drivers_spi_extra_info
  72. * - \ref asfdoc_samb_drivers_spi_examples
  73. * - \ref asfdoc_samb_drivers_spi_api_overview
  74. *
  75. * \section asfdoc_samb_drivers_spi_prerequisites Prerequisites
  76. * There are no prerequisites for this module.
  77. *
  78. *
  79. * \section asfdoc_samb_drivers_spi_module_overview Module Overview
  80. * \subsection asfdoc_samb_drivers_spi_bus SPI Bus Connection
  81. * In \ref asfdoc_sam0_spi_connection_example "the figure below", the
  82. * connection between one master and one slave is shown.
  83. *
  84. * \anchor asfdoc_sam0_spi_connection_example
  85. * \image html spi_block_diagram.svg "SPI Block Diagram"
  86. *
  87. * The different lines are as follows:
  88. * - \b MISO Master Input Slave Output. The line where the data is shifted
  89. * out from the slave and into the master.
  90. * - \b MOSI Master Output Slave Input. The line where the data is shifted
  91. * out from the master and into the slave.
  92. * - \b SCK Serial Clock. Generated by the master device.
  93. * - \b SS Slave Select. To initiate a transaction, the master must pull this
  94. * line low.
  95. *
  96. * If the bus consists of several SPI slaves, they can be connected in parallel
  97. * and the SPI master can use general I/O pins to control separate SS lines to
  98. * each slave on the bus.
  99. *
  100. * It is also possible to connect all slaves in series. In this configuration,
  101. * a common SS is provided to \c N slaves, enabling them simultaneously. The
  102. * MISO from the \c N-1 slaves is connected to the MOSI on the next slave. The
  103. * \c N<SUP>th</SUP> slave connects its MISO back to the master. For a
  104. * complete transaction, the master must shift \c N+1 characters.
  105. *
  106. * \subsection asfdoc_samb_drivers_spi_chsize SPI Character Size
  107. * The SPI character size is configurable to eight bits.
  108. *
  109. * \subsection asfdoc_samb_drivers_spi_master_mode Master Mode
  110. * When configured as a master, the SS pin will be configured as an output.
  111. *
  112. * \subsubsection asfdoc_samb_drivers_spi_master_mode_data_transfer Data Transfer
  113. * Writing a character will start the SPI clock generator, and
  114. * the character is transferred to the shift register when the shift
  115. * register is empty.
  116. * Once this is done, a new character can be written.
  117. * As each character is shifted out from the master, a character is shifted in
  118. * from the slave. If the receiver is enabled, the data is moved to the receive
  119. * buffer at the completion of the frame and can be read.
  120. *
  121. * \subsection asfdoc_samb_drivers_spi_slave_mode Slave Mode
  122. * When configured as a slave, the SPI interface will remain inactive with MISO
  123. * tri-stated as long as the SS pin is driven high.
  124. *
  125. * \subsubsection asfdoc_samb_drivers_spi_slave_mode_data_transfer_slave Data Transfer
  126. * The data register can be updated at any time.
  127. * As the SPI slave shift register is clocked by SCK, a minimum of three SCK
  128. * cycles are needed from the time new data is written, until the character is
  129. * ready to be shifted out. If the shift register has not been loaded with
  130. * data, the current contents will be transmitted.
  131. *
  132. * If constant transmission of data is needed in SPI slave mode, the system
  133. * clock should be faster than SCK.
  134. *
  135. * \subsection asfdoc_samb_drivers_spi_data_modes Data Modes
  136. * There are four combinations of SCK phase and polarity with respect to
  137. * serial data. \ref asfdoc_samb_drivers_spi_mode_table "The table below" shows the
  138. * clock polarity (CPOL) and clock phase (CPHA) in the different modes.
  139. * <i>Leading edge</i> is the first clock edge in a clock cycle and
  140. * <i>trailing edge</i> is the last clock edge in a clock cycle.
  141. *
  142. * \anchor asfdoc_samb_drivers_spi_mode_table
  143. * <table>
  144. * <caption>SPI Data Modes</caption>
  145. * <tr>
  146. * <th>Mode</th>
  147. * <th>CPOL</th>
  148. * <th>CPHA</th>
  149. * <th>Leading Edge</th>
  150. * <th>Trailing Edge</th>
  151. * </tr>
  152. * <tr>
  153. * <td> 0 </td>
  154. * <td> 0 </td>
  155. * <td> 0 </td>
  156. * <td> Rising, Sample </td>
  157. * <td> Falling, Setup </td>
  158. * </tr>
  159. * <tr>
  160. * <td> 1 </td>
  161. * <td> 0 </td>
  162. * <td> 1 </td>
  163. * <td> Rising, Setup </td>
  164. * <td> Falling, Sample </td>
  165. * </tr>
  166. * <tr>
  167. * <td> 2 </td>
  168. * <td> 1 </td>
  169. * <td> 0 </td>
  170. * <td> Falling, Sample </td>
  171. * <td> Rising, Setup </td>
  172. * </tr>
  173. * <tr>
  174. * <td> 3 </td>
  175. * <td> 1 </td>
  176. * <td> 1 </td>
  177. * <td> Falling, Setup </td>
  178. * <td> Rising, Sample </td>
  179. * </tr>
  180. * </table>
  181. *
  182. * \section asfdoc_samb_drivers_spi_special_considerations Special Considerations
  183. * The pin MUX settings must be configured properly, as not all settings
  184. * can be used in different modes of operation.
  185. *
  186. * \section asfdoc_samb_drivers_spi_extra_info Extra Information
  187. *
  188. * For extra information, see \ref asfdoc_samb_drivers_spi_extra. This includes:
  189. * - \ref asfdoc_samb_drivers_spi_extra_acronyms
  190. * - \ref asfdoc_samb_drivers_spi_extra_dependencies
  191. * - \ref asfdoc_samb_drivers_spi_extra_errata
  192. * - \ref asfdoc_samb_drivers_spi_extra_history
  193. *
  194. * \section asfdoc_samb_drivers_spi_examples Examples
  195. *
  196. * For a list of examples related to this driver, see
  197. * \ref asfdoc_samb_drivers_spi_exqsg.
  198. *
  199. * \section asfdoc_samb_drivers_spi_api_overview API Overview
  200. * @{
  201. */
  202. #include <stdint.h>
  203. #include <string.h>
  204. #include <compiler.h>
  205. #include <conf_spi.h>
  206. #include <gpio.h>
  207. #include <system_sam_b.h>
  208. #ifdef __cplusplus
  209. extern "C" {
  210. #endif
  211. #if (CONF_SPI_MASTER_ENABLE == false) && (CONF_SPI_SLAVE_ENABLE == false)
  212. #error "Not possible compile SPI driver, invalid driver configuration. Make sure that either/both CONF_SPI_MASTER_ENABLE/CONF_SPI_SLAVE_ENABLE is set to true."
  213. #endif
  214. # ifndef SPI_TIMEOUT
  215. /** SPI timeout value */
  216. # define SPI_TIMEOUT 10000
  217. # endif
  218. # ifndef PINMUX_UNUSED
  219. /** Unused pinmux. */
  220. # define PINMUX_UNUSED 0xFFFFFFFF
  221. # endif
  222. # if SPI_CALLBACK_MODE == true
  223. /** Prototype for the device instance. */
  224. struct spi_module;
  225. /** Type of the callback functions */
  226. typedef void (*spi_callback_t)(struct spi_module *const module);
  227. /**
  228. * \brief SPI Callback enum
  229. *
  230. * Callbacks for SPI callback driver.
  231. *
  232. * \note For slave mode, these callbacks will be called when a transaction
  233. * is ended by the master pulling Slave Select high.
  234. *
  235. */
  236. enum spi_callback {
  237. /** Callback for buffer transmitted */
  238. SPI_CALLBACK_BUFFER_TRANSMITTED,
  239. /** Callback for buffer received */
  240. SPI_CALLBACK_BUFFER_RECEIVED,
  241. /** Callback for buffers transceived */
  242. SPI_CALLBACK_BUFFER_TRANSCEIVED,
  243. /** Callback for error */
  244. SPI_CALLBACK_ERROR,
  245. # if !defined(__DOXYGEN__)
  246. /** Number of available callbacks */
  247. SPI_CALLBACK_N,
  248. # endif
  249. };
  250. # if !defined(__DOXYGEN__)
  251. /** Prototype for the interrupt handler */
  252. extern struct spi_module *_spi_instances[SPI_INST_NUM];
  253. extern void spi_rx0_isr_handler(void);
  254. extern void spi_tx0_isr_handler(void);
  255. extern void spi_rx1_isr_handler(void);
  256. extern void spi_tx1_isr_handler(void);
  257. /**
  258. * \brief SPI transfer directions
  259. */
  260. enum _spi_direction {
  261. /** Transfer direction is read. */
  262. SPI_DIRECTION_READ,
  263. /** Transfer direction is write. */
  264. SPI_DIRECTION_WRITE,
  265. /** Transfer direction is read and write. */
  266. SPI_DIRECTION_BOTH,
  267. /** No transfer. */
  268. SPI_DIRECTION_IDLE,
  269. };
  270. # endif
  271. # endif
  272. /**
  273. * \brief SPI transfer modes enum
  274. *
  275. * SPI transfer mode.
  276. */
  277. enum spi_transfer_mode {
  278. /** Mode 0. Leading edge: rising, sample. Trailing edge: falling, setup */
  279. SPI_TRANSFER_MODE_0 = 0,
  280. /** Mode 1. Leading edge: rising, setup. Trailing edge: falling, sample */
  281. SPI_TRANSFER_MODE_1 = SPI_CONFIGURATION_SCK_PHASE_1,
  282. /** Mode 2. Leading edge: falling, sample. Trailing edge: rising, setup */
  283. SPI_TRANSFER_MODE_2 = SPI_CONFIGURATION_SCK_POLARITY_1,
  284. /** Mode 3. Leading edge: falling, setup. Trailing edge: rising, sample */
  285. SPI_TRANSFER_MODE_3 = SPI_CONFIGURATION_SCK_PHASE_1 | \
  286. SPI_CONFIGURATION_SCK_POLARITY_1,
  287. };
  288. /**
  289. * \brief SPI modes enum
  290. *
  291. * SPI mode selection.
  292. */
  293. enum spi_mode {
  294. /** Master mode */
  295. SPI_MODE_MASTER = 1,
  296. /** Slave mode */
  297. SPI_MODE_SLAVE = 0,
  298. };
  299. /**
  300. * \brief SPI data order enum
  301. *
  302. * SPI data order.
  303. *
  304. */
  305. enum spi_data_order {
  306. /** The MSB of the data is transmitted first */
  307. SPI_DATA_ORDER_MSB = 0,
  308. /** The LSB of the data is transmitted first */
  309. SPI_DATA_ORDER_LSB = SPI_CONFIGURATION_LSB_FIRST_ENABLE_1,
  310. };
  311. /**
  312. * \brief SPI module clock input
  313. *
  314. * SPI module clock.
  315. *
  316. */
  317. enum spi_clock_input {
  318. /** source from clock input 0 26MHz*/
  319. SPI_CLK_INPUT_0 = 0,
  320. /** source from clock input 1 13MHz */
  321. SPI_CLK_INPUT_1,
  322. /** source from clock input 2 6.5MHz*/
  323. SPI_CLK_INPUT_2,
  324. /** source from clock input 3 3MHz*/
  325. SPI_CLK_INPUT_3,
  326. };
  327. /**
  328. * \brief SPI driver software device instance structure.
  329. *
  330. * SPI driver software instance structure, used to retain software state
  331. * information of an associated hardware module instance.
  332. *
  333. * \note The fields of this structure should not be altered by the user
  334. * application; they are reserved for module-internal use only.
  335. */
  336. struct spi_module {
  337. # if !defined(__DOXYGEN__)
  338. /** Hardware module */
  339. Spi *hw;
  340. /** Module lock */
  341. volatile uint8_t locked;
  342. /** SPI mode */
  343. enum spi_mode mode;
  344. /** Transmit dummy data when receiving*/
  345. uint8_t tx_dummy_byte;
  346. #if SPI_CALLBACK_MODE == true
  347. /** Direction of transaction */
  348. volatile enum _spi_direction dir;
  349. /** Array to store callback function pointers in */
  350. spi_callback_t callback[SPI_CALLBACK_N];
  351. /** Buffer pointer to where the next received character will be put */
  352. volatile uint8_t *rx_buffer_ptr;
  353. /** Buffer pointer to where the next character will be transmitted from
  354. **/
  355. volatile uint8_t *tx_buffer_ptr;
  356. /** Remaining characters to receive */
  357. volatile uint16_t remaining_rx_buffer_length;
  358. /** Remaining dummy characters to send when reading */
  359. volatile uint16_t remaining_dummy_buffer_length;
  360. /** Remaining characters to transmit */
  361. volatile uint16_t remaining_tx_buffer_length;
  362. /** Bit mask for callbacks registered */
  363. uint8_t registered_callback;
  364. /** Bit mask for callbacks enabled */
  365. uint8_t enabled_callback;
  366. /** Holds the status of the ongoing or last operation */
  367. volatile enum status_code status;
  368. # endif
  369. # endif
  370. };
  371. /**
  372. * \brief SPI peripheral slave instance structure
  373. *
  374. * SPI peripheral slave software instance structure, used to configure the
  375. * correct SPI transfer mode settings for an attached slave. See
  376. * \ref spi_select_slave.
  377. */
  378. struct spi_slave_inst {
  379. /** Pin to use as Slave Select */
  380. uint8_t ss_pin;
  381. /** Address recognition enabled in slave device */
  382. uint8_t address_enabled;
  383. /** Address of slave device */
  384. uint8_t address;
  385. };
  386. /**
  387. * \brief SPI peripheral slave configuration structure
  388. *
  389. * SPI Peripheral slave configuration structure
  390. */
  391. struct spi_slave_inst_config {
  392. /** Pin to use as Slave Select */
  393. uint8_t ss_pin;
  394. /** Enable address */
  395. bool address_enabled;
  396. /** Address of slave */
  397. uint8_t address;
  398. };
  399. /**
  400. * \brief SPI configuration structure
  401. *
  402. * Configuration structure for an SPI instance. This structure should be
  403. * initialized by the \ref spi_get_config_defaults function before being
  404. * modified by the user application.
  405. */
  406. struct spi_config {
  407. /** SPI mode */
  408. enum spi_mode mode;
  409. /** Data order */
  410. enum spi_data_order data_order;
  411. /** Transfer mode */
  412. enum spi_transfer_mode transfer_mode;
  413. /** clock source to use */
  414. enum spi_clock_input clock_source;
  415. /** clock divider value to use*/
  416. uint8_t clock_divider;
  417. /** SPI PAD pin number */
  418. uint32_t pin_number_pad[4];
  419. /** SPI PAD pinmux selection */
  420. uint32_t pinmux_sel_pad[4];
  421. };
  422. /**
  423. * \name Initialization functions
  424. * @{
  425. */
  426. enum status_code spi_init(
  427. struct spi_module *const module,
  428. Spi *const hw,
  429. const struct spi_config *const config);
  430. void spi_reset(struct spi_module *const module);
  431. void spi_slave_inst_get_config_defaults(
  432. struct spi_slave_inst_config *const config);
  433. void spi_get_config_defaults(struct spi_config *const config);
  434. void spi_attach_slave(
  435. struct spi_slave_inst *const slave,
  436. struct spi_slave_inst_config *const config);
  437. /** @} */
  438. /**
  439. * \name Enable/Disable
  440. * @{
  441. */
  442. void spi_enable(struct spi_module *const module);
  443. void spi_disable(struct spi_module *const module);
  444. /** @} */
  445. /**
  446. * \name Lock/Unlock
  447. * @{
  448. */
  449. enum status_code spi_lock(struct spi_module *const module);
  450. void spi_unlock(struct spi_module *const module);
  451. /** @} */
  452. /**
  453. * \name Read/Write
  454. * @{
  455. */
  456. enum status_code spi_write(
  457. struct spi_module *module,
  458. uint8_t tx_data);
  459. enum status_code spi_write_buffer_wait(
  460. struct spi_module *const module,
  461. uint8_t *tx_data,
  462. uint16_t length);
  463. enum status_code spi_read(
  464. struct spi_module *const module,
  465. uint8_t *rx_data);
  466. enum status_code spi_read_buffer_wait(
  467. struct spi_module *const module,
  468. uint8_t *rx_data,
  469. uint16_t length,
  470. uint8_t dummy);
  471. enum status_code spi_transceive_wait(
  472. struct spi_module *const module,
  473. uint8_t *tx_data,
  474. uint8_t *rx_data);
  475. enum status_code spi_transceive_buffer_wait(
  476. struct spi_module *const module,
  477. uint8_t *tx_data,
  478. uint8_t *rx_data,
  479. uint16_t length);
  480. enum status_code spi_select_slave(
  481. struct spi_module *const module,
  482. struct spi_slave_inst *const slave,
  483. bool select);
  484. /** @} */
  485. /** @}*/
  486. #ifdef __cplusplus
  487. }
  488. #endif
  489. /**
  490. * \page asfdoc_samb_drivers_spi_extra Extra Information for SPI Driver
  491. *
  492. * \section asfdoc_samb_drivers_spi_extra_acronyms Acronyms
  493. * The table below presents the acronyms used in this module:
  494. *
  495. * <table>
  496. * <tr>
  497. * <th>Acronym</th>
  498. * <th>Description</th>
  499. * </tr>
  500. * <tr>
  501. * <td>SPI</td>
  502. * <td>Serial Peripheral Interface</td>
  503. * </tr>
  504. * <tr>
  505. * <td>SCK</td>
  506. * <td>Serial Clock</td>
  507. * </tr>
  508. * <tr>
  509. * <td>MOSI</td>
  510. * <td>Master Output Slave Input</td>
  511. * </tr>
  512. * <tr>
  513. * <td>MISO</td>
  514. * <td>Master Input Slave Output</td>
  515. * </tr>
  516. * <tr>
  517. * <td>SS</td>
  518. * <td>Slave Select</td>
  519. * </tr>
  520. * </table>
  521. *
  522. * \section asfdoc_samb_drivers_spi_extra_dependencies Dependencies
  523. * There are no dependencies related to this driver.
  524. *
  525. *
  526. * \section asfdoc_samb_drivers_spi_extra_errata Errata
  527. * There are no errata related to this driver.
  528. *
  529. * \section asfdoc_samb_drivers_spi_extra_history Module History
  530. * An overview of the module history is presented in the table below, with
  531. * details on the enhancements and fixes made to the module since its first
  532. * release. The current version of this corresponds to the newest version in
  533. * the table.
  534. *
  535. * <table>
  536. * <tr>
  537. * <th>Changelog</th>
  538. * </tr>
  539. * <tr>
  540. * <td>Initial Release</td>
  541. * </tr>
  542. * </table>
  543. */
  544. /**
  545. * \page asfdoc_samb_drivers_spi_exqsg Examples for SPI Driver
  546. *
  547. * This is a list of the available Quick Start guides (QSGs) and example
  548. * applications for \ref asfdoc_samb_drivers_spi_group. QSGs are simple examples with
  549. * step-by-step instructions to configure and use this driver in a selection of
  550. * use cases. Note that QSGs can be compiled as a standalone application or be
  551. * added to the user application.
  552. *
  553. * - \subpage asfdoc_samb_spi_master_basic_use
  554. * - \subpage asfdoc_samb_spi_slave_basic_use
  555. * \if SPI_CALLBACK_MODE
  556. * - \subpage asfdoc_samb_spi_master_callback_use
  557. * - \subpage asfdoc_samb_spi_slave_callback_use
  558. * \endif
  559. */
  560. /**
  561. *
  562. * \page asfdoc_samb_drivers_spi_document_revision_history Document Revision History
  563. *
  564. * <table>
  565. * <tr>
  566. * <th>Doc. Rev.</td>
  567. * <th>Date</td>
  568. * <th>Comments</td>
  569. * </tr>
  570. * <tr>
  571. * <td>A</td>
  572. * <td>09/2015</td>
  573. * <td>Initial release</td>
  574. * </tr>
  575. * </table>
  576. */
  577. #endif //SPI_H_INCLUDED