47 #include <ti/drivers/SPI.h> 48 #include <ti/drivers/dpl/HwiP.h> 49 #include <ti/drivers/pin/PINCC26XX.h> 60 #if (SPI_CONTROLLER_COUNT > 0) 61 static spi_arch_t spi_arches[SPI_CONTROLLER_COUNT];
63 static spi_arch_t *spi_arches = NULL;
66 static inline spi_arch_t *
67 get_handle(uint8_t spi_controller)
69 if(spi_controller < SPI_CONTROLLER_COUNT) {
70 return &spi_arches[spi_controller];
76 static SPI_FrameFormat
77 convert_frame_format(uint8_t pol, uint8_t pha)
88 uint8_t pol_pha = (pol << 4) | (pha << 0);
90 case 0x00:
return SPI_POL0_PHA0;
91 case 0x01:
return SPI_POL0_PHA1;
92 case 0x10:
return SPI_POL1_PHA0;
94 case 0x11:
return SPI_POL1_PHA1;
105 spi_arch_t *spi_arch = get_handle(dev->spi_controller);
106 return (spi_arch != NULL) && (spi_arch->owner == dev);
116 spi_arch_t *spi_arch = get_handle(dev->spi_controller);
117 return (spi_arch != NULL) && (spi_arch->handle != NULL);
123 uint_least8_t spi_index;
124 spi_arch_t *spi_arch;
125 SPI_Params spi_params;
127 const uintptr_t hwi_key = HwiP_disable();
129 spi_index = dev->spi_controller;
130 spi_arch = get_handle(spi_index);
133 if(spi_arch == NULL) {
134 HwiP_restore(hwi_key);
135 return SPI_DEV_STATUS_EINVAL;
140 HwiP_restore(hwi_key);
141 return SPI_DEV_STATUS_BUS_LOCKED;
144 SPI_Params_init(&spi_params);
146 spi_params.transferMode = SPI_MODE_BLOCKING;
147 spi_params.mode = SPI_MASTER;
148 spi_params.bitRate = dev->spi_bit_rate;
149 spi_params.dataSize = 8;
150 spi_params.frameFormat = convert_frame_format(dev->spi_pol, dev->spi_pha);
156 spi_arch->handle = SPI_open(spi_index, &spi_params);
158 if(spi_arch->handle == NULL) {
159 HwiP_restore(hwi_key);
160 return SPI_DEV_STATUS_BUS_LOCKED;
163 spi_arch->owner = dev;
165 HwiP_restore(hwi_key);
166 return SPI_DEV_STATUS_OK;
172 spi_arch_t *spi_arch;
174 const uintptr_t hwi_key = HwiP_disable();
177 spi_arch = get_handle(dev->spi_controller);
178 if(spi_arch == NULL) {
179 HwiP_restore(hwi_key);
180 return SPI_DEV_STATUS_EINVAL;
185 HwiP_restore(hwi_key);
186 return SPI_DEV_STATUS_BUS_NOT_OWNED;
189 SPI_close(spi_arch->handle);
191 spi_arch->handle = NULL;
192 spi_arch->owner = NULL;
194 HwiP_restore(hwi_key);
195 return SPI_DEV_STATUS_OK;
200 const uint8_t *write_buf,
int wlen,
201 uint8_t *inbuf,
int rlen,
int ignore_len)
203 spi_arch_t *spi_arch;
205 SPI_Transaction spi_transaction;
209 spi_arch = get_handle(dev->spi_controller);
210 if(spi_arch == NULL) {
211 return SPI_DEV_STATUS_EINVAL;
215 return SPI_DEV_STATUS_BUS_NOT_OWNED;
218 totlen = MAX((
size_t)(rlen + ignore_len), (
size_t)wlen);
222 return SPI_DEV_STATUS_OK;
225 spi_transaction.count = totlen;
226 spi_transaction.txBuf = (
void *)write_buf;
227 spi_transaction.rxBuf = (
void *)inbuf;
229 transfer_ok = SPI_transfer(spi_arch->handle, &spi_transaction);
232 return SPI_DEV_STATUS_TRANSFER_ERR;
235 return SPI_DEV_STATUS_OK;
bool spi_arch_has_lock(const spi_device_t *dev)
Checks if a device has locked an SPI controller.
spi_status_t spi_arch_transfer(const spi_device_t *dev, const uint8_t *write_buf, int wlen, uint8_t *inbuf, int rlen, int ignore_len)
Performs an SPI transfer.
Header file for the SPI HAL.
spi_status_t
SPI return codes.
spi_status_t spi_arch_lock_and_open(const spi_device_t *dev)
Locks and opens an SPI controller to the configuration specified.
bool spi_arch_is_bus_locked(const spi_device_t *dev)
Checks if an SPI controller is locked by any device.
SPI Device Configuration.
Default definitions of C compiler quirk work-arounds.
spi_status_t spi_arch_close_and_unlock(const spi_device_t *dev)
Closes and unlocks an SPI controller.