mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 186:707f6e361f3e 1 /**
Anna Bridge 186:707f6e361f3e 2 * @file
Anna Bridge 186:707f6e361f3e 3 * @brief SPI execute in place driver.
Anna Bridge 186:707f6e361f3e 4 */
Anna Bridge 186:707f6e361f3e 5 /* *****************************************************************************
Anna Bridge 186:707f6e361f3e 6 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
Anna Bridge 186:707f6e361f3e 7 *
Anna Bridge 186:707f6e361f3e 8 * Permission is hereby granted, free of charge, to any person obtaining a
Anna Bridge 186:707f6e361f3e 9 * copy of this software and associated documentation files (the "Software"),
Anna Bridge 186:707f6e361f3e 10 * to deal in the Software without restriction, including without limitation
Anna Bridge 186:707f6e361f3e 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Anna Bridge 186:707f6e361f3e 12 * and/or sell copies of the Software, and to permit persons to whom the
Anna Bridge 186:707f6e361f3e 13 * Software is furnished to do so, subject to the following conditions:
Anna Bridge 186:707f6e361f3e 14 *
Anna Bridge 186:707f6e361f3e 15 * The above copyright notice and this permission notice shall be included
Anna Bridge 186:707f6e361f3e 16 * in all copies or substantial portions of the Software.
Anna Bridge 186:707f6e361f3e 17 *
Anna Bridge 186:707f6e361f3e 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Anna Bridge 186:707f6e361f3e 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Anna Bridge 186:707f6e361f3e 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Anna Bridge 186:707f6e361f3e 21 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Anna Bridge 186:707f6e361f3e 22 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Anna Bridge 186:707f6e361f3e 23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Anna Bridge 186:707f6e361f3e 24 * OTHER DEALINGS IN THE SOFTWARE.
Anna Bridge 186:707f6e361f3e 25 *
Anna Bridge 186:707f6e361f3e 26 * Except as contained in this notice, the name of Maxim Integrated
Anna Bridge 186:707f6e361f3e 27 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Anna Bridge 186:707f6e361f3e 28 * Products, Inc. Branding Policy.
Anna Bridge 186:707f6e361f3e 29 *
Anna Bridge 186:707f6e361f3e 30 * The mere transfer of this software does not imply any licenses
Anna Bridge 186:707f6e361f3e 31 * of trade secrets, proprietary technology, copyrights, patents,
Anna Bridge 186:707f6e361f3e 32 * trademarks, maskwork rights, or any other form of intellectual
Anna Bridge 186:707f6e361f3e 33 * property whatsoever. Maxim Integrated Products, Inc. retains all
Anna Bridge 186:707f6e361f3e 34 * ownership rights.
Anna Bridge 186:707f6e361f3e 35 *
Anna Bridge 186:707f6e361f3e 36 * $Date: 2016-09-08 17:31:41 -0500 (Thu, 08 Sep 2016) $
Anna Bridge 186:707f6e361f3e 37 * $Revision: 24323 $
Anna Bridge 186:707f6e361f3e 38 *
Anna Bridge 186:707f6e361f3e 39 **************************************************************************** */
Anna Bridge 186:707f6e361f3e 40
Anna Bridge 186:707f6e361f3e 41 /* **** Includes **** */
Anna Bridge 186:707f6e361f3e 42 #include <stddef.h>
Anna Bridge 186:707f6e361f3e 43 #include "mxc_config.h"
Anna Bridge 186:707f6e361f3e 44 #include "mxc_assert.h"
Anna Bridge 186:707f6e361f3e 45 #include "spix.h"
Anna Bridge 186:707f6e361f3e 46 #include "spix_regs.h"
Anna Bridge 186:707f6e361f3e 47
Anna Bridge 186:707f6e361f3e 48 /**
Anna Bridge 186:707f6e361f3e 49 * @ingroup spix
Anna Bridge 186:707f6e361f3e 50 * @{
Anna Bridge 186:707f6e361f3e 51 */
Anna Bridge 186:707f6e361f3e 52
Anna Bridge 186:707f6e361f3e 53 /* **** Definitions **** */
Anna Bridge 186:707f6e361f3e 54 #define CMD_CLOCKS 8
Anna Bridge 186:707f6e361f3e 55 #define ADDR_3BYTE_CLOCKS 24
Anna Bridge 186:707f6e361f3e 56 #define ADDR_4BYTE_CLOCKS 32
Anna Bridge 186:707f6e361f3e 57
Anna Bridge 186:707f6e361f3e 58 /***** Globals *****/
Anna Bridge 186:707f6e361f3e 59
Anna Bridge 186:707f6e361f3e 60 /***** Functions *****/
Anna Bridge 186:707f6e361f3e 61
Anna Bridge 186:707f6e361f3e 62 /******************************************************************************/
Anna Bridge 186:707f6e361f3e 63 #if defined ( __GNUC__ )
Anna Bridge 186:707f6e361f3e 64 #undef IAR_SPIX_PRAGMA //Make sure this is not defined for GCC
Anna Bridge 186:707f6e361f3e 65 #endif
Anna Bridge 186:707f6e361f3e 66
Anna Bridge 186:707f6e361f3e 67 #if IAR_SPIX_PRAGMA
Anna Bridge 186:707f6e361f3e 68 // IAR memory section declaration for the SPIX functions to be loaded in RAM.
Anna Bridge 186:707f6e361f3e 69 #pragma section=".spix_config"
Anna Bridge 186:707f6e361f3e 70 #endif
Anna Bridge 186:707f6e361f3e 71
Anna Bridge 186:707f6e361f3e 72 #if(MXC_SPIX_REV == 0)
Anna Bridge 186:707f6e361f3e 73
Anna Bridge 186:707f6e361f3e 74 #if defined ( __GNUC__ )
Anna Bridge 186:707f6e361f3e 75 __attribute__ ((section(".spix_config"), noinline))
Anna Bridge 186:707f6e361f3e 76 #endif /* __GNUC */
Anna Bridge 186:707f6e361f3e 77
Anna Bridge 186:707f6e361f3e 78 #if IAR_SPIX_PRAGMA
Anna Bridge 186:707f6e361f3e 79 #pragma location=".spix_config" // IAR locate function in RAM section .spix_config
Anna Bridge 186:707f6e361f3e 80 #pragma optimize=no_inline // IAR no inline optimization on this function
Anna Bridge 186:707f6e361f3e 81 #endif /* IAR_PRAGMA */
Anna Bridge 186:707f6e361f3e 82
Anna Bridge 186:707f6e361f3e 83 static void SPIX_UpdateFBIgnore()
Anna Bridge 186:707f6e361f3e 84 {
Anna Bridge 186:707f6e361f3e 85 // Update the feedback ignore clocks
Anna Bridge 186:707f6e361f3e 86 uint8_t clocks = 0;
Anna Bridge 186:707f6e361f3e 87 uint8_t no_cmd_clocks = 0;
Anna Bridge 186:707f6e361f3e 88
Anna Bridge 186:707f6e361f3e 89 // Adjust the clocks for the command
Anna Bridge 186:707f6e361f3e 90 if((MXC_SPIX->fetch_ctrl & MXC_F_SPIX_FETCH_CTRL_CMD_WIDTH) ==
Anna Bridge 186:707f6e361f3e 91 MXC_S_SPIX_FETCH_CTRL_CMD_WIDTH_QUAD_IO) {
Anna Bridge 186:707f6e361f3e 92
Anna Bridge 186:707f6e361f3e 93 clocks += CMD_CLOCKS/4;
Anna Bridge 186:707f6e361f3e 94 } else if((MXC_SPIX->fetch_ctrl & MXC_F_SPIX_FETCH_CTRL_CMD_WIDTH) ==
Anna Bridge 186:707f6e361f3e 95 MXC_S_SPIX_FETCH_CTRL_CMD_WIDTH_DUAL_IO) {
Anna Bridge 186:707f6e361f3e 96
Anna Bridge 186:707f6e361f3e 97 clocks += CMD_CLOCKS/2;
Anna Bridge 186:707f6e361f3e 98 } else {
Anna Bridge 186:707f6e361f3e 99
Anna Bridge 186:707f6e361f3e 100 clocks += CMD_CLOCKS;
Anna Bridge 186:707f6e361f3e 101 }
Anna Bridge 186:707f6e361f3e 102
Anna Bridge 186:707f6e361f3e 103 // Adjust the clocks for the address
Anna Bridge 186:707f6e361f3e 104 if((MXC_SPIX->fetch_ctrl & MXC_F_SPIX_FETCH_CTRL_ADDR_WIDTH) ==
Anna Bridge 186:707f6e361f3e 105 MXC_S_SPIX_FETCH_CTRL_ADDR_WIDTH_QUAD_IO) {
Anna Bridge 186:707f6e361f3e 106
Anna Bridge 186:707f6e361f3e 107 if(MXC_SPIX->fetch_ctrl & MXC_F_SPIX_FETCH_CTRL_FOUR_BYTE_ADDR) {
Anna Bridge 186:707f6e361f3e 108 clocks += ADDR_4BYTE_CLOCKS/4;
Anna Bridge 186:707f6e361f3e 109 no_cmd_clocks += ADDR_4BYTE_CLOCKS/4;
Anna Bridge 186:707f6e361f3e 110 } else {
Anna Bridge 186:707f6e361f3e 111 clocks += ADDR_3BYTE_CLOCKS/4;
Anna Bridge 186:707f6e361f3e 112 no_cmd_clocks += ADDR_3BYTE_CLOCKS/4;
Anna Bridge 186:707f6e361f3e 113 }
Anna Bridge 186:707f6e361f3e 114
Anna Bridge 186:707f6e361f3e 115 } else if((MXC_SPIX->fetch_ctrl & MXC_F_SPIX_FETCH_CTRL_ADDR_WIDTH) ==
Anna Bridge 186:707f6e361f3e 116 MXC_S_SPIX_FETCH_CTRL_ADDR_WIDTH_DUAL_IO) {
Anna Bridge 186:707f6e361f3e 117
Anna Bridge 186:707f6e361f3e 118 if(MXC_SPIX->fetch_ctrl & MXC_F_SPIX_FETCH_CTRL_FOUR_BYTE_ADDR) {
Anna Bridge 186:707f6e361f3e 119 clocks += ADDR_4BYTE_CLOCKS/2;
Anna Bridge 186:707f6e361f3e 120 no_cmd_clocks += ADDR_4BYTE_CLOCKS/2;
Anna Bridge 186:707f6e361f3e 121 } else {
Anna Bridge 186:707f6e361f3e 122 clocks += ADDR_3BYTE_CLOCKS/2;
Anna Bridge 186:707f6e361f3e 123 no_cmd_clocks += ADDR_3BYTE_CLOCKS/2;
Anna Bridge 186:707f6e361f3e 124 }
Anna Bridge 186:707f6e361f3e 125 } else {
Anna Bridge 186:707f6e361f3e 126
Anna Bridge 186:707f6e361f3e 127 if(MXC_SPIX->fetch_ctrl & MXC_F_SPIX_FETCH_CTRL_FOUR_BYTE_ADDR) {
Anna Bridge 186:707f6e361f3e 128 clocks += ADDR_4BYTE_CLOCKS;
Anna Bridge 186:707f6e361f3e 129 no_cmd_clocks += ADDR_4BYTE_CLOCKS;
Anna Bridge 186:707f6e361f3e 130 } else {
Anna Bridge 186:707f6e361f3e 131 clocks += ADDR_3BYTE_CLOCKS;
Anna Bridge 186:707f6e361f3e 132 no_cmd_clocks += ADDR_3BYTE_CLOCKS;
Anna Bridge 186:707f6e361f3e 133 }
Anna Bridge 186:707f6e361f3e 134 }
Anna Bridge 186:707f6e361f3e 135
Anna Bridge 186:707f6e361f3e 136 // Adjust for the mode clocks
Anna Bridge 186:707f6e361f3e 137 clocks += ((MXC_SPIX->mode_ctrl & MXC_F_SPIX_MODE_CTRL_MODE_CLOCKS) >>
Anna Bridge 186:707f6e361f3e 138 MXC_F_SPIX_MODE_CTRL_MODE_CLOCKS_POS);
Anna Bridge 186:707f6e361f3e 139
Anna Bridge 186:707f6e361f3e 140 // Set the FB Ignore clocks
Anna Bridge 186:707f6e361f3e 141 MXC_SPIX->sck_fb_ctrl = ((MXC_SPIX->sck_fb_ctrl & ~MXC_F_SPIX_SCK_FB_CTRL_IGNORE_CLKS) |
Anna Bridge 186:707f6e361f3e 142 (clocks << MXC_F_SPIX_SCK_FB_CTRL_IGNORE_CLKS_POS));
Anna Bridge 186:707f6e361f3e 143
Anna Bridge 186:707f6e361f3e 144 MXC_SPIX->sck_fb_ctrl = ((MXC_SPIX->sck_fb_ctrl & ~MXC_F_SPIX_SCK_FB_CTRL_IGNORE_CLKS_NO_CMD) |
Anna Bridge 186:707f6e361f3e 145 (no_cmd_clocks << MXC_F_SPIX_SCK_FB_CTRL_IGNORE_CLKS_NO_CMD_POS));
Anna Bridge 186:707f6e361f3e 146 }
Anna Bridge 186:707f6e361f3e 147 #endif /* MXC_SPIX_REV==0 */
Anna Bridge 186:707f6e361f3e 148
Anna Bridge 186:707f6e361f3e 149 /******************************************************************************/
Anna Bridge 186:707f6e361f3e 150 #if defined ( __GNUC__ )
Anna Bridge 186:707f6e361f3e 151 __attribute__ ((section(".spix_config"), noinline))
Anna Bridge 186:707f6e361f3e 152 #endif /* __GNUC */
Anna Bridge 186:707f6e361f3e 153
Anna Bridge 186:707f6e361f3e 154 #if IAR_SPIX_PRAGMA
Anna Bridge 186:707f6e361f3e 155 #pragma location=".spix_config" // IAR locate function in RAM section .spix_config
Anna Bridge 186:707f6e361f3e 156 #pragma optimize=no_inline // IAR no inline optimization on this function
Anna Bridge 186:707f6e361f3e 157 #endif /* IAR_SPIX_PRAGMA */
Anna Bridge 186:707f6e361f3e 158 int SPIX_ConfigClock(const sys_cfg_spix_t *sys_cfg, uint32_t baud, uint8_t sample)
Anna Bridge 186:707f6e361f3e 159 {
Anna Bridge 186:707f6e361f3e 160 int err;
Anna Bridge 186:707f6e361f3e 161 uint32_t spix_clk, clocks;
Anna Bridge 186:707f6e361f3e 162
Anna Bridge 186:707f6e361f3e 163 // Check the input parameters
Anna Bridge 186:707f6e361f3e 164 if(sys_cfg == NULL) {
Anna Bridge 186:707f6e361f3e 165 return E_NULL_PTR;
Anna Bridge 186:707f6e361f3e 166 }
Anna Bridge 186:707f6e361f3e 167
Anna Bridge 186:707f6e361f3e 168 // Set system level configurations
Anna Bridge 186:707f6e361f3e 169 if ((err = SYS_SPIX_Init(sys_cfg, baud)) != E_NO_ERROR) {
Anna Bridge 186:707f6e361f3e 170 return err;
Anna Bridge 186:707f6e361f3e 171 }
Anna Bridge 186:707f6e361f3e 172
Anna Bridge 186:707f6e361f3e 173 // Configure the mode and baud
Anna Bridge 186:707f6e361f3e 174 spix_clk = SYS_SPIX_GetFreq();
Anna Bridge 186:707f6e361f3e 175 if(spix_clk <= 0) {
Anna Bridge 186:707f6e361f3e 176 return E_UNINITIALIZED;
Anna Bridge 186:707f6e361f3e 177 }
Anna Bridge 186:707f6e361f3e 178
Anna Bridge 186:707f6e361f3e 179 // Make sure that we can generate this frequency
Anna Bridge 186:707f6e361f3e 180 clocks = (spix_clk / (2*baud));
Anna Bridge 186:707f6e361f3e 181 if((clocks <= 0) || (clocks >= 0x10)) {
Anna Bridge 186:707f6e361f3e 182 return E_BAD_PARAM;
Anna Bridge 186:707f6e361f3e 183 }
Anna Bridge 186:707f6e361f3e 184
Anna Bridge 186:707f6e361f3e 185 // Set the baud
Anna Bridge 186:707f6e361f3e 186 MXC_SPIX->master_cfg = ((MXC_SPIX->master_cfg &
Anna Bridge 186:707f6e361f3e 187 ~(MXC_F_SPIX_MASTER_CFG_SCK_HI_CLK | MXC_F_SPIX_MASTER_CFG_SCK_LO_CLK)) |
Anna Bridge 186:707f6e361f3e 188 (clocks << MXC_F_SPIX_MASTER_CFG_SCK_HI_CLK_POS) |
Anna Bridge 186:707f6e361f3e 189 (clocks << MXC_F_SPIX_MASTER_CFG_SCK_LO_CLK_POS));
Anna Bridge 186:707f6e361f3e 190
Anna Bridge 186:707f6e361f3e 191 if(sample != 0) {
Anna Bridge 186:707f6e361f3e 192 // Use sample mode
Anna Bridge 186:707f6e361f3e 193 MXC_SPIX->master_cfg = ((MXC_SPIX->master_cfg & ~MXC_F_SPIX_MASTER_CFG_SDIO_SAMPLE_POINT) |
Anna Bridge 186:707f6e361f3e 194 (sample << MXC_F_SPIX_MASTER_CFG_SDIO_SAMPLE_POINT_POS));
Anna Bridge 186:707f6e361f3e 195
Anna Bridge 186:707f6e361f3e 196 MXC_SPIX->sck_fb_ctrl &= ~(MXC_F_SPIX_SCK_FB_CTRL_ENABLE_SCK_FB_MODE |
Anna Bridge 186:707f6e361f3e 197 MXC_F_SPIX_SCK_FB_CTRL_INVERT_SCK_FB_CLK);
Anna Bridge 186:707f6e361f3e 198 } else {
Anna Bridge 186:707f6e361f3e 199 // Use Feedback mode
Anna Bridge 186:707f6e361f3e 200 MXC_SPIX->master_cfg &= ~(MXC_F_SPIX_MASTER_CFG_SDIO_SAMPLE_POINT);
Anna Bridge 186:707f6e361f3e 201
Anna Bridge 186:707f6e361f3e 202 MXC_SPIX->sck_fb_ctrl |= (MXC_F_SPIX_SCK_FB_CTRL_ENABLE_SCK_FB_MODE |
Anna Bridge 186:707f6e361f3e 203 MXC_F_SPIX_SCK_FB_CTRL_INVERT_SCK_FB_CLK);
Anna Bridge 186:707f6e361f3e 204
Anna Bridge 186:707f6e361f3e 205
Anna Bridge 186:707f6e361f3e 206 #if(MXC_SPIX_REV == 0)
Anna Bridge 186:707f6e361f3e 207 SPIX_UpdateFBIgnore();
Anna Bridge 186:707f6e361f3e 208 #endif
Anna Bridge 186:707f6e361f3e 209 }
Anna Bridge 186:707f6e361f3e 210
Anna Bridge 186:707f6e361f3e 211 return E_NO_ERROR;
Anna Bridge 186:707f6e361f3e 212 }
Anna Bridge 186:707f6e361f3e 213
Anna Bridge 186:707f6e361f3e 214 /******************************************************************************/
Anna Bridge 186:707f6e361f3e 215 #if defined ( __GNUC__ )
Anna Bridge 186:707f6e361f3e 216 __attribute__ ((section(".spix_config"), noinline))
Anna Bridge 186:707f6e361f3e 217 #endif /* __GNUC */
Anna Bridge 186:707f6e361f3e 218
Anna Bridge 186:707f6e361f3e 219 #if IAR_SPIX_PRAGMA
Anna Bridge 186:707f6e361f3e 220 #pragma location=".spix_config" // IAR locate function in RAM section .spix_config
Anna Bridge 186:707f6e361f3e 221 #pragma optimize=no_inline // IAR no inline optimization on this function
Anna Bridge 186:707f6e361f3e 222 #endif /* IAR_SPIX_PRAGMA */
Anna Bridge 186:707f6e361f3e 223
Anna Bridge 186:707f6e361f3e 224 void SPIX_ConfigSlave(uint8_t ssel, uint8_t pol, uint8_t act_delay, uint8_t inact_delay)
Anna Bridge 186:707f6e361f3e 225 {
Anna Bridge 186:707f6e361f3e 226
Anna Bridge 186:707f6e361f3e 227 // Set the slave select
Anna Bridge 186:707f6e361f3e 228 MXC_SPIX->master_cfg = ((MXC_SPIX->master_cfg & ~MXC_F_SPIX_MASTER_CFG_SLAVE_SEL) |
Anna Bridge 186:707f6e361f3e 229 (ssel << MXC_F_SPIX_MASTER_CFG_SLAVE_SEL_POS));
Anna Bridge 186:707f6e361f3e 230
Anna Bridge 186:707f6e361f3e 231 if(pol != 0) {
Anna Bridge 186:707f6e361f3e 232 // Active high
Anna Bridge 186:707f6e361f3e 233 MXC_SPIX->master_cfg &= ~(MXC_F_SPIX_MASTER_CFG_SS_ACT_LO);
Anna Bridge 186:707f6e361f3e 234 } else {
Anna Bridge 186:707f6e361f3e 235 // Active low
Anna Bridge 186:707f6e361f3e 236 MXC_SPIX->master_cfg |= MXC_F_SPIX_MASTER_CFG_SS_ACT_LO;
Anna Bridge 186:707f6e361f3e 237 }
Anna Bridge 186:707f6e361f3e 238
Anna Bridge 186:707f6e361f3e 239 // Set the delays
Anna Bridge 186:707f6e361f3e 240 MXC_SPIX->master_cfg = ((MXC_SPIX->master_cfg & ~(MXC_F_SPIX_MASTER_CFG_ACT_DELAY |
Anna Bridge 186:707f6e361f3e 241 MXC_F_SPIX_MASTER_CFG_INACT_DELAY)) |
Anna Bridge 186:707f6e361f3e 242 (act_delay << MXC_F_SPIX_MASTER_CFG_ACT_DELAY_POS) |
Anna Bridge 186:707f6e361f3e 243 (inact_delay << MXC_F_SPIX_MASTER_CFG_INACT_DELAY_POS));
Anna Bridge 186:707f6e361f3e 244 }
Anna Bridge 186:707f6e361f3e 245
Anna Bridge 186:707f6e361f3e 246 /******************************************************************************/
Anna Bridge 186:707f6e361f3e 247 #if defined ( __GNUC__ )
Anna Bridge 186:707f6e361f3e 248 __attribute__ ((section(".spix_config"), noinline))
Anna Bridge 186:707f6e361f3e 249 #endif /* __GNUC */
Anna Bridge 186:707f6e361f3e 250
Anna Bridge 186:707f6e361f3e 251 #if IAR_SPIX_PRAGMA
Anna Bridge 186:707f6e361f3e 252 #pragma location=".spix_config" // IAR locate function in RAM section .spix_config
Anna Bridge 186:707f6e361f3e 253 #pragma optimize=no_inline // IAR no inline optimization on this function
Anna Bridge 186:707f6e361f3e 254 #endif /* IAR_SPIX_PRAGMA */
Anna Bridge 186:707f6e361f3e 255
Anna Bridge 186:707f6e361f3e 256 void SPIX_ConfigFetch(const spix_fetch_t *fetch)
Anna Bridge 186:707f6e361f3e 257 {
Anna Bridge 186:707f6e361f3e 258 // Configure how the SPIX fetches data
Anna Bridge 186:707f6e361f3e 259 MXC_SPIX->fetch_ctrl = (((fetch->cmd << MXC_F_SPIX_FETCH_CTRL_CMD_VALUE_POS) & MXC_F_SPIX_FETCH_CTRL_CMD_VALUE) |
Anna Bridge 186:707f6e361f3e 260 ((fetch->cmd_width << MXC_F_SPIX_FETCH_CTRL_CMD_WIDTH_POS) & MXC_F_SPIX_FETCH_CTRL_CMD_WIDTH) |
Anna Bridge 186:707f6e361f3e 261 ((fetch->addr_width << MXC_F_SPIX_FETCH_CTRL_ADDR_WIDTH_POS) & MXC_F_SPIX_FETCH_CTRL_ADDR_WIDTH) |
Anna Bridge 186:707f6e361f3e 262 ((fetch->data_width << MXC_F_SPIX_FETCH_CTRL_DATA_WIDTH_POS) & MXC_F_SPIX_FETCH_CTRL_DATA_WIDTH) |
Anna Bridge 186:707f6e361f3e 263 ((fetch->addr_size << MXC_F_SPIX_FETCH_CTRL_FOUR_BYTE_ADDR_POS) & MXC_F_SPIX_FETCH_CTRL_FOUR_BYTE_ADDR));
Anna Bridge 186:707f6e361f3e 264
Anna Bridge 186:707f6e361f3e 265 // Set the command mode and clocks
Anna Bridge 186:707f6e361f3e 266 MXC_SPIX->mode_ctrl = (((fetch->mode_clocks << MXC_F_SPIX_MODE_CTRL_MODE_CLOCKS_POS) & MXC_F_SPIX_MODE_CTRL_MODE_CLOCKS) |
Anna Bridge 186:707f6e361f3e 267 (!!fetch->no_cmd_mode << MXC_F_SPIX_MODE_CTRL_NO_CMD_MODE_POS));
Anna Bridge 186:707f6e361f3e 268
Anna Bridge 186:707f6e361f3e 269 MXC_SPIX->mode_data = (((fetch->mode_data << MXC_F_SPIX_MODE_DATA_MODE_DATA_BITS_POS) & MXC_F_SPIX_MODE_DATA_MODE_DATA_BITS) |
Anna Bridge 186:707f6e361f3e 270 MXC_F_SPIX_MODE_DATA_MODE_DATA_OE);
Anna Bridge 186:707f6e361f3e 271
Anna Bridge 186:707f6e361f3e 272 #if(MXC_SPIX_REV == 0)
Anna Bridge 186:707f6e361f3e 273 SPIX_UpdateFBIgnore();
Anna Bridge 186:707f6e361f3e 274 #endif
Anna Bridge 186:707f6e361f3e 275 }
Anna Bridge 186:707f6e361f3e 276
Anna Bridge 186:707f6e361f3e 277 /******************************************************************************/
Anna Bridge 186:707f6e361f3e 278 #if defined ( __GNUC__ )
Anna Bridge 186:707f6e361f3e 279 __attribute__ ((section(".spix_config"), noinline))
Anna Bridge 186:707f6e361f3e 280 #endif /* __GNUC */
Anna Bridge 186:707f6e361f3e 281
Anna Bridge 186:707f6e361f3e 282 #if IAR_SPIX_PRAGMA
Anna Bridge 186:707f6e361f3e 283 #pragma location=".spix_config" // IAR locate function in RAM section .spix_config
Anna Bridge 186:707f6e361f3e 284 #pragma optimize=no_inline // IAR no inline optimization on this function
Anna Bridge 186:707f6e361f3e 285 #endif /* IAR_SPIX_PRAGMA */
Anna Bridge 186:707f6e361f3e 286
Anna Bridge 186:707f6e361f3e 287 int SPIX_Shutdown(mxc_spix_regs_t *spix)
Anna Bridge 186:707f6e361f3e 288 {
Anna Bridge 186:707f6e361f3e 289 int err;
Anna Bridge 186:707f6e361f3e 290
Anna Bridge 186:707f6e361f3e 291 // Clear system level configurations
Anna Bridge 186:707f6e361f3e 292 if ((err = SYS_SPIX_Shutdown()) != E_NO_ERROR) {
Anna Bridge 186:707f6e361f3e 293 return err;
Anna Bridge 186:707f6e361f3e 294 }
Anna Bridge 186:707f6e361f3e 295
Anna Bridge 186:707f6e361f3e 296 return E_NO_ERROR;
Anna Bridge 186:707f6e361f3e 297 }