MCUXpresso_LPC55S69/docs/MCUXpresso SDK API Referenc.../a00249.html

236 lines
16 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>MCUXpresso SDK API Reference Manual: SPI: Serial Peripheral Interface Driver</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="customdoxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="fs_logo.gif"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">MCUXpresso SDK API Reference Manual
&#160;<span id="projectnumber">Rev 2.15.000</span>
</div>
<div id="projectbrief">NXP Semiconductors</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>API&#160;Reference</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('a00249.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Pages</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="summary">
<a href="#groups">Modules</a> </div>
<div class="headertitle">
<div class="title">SPI: Serial Peripheral Interface Driver</div> </div>
</div><!--header-->
<div class="contents">
<a name="details" id="details"></a><h2 class="groupheader">Overview</h2>
<p>SPI driver includes functional APIs and transactional APIs.</p>
<p>Functional APIs are feature/property target low level APIs. Functional APIs can be used for SPI initialization/configuration/operation for optimization/customization purpose. Using the functional API requires the knowledge of the SPI peripheral and how to organize functional APIs to meet the application requirements. All functional API use the peripheral base address as the first parameter. SPI functional operation groups provide the functional API set.</p>
<p>Transactional APIs are transaction target high level APIs. Transactional APIs can be used to enable the peripheral and in the application if the code size and performance of transactional APIs satisfy the requirements. If the code size and performance are a critical requirement, see the transactional API implementation and write a custom code. All transactional APIs use the spi_handle_t as the first parameter. Initialize the handle by calling the SPI_MasterTransferCreateHandle() or SPI_SlaveTransferCreateHandle() API.</p>
<p>Transactional APIs support asynchronous transfer. This means that the functions SPI_MasterTransferNonBlocking() and SPI_SlaveTransferNonBlocking() set up the interrupt for data transfer. When the transfer completes, the upper layer is notified through a callback function with the kStatus_SPI_Idle status.</p>
<h1><a class="anchor" id="SPICase"></a>
Typical use case</h1>
<h2><a class="anchor" id="SPICaseInterrupt"></a>
SPI master transfer using an interrupt method</h2>
<div class="fragment"><div class="line"><span class="preprocessor">#define BUFFER_LEN (64)</span></div>
<div class="line"><span class="preprocessor"></span><a class="code" href="a00059.html#a00429">spi_master_handle_t</a> spiHandle;</div>
<div class="line"><a class="code" href="a00059.html#a00428">spi_master_config_t</a> masterConfig;</div>
<div class="line"><a class="code" href="a00059.html#a00431">spi_transfer_t</a> xfer;</div>
<div class="line"><span class="keyword">volatile</span> <span class="keywordtype">bool</span> isFinished = <span class="keyword">false</span>;</div>
<div class="line"></div>
<div class="line"><span class="keyword">const</span> uint8_t sendData[BUFFER_LEN] = [......];</div>
<div class="line">uint8_t receiveBuff[BUFFER_LEN];</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> SPI_UserCallback(SPI_Type *base, <a class="code" href="a00059.html#a00429">spi_master_handle_t</a> *handle, <a class="code" href="a00242.html#gaaabdaf7ee58ca7269bd4bf24efcde092">status_t</a> status, <span class="keywordtype">void</span> *userData)</div>
<div class="line">{</div>
<div class="line"> isFinished = <span class="keyword">true</span>;</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> main(<span class="keywordtype">void</span>)</div>
<div class="line">{</div>
<div class="line"> <span class="comment">//...</span></div>
<div class="line"></div>
<div class="line"> SPI_MasterGetDefaultConfig(&amp;masterConfig);</div>
<div class="line"></div>
<div class="line"> SPI_MasterInit(SPI0, &amp;masterConfig, srcClock_Hz);</div>
<div class="line"> SPI_MasterTransferCreateHandle(SPI0, &amp;spiHandle, SPI_UserCallback, NULL);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Prepare to send.</span></div>
<div class="line"> xfer.<a class="code" href="a00059.html#a4c9897ae5dd550dba2db4a5bc4beb00e">txData</a> = sendData;</div>
<div class="line"> xfer.<a class="code" href="a00059.html#a747148e84f9c242b274a022aed7a0555">rxData</a> = receiveBuff;</div>
<div class="line"> xfer.<a class="code" href="a00059.html#a79e2b8992abc1795158494ee18ad4473">dataSize</a> = <span class="keyword">sizeof</span>(sendData);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Send out.</span></div>
<div class="line"> SPI_MasterTransferNonBlocking(SPI0, &amp;spiHandle, &amp;xfer);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Wait send finished.</span></div>
<div class="line"> <span class="keywordflow">while</span> (!isFinished)</div>
<div class="line"> {</div>
<div class="line"> }</div>
<div class="line"></div>
<div class="line"> <span class="comment">// ...</span></div>
<div class="line">}</div>
</div><!-- fragment --><h2><a class="anchor" id="SPICaseDma"></a>
SPI Send/receive using a DMA method</h2>
<div class="fragment"><div class="line"><span class="preprocessor">#define BUFFER_LEN (64)</span></div>
<div class="line"><span class="preprocessor"></span><a class="code" href="a00060.html#a00426">spi_dma_handle_t</a> spiHandle;</div>
<div class="line"><a class="code" href="a00017.html#a00319">dma_handle_t</a> g_spiTxDmaHandle;</div>
<div class="line"><a class="code" href="a00017.html#a00319">dma_handle_t</a> g_spiRxDmaHandle;</div>
<div class="line"><a class="code" href="a00059.html#a00424">spi_config_t</a> masterConfig;</div>
<div class="line"><a class="code" href="a00059.html#a00431">spi_transfer_t</a> xfer;</div>
<div class="line"><span class="keyword">volatile</span> <span class="keywordtype">bool</span> isFinished;</div>
<div class="line"></div>
<div class="line">uint8_t sendData[BUFFER_LEN] = ...;</div>
<div class="line">uint8_t receiveBuff[BUFFER_LEN];</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> SPI_UserCallback(SPI_Type *base, <a class="code" href="a00060.html#a00426">spi_dma_handle_t</a> *handle, <a class="code" href="a00242.html#gaaabdaf7ee58ca7269bd4bf24efcde092">status_t</a> status, <span class="keywordtype">void</span> *userData)</div>
<div class="line">{</div>
<div class="line"> isFinished = <span class="keyword">true</span>;</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> main(<span class="keywordtype">void</span>)</div>
<div class="line">{</div>
<div class="line"> <span class="comment">//...</span></div>
<div class="line"></div>
<div class="line"> <span class="comment">// Initialize DMA peripheral</span></div>
<div class="line"> <a class="code" href="a00017.html#gade1b5efa61054ce538b37b181dd075bb">DMA_Init</a>(DMA0);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Initialize SPI peripheral</span></div>
<div class="line"> SPI_MasterGetDefaultConfig(&amp;masterConfig);</div>
<div class="line"> masterConfig.sselNum = SPI_SSEL;</div>
<div class="line"> SPI_MasterInit(SPI0, &amp;masterConfig, srcClock_Hz);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Enable DMA channels connected to SPI0 Tx/SPI0 Rx request lines</span></div>
<div class="line"> <a class="code" href="a00017.html#gaa0293771d55ee1a7c42a8ffecb0728e7">DMA_EnableChannel</a>(SPI0, SPI_MASTER_TX_CHANNEL);</div>
<div class="line"> <a class="code" href="a00017.html#gaa0293771d55ee1a7c42a8ffecb0728e7">DMA_EnableChannel</a>(SPI0, SPI_MASTER_RX_CHANNEL);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Set DMA channels priority</span></div>
<div class="line"> <a class="code" href="a00017.html#gad8ae76fc5d858b97de3362100af86df6">DMA_SetChannelPriority</a>(SPI0, SPI_MASTER_TX_CHANNEL, <a class="code" href="a00017.html#gga67f9174a3cb49946d2b67b0e23aa2e83a8615d84237aa24c16fdc1675cc932efb">kDMA_ChannelPriority3</a>);</div>
<div class="line"> <a class="code" href="a00017.html#gad8ae76fc5d858b97de3362100af86df6">DMA_SetChannelPriority</a>(SPI0, SPI_MASTER_RX_CHANNEL, <a class="code" href="a00017.html#gga67f9174a3cb49946d2b67b0e23aa2e83a259e4e6cf7b6b79608abbe1769e262fe">kDMA_ChannelPriority2</a>);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Creates the DMA handle.</span></div>
<div class="line"> <a class="code" href="a00017.html#ga5354ff2c0c1ec53e2cbd712169fc5558">DMA_CreateHandle</a>(&amp;masterTxHandle, SPI0, SPI_MASTER_TX_CHANNEL);</div>
<div class="line"> <a class="code" href="a00017.html#ga5354ff2c0c1ec53e2cbd712169fc5558">DMA_CreateHandle</a>(&amp;masterRxHandle, SPI0, SPI_MASTER_RX_CHANNEL);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Create SPI DMA handle</span></div>
<div class="line"> <a class="code" href="a00060.html#gae8aa0229e688aa1b88185d5e9e7bf0b8">SPI_MasterTransferCreateHandleDMA</a>(SPI0, spiHandle, SPI_UserCallback, NULL, &amp;g_spiTxDmaHandle, &amp;g_spiRxDmaHandle);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Prepares to send.</span></div>
<div class="line"> xfer.<a class="code" href="a00059.html#a4c9897ae5dd550dba2db4a5bc4beb00e">txData</a> = sendData;</div>
<div class="line"> xfer.<a class="code" href="a00059.html#a747148e84f9c242b274a022aed7a0555">rxData</a> = receiveBuff;</div>
<div class="line"> xfer.<a class="code" href="a00059.html#a79e2b8992abc1795158494ee18ad4473">dataSize</a> = <span class="keyword">sizeof</span>(sendData);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Sends out.</span></div>
<div class="line"> <a class="code" href="a00060.html#ga2bcf43f1d6908810b6b41d2d87bda3a9">SPI_MasterTransferDMA</a>(SPI0, &amp;spiHandle, &amp;xfer);</div>
<div class="line"></div>
<div class="line"> <span class="comment">// Waits for send to complete.</span></div>
<div class="line"> <span class="keywordflow">while</span> (!isFinished)</div>
<div class="line"> {</div>
<div class="line"> }</div>
<div class="line"></div>
<div class="line"> <span class="comment">// ...</span></div>
<div class="line">}</div>
</div><!-- fragment --> <table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="groups"></a>
Modules</h2></td></tr>
<tr class="memitem:a00250"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html">SPI CMSIS driver</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a00060"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00060.html">SPI DMA Driver</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a00059"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00059.html">SPI Driver</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.5-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul class="foot">
<li class="footer">&copy; 2016 NXP Semiconductors. All rights reserved.
</li>
</ul>
</div>
</body>
</html>