test
Fork of mbed-dev by
targets/TARGET_Realtek/TARGET_AMEBA/spi_api.c@171:19eb464bc2be, 2017-08-03 (annotated)
- Committer:
- Kojto
- Date:
- Thu Aug 03 13:13:39 2017 +0100
- Revision:
- 171:19eb464bc2be
- Parent:
- 168:e84263d55307
This updates the lib to the mbed lib v 148
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 168:e84263d55307 | 1 | /* mbed Microcontroller Library |
AnnaBridge | 168:e84263d55307 | 2 | * Copyright (c) 2013-2016 Realtek Semiconductor Corp. |
AnnaBridge | 168:e84263d55307 | 3 | * |
AnnaBridge | 168:e84263d55307 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
AnnaBridge | 168:e84263d55307 | 5 | * you may not use this file except in compliance with the License. |
AnnaBridge | 168:e84263d55307 | 6 | * You may obtain a copy of the License at |
AnnaBridge | 168:e84263d55307 | 7 | * |
AnnaBridge | 168:e84263d55307 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
AnnaBridge | 168:e84263d55307 | 9 | * |
AnnaBridge | 168:e84263d55307 | 10 | * Unless required by applicable law or agreed to in writing, software |
AnnaBridge | 168:e84263d55307 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
AnnaBridge | 168:e84263d55307 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
AnnaBridge | 168:e84263d55307 | 13 | * See the License for the specific language governing permissions and |
AnnaBridge | 168:e84263d55307 | 14 | * limitations under the License. |
AnnaBridge | 168:e84263d55307 | 15 | */ |
AnnaBridge | 168:e84263d55307 | 16 | |
AnnaBridge | 168:e84263d55307 | 17 | #include "objects.h" |
AnnaBridge | 168:e84263d55307 | 18 | #include "spi_api.h" |
AnnaBridge | 168:e84263d55307 | 19 | |
AnnaBridge | 168:e84263d55307 | 20 | #include "PinNames.h" |
AnnaBridge | 168:e84263d55307 | 21 | #include "pinmap.h" |
AnnaBridge | 168:e84263d55307 | 22 | #include "hal_ssi.h" |
AnnaBridge | 168:e84263d55307 | 23 | |
AnnaBridge | 168:e84263d55307 | 24 | extern u32 SystemGetCpuClk(VOID); |
AnnaBridge | 168:e84263d55307 | 25 | extern VOID HAL_GPIO_PullCtrl(u32 pin, u32 mode); |
AnnaBridge | 168:e84263d55307 | 26 | |
AnnaBridge | 168:e84263d55307 | 27 | void spi_tx_done_callback(VOID *obj); |
AnnaBridge | 168:e84263d55307 | 28 | void spi_rx_done_callback(VOID *obj); |
AnnaBridge | 168:e84263d55307 | 29 | void spi_bus_tx_done_callback(VOID *obj); |
AnnaBridge | 168:e84263d55307 | 30 | |
AnnaBridge | 168:e84263d55307 | 31 | |
AnnaBridge | 168:e84263d55307 | 32 | //TODO: Load default Setting: It should be loaded from external setting file. |
AnnaBridge | 168:e84263d55307 | 33 | extern const DW_SSI_DEFAULT_SETTING SpiDefaultSetting; |
AnnaBridge | 168:e84263d55307 | 34 | |
AnnaBridge | 168:e84263d55307 | 35 | static const PinMap PinMap_SSI_MOSI[] = { |
AnnaBridge | 168:e84263d55307 | 36 | {PE_2, RTL_PIN_PERI(SPI0, 0, S0), RTL_PIN_FUNC(SPI0, S0)}, |
AnnaBridge | 168:e84263d55307 | 37 | {PC_2, RTL_PIN_PERI(SPI0, 0, S1), RTL_PIN_FUNC(SPI0, S1)}, |
AnnaBridge | 168:e84263d55307 | 38 | {PA_1, RTL_PIN_PERI(SPI1, 1, S0), RTL_PIN_FUNC(SPI1, S0)}, |
AnnaBridge | 168:e84263d55307 | 39 | {PB_6, RTL_PIN_PERI(SPI1, 1, S1), RTL_PIN_FUNC(SPI1, S1)}, |
AnnaBridge | 168:e84263d55307 | 40 | {PD_6, RTL_PIN_PERI(SPI1, 1, S2), RTL_PIN_FUNC(SPI1, S2)}, |
AnnaBridge | 168:e84263d55307 | 41 | {PG_2, RTL_PIN_PERI(SPI2, 2, S0), RTL_PIN_FUNC(SPI2, S0)}, |
AnnaBridge | 168:e84263d55307 | 42 | {PE_6, RTL_PIN_PERI(SPI2, 2, S1), RTL_PIN_FUNC(SPI2, S1)}, |
AnnaBridge | 168:e84263d55307 | 43 | {PD_2, RTL_PIN_PERI(SPI2, 2, S2), RTL_PIN_FUNC(SPI2, S2)}, |
AnnaBridge | 168:e84263d55307 | 44 | {NC, NC, 0} |
AnnaBridge | 168:e84263d55307 | 45 | }; |
AnnaBridge | 168:e84263d55307 | 46 | |
AnnaBridge | 168:e84263d55307 | 47 | static const PinMap PinMap_SSI_MISO[] = { |
AnnaBridge | 168:e84263d55307 | 48 | {PE_3, RTL_PIN_PERI(SPI0, 0, S0), RTL_PIN_FUNC(SPI0, S0)}, |
AnnaBridge | 168:e84263d55307 | 49 | {PC_3, RTL_PIN_PERI(SPI0, 0, S1), RTL_PIN_FUNC(SPI0, S1)}, |
AnnaBridge | 168:e84263d55307 | 50 | {PA_0, RTL_PIN_PERI(SPI1, 1, S0), RTL_PIN_FUNC(SPI1, S0)}, |
AnnaBridge | 168:e84263d55307 | 51 | {PB_7, RTL_PIN_PERI(SPI1, 1, S1), RTL_PIN_FUNC(SPI1, S1)}, |
AnnaBridge | 168:e84263d55307 | 52 | {PD_7, RTL_PIN_PERI(SPI1, 1, S2), RTL_PIN_FUNC(SPI1, S2)}, |
AnnaBridge | 168:e84263d55307 | 53 | {PG_3, RTL_PIN_PERI(SPI2, 2, S0), RTL_PIN_FUNC(SPI2, S0)}, |
AnnaBridge | 168:e84263d55307 | 54 | {PE_7, RTL_PIN_PERI(SPI2, 2, S1), RTL_PIN_FUNC(SPI2, S1)}, |
AnnaBridge | 168:e84263d55307 | 55 | {PD_3, RTL_PIN_PERI(SPI2, 2, S2), RTL_PIN_FUNC(SPI2, S2)}, |
AnnaBridge | 168:e84263d55307 | 56 | {NC, NC, 0} |
AnnaBridge | 168:e84263d55307 | 57 | }; |
AnnaBridge | 168:e84263d55307 | 58 | |
AnnaBridge | 168:e84263d55307 | 59 | |
AnnaBridge | 168:e84263d55307 | 60 | void spi_init (spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) |
AnnaBridge | 168:e84263d55307 | 61 | { |
AnnaBridge | 168:e84263d55307 | 62 | SSI_DBG_ENTRANCE("spi_init()\n"); |
AnnaBridge | 168:e84263d55307 | 63 | |
AnnaBridge | 168:e84263d55307 | 64 | uint32_t ssi_mosi, ssi_miso, ssi_peri; |
AnnaBridge | 168:e84263d55307 | 65 | uint8_t ssi_idx, ssi_pinmux; |
AnnaBridge | 168:e84263d55307 | 66 | PHAL_SSI_ADAPTOR pHalSsiAdaptor; |
AnnaBridge | 168:e84263d55307 | 67 | PHAL_SSI_OP pHalSsiOp; |
AnnaBridge | 168:e84263d55307 | 68 | |
AnnaBridge | 168:e84263d55307 | 69 | _memset((void*)obj, 0, sizeof(spi_t)); |
AnnaBridge | 168:e84263d55307 | 70 | obj->state = 0; |
AnnaBridge | 168:e84263d55307 | 71 | uint32_t SystemClock = SystemGetCpuClk(); |
AnnaBridge | 168:e84263d55307 | 72 | uint32_t MaxSsiFreq = (SystemClock >> 2) >> 1; |
AnnaBridge | 168:e84263d55307 | 73 | |
AnnaBridge | 168:e84263d55307 | 74 | /* SsiClockDivider doesn't support odd number */ |
AnnaBridge | 168:e84263d55307 | 75 | |
AnnaBridge | 168:e84263d55307 | 76 | DBG_SSI_INFO("SystemClock: %d\n", SystemClock); |
AnnaBridge | 168:e84263d55307 | 77 | DBG_SSI_INFO("MaxSsiFreq : %d\n", MaxSsiFreq); |
AnnaBridge | 168:e84263d55307 | 78 | |
AnnaBridge | 168:e84263d55307 | 79 | ssi_mosi = pinmap_peripheral(mosi, PinMap_SSI_MOSI); |
AnnaBridge | 168:e84263d55307 | 80 | ssi_miso = pinmap_peripheral(miso, PinMap_SSI_MISO); |
AnnaBridge | 168:e84263d55307 | 81 | |
AnnaBridge | 168:e84263d55307 | 82 | ssi_peri = pinmap_merge(ssi_mosi, ssi_miso); |
AnnaBridge | 168:e84263d55307 | 83 | if (unlikely(ssi_peri == NC)) { |
AnnaBridge | 168:e84263d55307 | 84 | DBG_SSI_ERR("spi_init(): Cannot find matched SSI index.\n"); |
AnnaBridge | 168:e84263d55307 | 85 | return; |
AnnaBridge | 168:e84263d55307 | 86 | } |
AnnaBridge | 168:e84263d55307 | 87 | obj->sclk = (u8)sclk; |
AnnaBridge | 168:e84263d55307 | 88 | ssi_idx = RTL_GET_PERI_IDX(ssi_peri); |
AnnaBridge | 168:e84263d55307 | 89 | ssi_pinmux = RTL_GET_PERI_SEL(ssi_peri); |
AnnaBridge | 168:e84263d55307 | 90 | DBG_SSI_INFO("ssi_peri: %d, ssi_idx: %d, ssi_pinmux: %d\n", ssi_peri, ssi_idx, ssi_pinmux); |
AnnaBridge | 168:e84263d55307 | 91 | |
AnnaBridge | 168:e84263d55307 | 92 | pHalSsiAdaptor = &obj->spi_adp; |
AnnaBridge | 168:e84263d55307 | 93 | pHalSsiOp = &obj->spi_op; |
AnnaBridge | 168:e84263d55307 | 94 | |
AnnaBridge | 168:e84263d55307 | 95 | pHalSsiAdaptor->Index = ssi_idx; |
AnnaBridge | 168:e84263d55307 | 96 | pHalSsiAdaptor->PinmuxSelect = ssi_pinmux; |
AnnaBridge | 168:e84263d55307 | 97 | pHalSsiAdaptor->Role = SSI_MASTER; |
AnnaBridge | 168:e84263d55307 | 98 | |
AnnaBridge | 168:e84263d55307 | 99 | HalSsiOpInit((VOID*)pHalSsiOp); |
AnnaBridge | 168:e84263d55307 | 100 | |
AnnaBridge | 168:e84263d55307 | 101 | pHalSsiOp->HalSsiSetDeviceRole(pHalSsiAdaptor, pHalSsiAdaptor->Role); |
AnnaBridge | 168:e84263d55307 | 102 | |
AnnaBridge | 168:e84263d55307 | 103 | /* Pinmux workaround */ |
AnnaBridge | 168:e84263d55307 | 104 | if ((ssi_idx == 0) && (ssi_pinmux == SSI0_MUX_TO_GPIOC)) { |
AnnaBridge | 168:e84263d55307 | 105 | EEPROM_PIN_CTRL(OFF); |
AnnaBridge | 168:e84263d55307 | 106 | } |
AnnaBridge | 168:e84263d55307 | 107 | |
AnnaBridge | 168:e84263d55307 | 108 | if ((ssi_idx == 0) && (ssi_pinmux == SSI0_MUX_TO_GPIOE)) { |
AnnaBridge | 168:e84263d55307 | 109 | DBG_SSI_WARN(ANSI_COLOR_MAGENTA"SPI0 Pin may conflict with JTAG\r\n"ANSI_COLOR_RESET); |
AnnaBridge | 168:e84263d55307 | 110 | } |
AnnaBridge | 168:e84263d55307 | 111 | |
AnnaBridge | 168:e84263d55307 | 112 | //TODO: Implement default setting structure. |
AnnaBridge | 168:e84263d55307 | 113 | pHalSsiOp->HalSsiLoadSetting(pHalSsiAdaptor, (void*)&SpiDefaultSetting); |
AnnaBridge | 168:e84263d55307 | 114 | pHalSsiAdaptor->DefaultRxThresholdLevel = SpiDefaultSetting.RxThresholdLevel; |
AnnaBridge | 168:e84263d55307 | 115 | |
AnnaBridge | 168:e84263d55307 | 116 | if(HalSsiInit(pHalSsiAdaptor) != HAL_OK){ |
AnnaBridge | 168:e84263d55307 | 117 | DBG_SSI_ERR(ANSI_COLOR_RED"spi_init(): SPI %x init fails.\n"ANSI_COLOR_RESET,pHalSsiAdaptor->Index); |
AnnaBridge | 168:e84263d55307 | 118 | return; |
AnnaBridge | 168:e84263d55307 | 119 | } |
AnnaBridge | 168:e84263d55307 | 120 | osDelay(1); |
AnnaBridge | 168:e84263d55307 | 121 | } |
AnnaBridge | 168:e84263d55307 | 122 | |
AnnaBridge | 168:e84263d55307 | 123 | void spi_free (spi_t *obj) |
AnnaBridge | 168:e84263d55307 | 124 | { |
AnnaBridge | 168:e84263d55307 | 125 | PHAL_SSI_ADAPTOR pHalSsiAdaptor; |
AnnaBridge | 168:e84263d55307 | 126 | pHalSsiAdaptor = &obj->spi_adp; |
AnnaBridge | 168:e84263d55307 | 127 | HalSsiDeInit(pHalSsiAdaptor); |
AnnaBridge | 168:e84263d55307 | 128 | |
AnnaBridge | 168:e84263d55307 | 129 | SPI0_MULTI_CS_CTRL(OFF); |
AnnaBridge | 168:e84263d55307 | 130 | } |
AnnaBridge | 168:e84263d55307 | 131 | |
AnnaBridge | 168:e84263d55307 | 132 | void spi_format (spi_t *obj, int bits, int mode, int slave) |
AnnaBridge | 168:e84263d55307 | 133 | { |
AnnaBridge | 168:e84263d55307 | 134 | PHAL_SSI_ADAPTOR pHalSsiAdaptor; |
AnnaBridge | 168:e84263d55307 | 135 | PHAL_SSI_OP pHalSsiOp; |
AnnaBridge | 168:e84263d55307 | 136 | |
AnnaBridge | 168:e84263d55307 | 137 | pHalSsiAdaptor = &obj->spi_adp; |
AnnaBridge | 168:e84263d55307 | 138 | pHalSsiOp = &obj->spi_op; |
AnnaBridge | 168:e84263d55307 | 139 | |
AnnaBridge | 168:e84263d55307 | 140 | pHalSsiAdaptor->DataFrameSize = (bits - 1); |
AnnaBridge | 168:e84263d55307 | 141 | |
AnnaBridge | 168:e84263d55307 | 142 | /* |
AnnaBridge | 168:e84263d55307 | 143 | * mode | POL PHA |
AnnaBridge | 168:e84263d55307 | 144 | * -----+-------- |
AnnaBridge | 168:e84263d55307 | 145 | * 0 | 0 0 |
AnnaBridge | 168:e84263d55307 | 146 | * 1 | 0 1 |
AnnaBridge | 168:e84263d55307 | 147 | * 2 | 1 0 |
AnnaBridge | 168:e84263d55307 | 148 | * 3 | 1 1 |
AnnaBridge | 168:e84263d55307 | 149 | * |
AnnaBridge | 168:e84263d55307 | 150 | * SCPOL_INACTIVE_IS_LOW = 0, |
AnnaBridge | 168:e84263d55307 | 151 | * SCPOL_INACTIVE_IS_HIGH = 1 |
AnnaBridge | 168:e84263d55307 | 152 | * |
AnnaBridge | 168:e84263d55307 | 153 | * SCPH_TOGGLES_IN_MIDDLE = 0, |
AnnaBridge | 168:e84263d55307 | 154 | * SCPH_TOGGLES_AT_START = 1 |
AnnaBridge | 168:e84263d55307 | 155 | */ |
AnnaBridge | 168:e84263d55307 | 156 | switch (mode) |
AnnaBridge | 168:e84263d55307 | 157 | { |
AnnaBridge | 168:e84263d55307 | 158 | case 0: |
AnnaBridge | 168:e84263d55307 | 159 | pHalSsiAdaptor->SclkPolarity = SCPOL_INACTIVE_IS_LOW; |
AnnaBridge | 168:e84263d55307 | 160 | pHalSsiAdaptor->SclkPhase = SCPH_TOGGLES_IN_MIDDLE; |
AnnaBridge | 168:e84263d55307 | 161 | break; |
AnnaBridge | 168:e84263d55307 | 162 | case 1: |
AnnaBridge | 168:e84263d55307 | 163 | pHalSsiAdaptor->SclkPolarity = SCPOL_INACTIVE_IS_LOW; |
AnnaBridge | 168:e84263d55307 | 164 | pHalSsiAdaptor->SclkPhase = SCPH_TOGGLES_AT_START; |
AnnaBridge | 168:e84263d55307 | 165 | break; |
AnnaBridge | 168:e84263d55307 | 166 | case 2: |
AnnaBridge | 168:e84263d55307 | 167 | pHalSsiAdaptor->SclkPolarity = SCPOL_INACTIVE_IS_HIGH; |
AnnaBridge | 168:e84263d55307 | 168 | pHalSsiAdaptor->SclkPhase = SCPH_TOGGLES_IN_MIDDLE; |
AnnaBridge | 168:e84263d55307 | 169 | break; |
AnnaBridge | 168:e84263d55307 | 170 | case 3: |
AnnaBridge | 168:e84263d55307 | 171 | pHalSsiAdaptor->SclkPolarity = SCPOL_INACTIVE_IS_HIGH; |
AnnaBridge | 168:e84263d55307 | 172 | pHalSsiAdaptor->SclkPhase = SCPH_TOGGLES_AT_START; |
AnnaBridge | 168:e84263d55307 | 173 | break; |
AnnaBridge | 168:e84263d55307 | 174 | default: // same as 3 |
AnnaBridge | 168:e84263d55307 | 175 | pHalSsiAdaptor->SclkPolarity = SCPOL_INACTIVE_IS_HIGH; |
AnnaBridge | 168:e84263d55307 | 176 | pHalSsiAdaptor->SclkPhase = SCPH_TOGGLES_AT_START; |
AnnaBridge | 168:e84263d55307 | 177 | break; |
AnnaBridge | 168:e84263d55307 | 178 | } |
AnnaBridge | 168:e84263d55307 | 179 | |
AnnaBridge | 168:e84263d55307 | 180 | if (slave == 1) { |
AnnaBridge | 168:e84263d55307 | 181 | if (pHalSsiAdaptor->Index == 0) { |
AnnaBridge | 168:e84263d55307 | 182 | pHalSsiAdaptor->Role = SSI_SLAVE; |
AnnaBridge | 168:e84263d55307 | 183 | pHalSsiAdaptor->SlaveOutputEnable = SLV_TXD_ENABLE; // <-- Slave only |
AnnaBridge | 168:e84263d55307 | 184 | DBG_SSI_INFO("SPI0 is as slave\n"); |
AnnaBridge | 168:e84263d55307 | 185 | } else { |
AnnaBridge | 168:e84263d55307 | 186 | DBG_SSI_ERR("The SPI%d cannot work as Slave mode, only SPI0 does.\r\n", pHalSsiAdaptor->Index); |
AnnaBridge | 168:e84263d55307 | 187 | pHalSsiAdaptor->Role = SSI_MASTER; |
AnnaBridge | 168:e84263d55307 | 188 | } |
AnnaBridge | 168:e84263d55307 | 189 | } else { |
AnnaBridge | 168:e84263d55307 | 190 | pHalSsiAdaptor->Role = SSI_MASTER; |
AnnaBridge | 168:e84263d55307 | 191 | } |
AnnaBridge | 168:e84263d55307 | 192 | pHalSsiOp->HalSsiSetDeviceRole(pHalSsiAdaptor, pHalSsiAdaptor->Role); |
AnnaBridge | 168:e84263d55307 | 193 | |
AnnaBridge | 168:e84263d55307 | 194 | #ifdef CONFIG_GPIO_EN |
AnnaBridge | 168:e84263d55307 | 195 | if (pHalSsiAdaptor->Role == SSI_SLAVE) { |
AnnaBridge | 168:e84263d55307 | 196 | if (pHalSsiAdaptor->SclkPolarity == SCPOL_INACTIVE_IS_LOW) { |
AnnaBridge | 168:e84263d55307 | 197 | HAL_GPIO_PullCtrl((u32)obj->sclk, hal_PullDown); |
AnnaBridge | 168:e84263d55307 | 198 | } else { |
AnnaBridge | 168:e84263d55307 | 199 | HAL_GPIO_PullCtrl((u32)obj->sclk, hal_PullUp); |
AnnaBridge | 168:e84263d55307 | 200 | } |
AnnaBridge | 168:e84263d55307 | 201 | } |
AnnaBridge | 168:e84263d55307 | 202 | #endif |
AnnaBridge | 168:e84263d55307 | 203 | HalSsiSetFormat(pHalSsiAdaptor); |
AnnaBridge | 168:e84263d55307 | 204 | } |
AnnaBridge | 168:e84263d55307 | 205 | |
AnnaBridge | 168:e84263d55307 | 206 | void spi_frequency (spi_t *obj, int hz) |
AnnaBridge | 168:e84263d55307 | 207 | { |
AnnaBridge | 168:e84263d55307 | 208 | PHAL_SSI_ADAPTOR pHalSsiAdaptor; |
AnnaBridge | 168:e84263d55307 | 209 | |
AnnaBridge | 168:e84263d55307 | 210 | pHalSsiAdaptor = &obj->spi_adp; |
AnnaBridge | 168:e84263d55307 | 211 | HalSsiSetSclk(pHalSsiAdaptor, (u32)hz); |
AnnaBridge | 168:e84263d55307 | 212 | } |
AnnaBridge | 168:e84263d55307 | 213 | |
AnnaBridge | 168:e84263d55307 | 214 | static inline void ssi_write (spi_t *obj, int value) |
AnnaBridge | 168:e84263d55307 | 215 | { |
AnnaBridge | 168:e84263d55307 | 216 | PHAL_SSI_ADAPTOR pHalSsiAdaptor; |
AnnaBridge | 168:e84263d55307 | 217 | PHAL_SSI_OP pHalSsiOp; |
AnnaBridge | 168:e84263d55307 | 218 | |
AnnaBridge | 168:e84263d55307 | 219 | pHalSsiAdaptor = &obj->spi_adp; |
AnnaBridge | 168:e84263d55307 | 220 | pHalSsiOp = &obj->spi_op; |
AnnaBridge | 168:e84263d55307 | 221 | |
AnnaBridge | 168:e84263d55307 | 222 | while (!pHalSsiOp->HalSsiWriteable(pHalSsiAdaptor)); |
AnnaBridge | 168:e84263d55307 | 223 | pHalSsiOp->HalSsiWrite((VOID*)pHalSsiAdaptor, value); |
AnnaBridge | 168:e84263d55307 | 224 | } |
AnnaBridge | 168:e84263d55307 | 225 | |
AnnaBridge | 168:e84263d55307 | 226 | static inline int ssi_read(spi_t *obj) |
AnnaBridge | 168:e84263d55307 | 227 | { |
AnnaBridge | 168:e84263d55307 | 228 | PHAL_SSI_ADAPTOR pHalSsiAdaptor; |
AnnaBridge | 168:e84263d55307 | 229 | PHAL_SSI_OP pHalSsiOp; |
AnnaBridge | 168:e84263d55307 | 230 | |
AnnaBridge | 168:e84263d55307 | 231 | pHalSsiAdaptor = &obj->spi_adp; |
AnnaBridge | 168:e84263d55307 | 232 | pHalSsiOp = &obj->spi_op; |
AnnaBridge | 168:e84263d55307 | 233 | |
AnnaBridge | 168:e84263d55307 | 234 | while (!pHalSsiOp->HalSsiReadable(pHalSsiAdaptor)); |
AnnaBridge | 168:e84263d55307 | 235 | return (int)pHalSsiOp->HalSsiRead(pHalSsiAdaptor); |
AnnaBridge | 168:e84263d55307 | 236 | } |
AnnaBridge | 168:e84263d55307 | 237 | |
AnnaBridge | 168:e84263d55307 | 238 | int spi_master_write (spi_t *obj, int value) |
AnnaBridge | 168:e84263d55307 | 239 | { |
AnnaBridge | 168:e84263d55307 | 240 | ssi_write(obj, value); |
AnnaBridge | 168:e84263d55307 | 241 | return ssi_read(obj); |
AnnaBridge | 168:e84263d55307 | 242 | } |
AnnaBridge | 168:e84263d55307 | 243 | |
Kojto | 171:19eb464bc2be | 244 | int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, |
Kojto | 171:19eb464bc2be | 245 | char *rx_buffer, int rx_length, char write_fill) |
AnnaBridge | 168:e84263d55307 | 246 | { |
AnnaBridge | 168:e84263d55307 | 247 | int total = (tx_length > rx_length) ? tx_length : rx_length; |
AnnaBridge | 168:e84263d55307 | 248 | |
AnnaBridge | 168:e84263d55307 | 249 | for (int i = 0; i < total; i++) { |
Kojto | 171:19eb464bc2be | 250 | char out = (i < tx_length) ? tx_buffer[i] : write_fill; |
AnnaBridge | 168:e84263d55307 | 251 | char in = spi_master_write(obj, out); |
AnnaBridge | 168:e84263d55307 | 252 | if (i < rx_length) { |
AnnaBridge | 168:e84263d55307 | 253 | rx_buffer[i] = in; |
AnnaBridge | 168:e84263d55307 | 254 | } |
AnnaBridge | 168:e84263d55307 | 255 | } |
AnnaBridge | 168:e84263d55307 | 256 | |
AnnaBridge | 168:e84263d55307 | 257 | return total; |
AnnaBridge | 168:e84263d55307 | 258 | } |
AnnaBridge | 168:e84263d55307 | 259 | |
AnnaBridge | 168:e84263d55307 | 260 | int spi_slave_receive (spi_t *obj) |
AnnaBridge | 168:e84263d55307 | 261 | { |
AnnaBridge | 168:e84263d55307 | 262 | PHAL_SSI_ADAPTOR pHalSsiAdaptor; |
AnnaBridge | 168:e84263d55307 | 263 | PHAL_SSI_OP pHalSsiOp; |
AnnaBridge | 168:e84263d55307 | 264 | int Readable; |
AnnaBridge | 168:e84263d55307 | 265 | int Busy; |
AnnaBridge | 168:e84263d55307 | 266 | |
AnnaBridge | 168:e84263d55307 | 267 | pHalSsiAdaptor = &obj->spi_adp; |
AnnaBridge | 168:e84263d55307 | 268 | pHalSsiOp = &obj->spi_op; |
AnnaBridge | 168:e84263d55307 | 269 | |
AnnaBridge | 168:e84263d55307 | 270 | Readable = pHalSsiOp->HalSsiReadable(pHalSsiAdaptor); |
AnnaBridge | 168:e84263d55307 | 271 | Busy = (int)pHalSsiOp->HalSsiBusy(pHalSsiAdaptor); |
AnnaBridge | 168:e84263d55307 | 272 | return ((Readable && !Busy) ? 1 : 0); |
AnnaBridge | 168:e84263d55307 | 273 | } |
AnnaBridge | 168:e84263d55307 | 274 | |
AnnaBridge | 168:e84263d55307 | 275 | int spi_slave_read (spi_t *obj) |
AnnaBridge | 168:e84263d55307 | 276 | { |
AnnaBridge | 168:e84263d55307 | 277 | return ssi_read(obj); |
AnnaBridge | 168:e84263d55307 | 278 | } |
AnnaBridge | 168:e84263d55307 | 279 | |
AnnaBridge | 168:e84263d55307 | 280 | void spi_slave_write (spi_t *obj, int value) |
AnnaBridge | 168:e84263d55307 | 281 | { |
AnnaBridge | 168:e84263d55307 | 282 | ssi_write(obj, value); |
AnnaBridge | 168:e84263d55307 | 283 | } |
AnnaBridge | 168:e84263d55307 | 284 | |
AnnaBridge | 168:e84263d55307 | 285 | int spi_busy (spi_t *obj) |
AnnaBridge | 168:e84263d55307 | 286 | { |
AnnaBridge | 168:e84263d55307 | 287 | PHAL_SSI_ADAPTOR pHalSsiAdaptor; |
AnnaBridge | 168:e84263d55307 | 288 | PHAL_SSI_OP pHalSsiOp; |
AnnaBridge | 168:e84263d55307 | 289 | |
AnnaBridge | 168:e84263d55307 | 290 | pHalSsiAdaptor = &obj->spi_adp; |
AnnaBridge | 168:e84263d55307 | 291 | pHalSsiOp = &obj->spi_op; |
AnnaBridge | 168:e84263d55307 | 292 | |
AnnaBridge | 168:e84263d55307 | 293 | return (int)pHalSsiOp->HalSsiBusy(pHalSsiAdaptor); |
AnnaBridge | 168:e84263d55307 | 294 | } |
AnnaBridge | 168:e84263d55307 | 295 | |
AnnaBridge | 168:e84263d55307 | 296 |