Platform drivers for Mbed.

Dependents:   EVAL-CN0535-FMCZ EVAL-CN0535-FMCZ EVAL-AD568x-AD569x EVAL-AD7606 ... more

Committer:
mahphalke
Date:
Fri Feb 19 15:53:52 2021 +0530
Revision:
15:fd2c3c3038bf
Parent:
14:46aad38346a6
1. Reverted SPI to use fixed 8-bit format but with time efficient version of spi write function.
2. Integrated USB CDC (Virtual COM Port) functionality into UART module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mahphalke 8:70fc373a5f46 1 /***************************************************************************//**
mahphalke 8:70fc373a5f46 2 * @file spi.cpp
mahphalke 8:70fc373a5f46 3 * @brief Implementation of SPI No-OS platform driver interfaces
mahphalke 8:70fc373a5f46 4 ********************************************************************************
mahphalke 8:70fc373a5f46 5 * Copyright (c) 2019, 2020 Analog Devices, Inc.
mahphalke 8:70fc373a5f46 6 *
mahphalke 8:70fc373a5f46 7 * All rights reserved.
mahphalke 8:70fc373a5f46 8 *
mahphalke 8:70fc373a5f46 9 * This software is proprietary to Analog Devices, Inc. and its licensors.
mahphalke 8:70fc373a5f46 10 * By using this software you agree to the terms of the associated
mahphalke 8:70fc373a5f46 11 * Analog Devices Software License Agreement.
mahphalke 8:70fc373a5f46 12 *******************************************************************************/
mahphalke 8:70fc373a5f46 13
mahphalke 8:70fc373a5f46 14 /******************************************************************************/
mahphalke 8:70fc373a5f46 15 /***************************** Include Files **********************************/
mahphalke 8:70fc373a5f46 16 /******************************************************************************/
mahphalke 8:70fc373a5f46 17
mahphalke 8:70fc373a5f46 18 #include <stdio.h>
mahphalke 8:70fc373a5f46 19 #include <mbed.h>
mahphalke 8:70fc373a5f46 20
mahphalke 8:70fc373a5f46 21 #include "platform_drivers.h"
mahphalke 8:70fc373a5f46 22 #include "spi_extra.h"
mahphalke 8:70fc373a5f46 23
mahphalke 8:70fc373a5f46 24 /******************************************************************************/
mahphalke 8:70fc373a5f46 25 /********************** Macros and Constants Definitions **********************/
mahphalke 8:70fc373a5f46 26 /******************************************************************************/
mahphalke 8:70fc373a5f46 27
mahphalke 14:46aad38346a6 28 #define SPI_8_BIT_FRAME 8 // SPI 8-bit frame size
mahphalke 14:46aad38346a6 29
mahphalke 8:70fc373a5f46 30 /******************************************************************************/
mahphalke 8:70fc373a5f46 31 /********************** Variables and User defined data types *****************/
mahphalke 8:70fc373a5f46 32 /******************************************************************************/
mahphalke 8:70fc373a5f46 33
mahphalke 8:70fc373a5f46 34 /******************************************************************************/
mahphalke 8:70fc373a5f46 35 /************************ Functions Declarations ******************************/
mahphalke 8:70fc373a5f46 36 /******************************************************************************/
mahphalke 8:70fc373a5f46 37
mahphalke 8:70fc373a5f46 38 /******************************************************************************/
mahphalke 8:70fc373a5f46 39 /************************ Functions Definitions *******************************/
mahphalke 8:70fc373a5f46 40 /******************************************************************************/
mahphalke 8:70fc373a5f46 41
mahphalke 8:70fc373a5f46 42 /**
mahphalke 8:70fc373a5f46 43 * @brief Initialize the SPI communication peripheral.
mahphalke 8:70fc373a5f46 44 * @param desc - The SPI descriptor.
mahphalke 8:70fc373a5f46 45 * @param init_param - The structure that contains the SPI parameters.
mahphalke 8:70fc373a5f46 46 * @return SUCCESS in case of success, FAILURE otherwise.
mahphalke 8:70fc373a5f46 47 */
mahphalke 8:70fc373a5f46 48 int32_t spi_init_noos(struct spi_desc **desc,
mahphalke 8:70fc373a5f46 49 const struct spi_init_param *param)
mahphalke 8:70fc373a5f46 50 {
mahphalke 8:70fc373a5f46 51 mbed::SPI *spi; // pointer to new spi instance
mahphalke 8:70fc373a5f46 52 DigitalOut *ss; // pointer to new SS instance
mahphalke 8:70fc373a5f46 53 mbed_spi_desc *mbed_desc; // Pointer to mbed spi descriptor
mahphalke 8:70fc373a5f46 54
mahphalke 8:70fc373a5f46 55 if (desc) {
mahphalke 8:70fc373a5f46 56 // Create the spi description object for the device
mahphalke 8:70fc373a5f46 57 spi_desc * new_desc = (spi_desc *)malloc(sizeof(spi_desc));
mahphalke 8:70fc373a5f46 58 if (new_desc == NULL) {
mahphalke 8:70fc373a5f46 59 return FAILURE;
mahphalke 8:70fc373a5f46 60 }
mahphalke 8:70fc373a5f46 61
mahphalke 8:70fc373a5f46 62 new_desc->chip_select = param->chip_select;
mahphalke 8:70fc373a5f46 63 new_desc->mode = param->mode;
mahphalke 8:70fc373a5f46 64 new_desc->max_speed_hz = param->max_speed_hz;
mahphalke 8:70fc373a5f46 65
mahphalke 8:70fc373a5f46 66 // Configure and instantiate SPI protocol
mahphalke 8:70fc373a5f46 67 spi = new SPI(
mahphalke 8:70fc373a5f46 68 (PinName)(((mbed_spi_init_param *)param->extra)->spi_mosi_pin),
mahphalke 8:70fc373a5f46 69 (PinName)(((mbed_spi_init_param *)param->extra)->spi_miso_pin),
mahphalke 8:70fc373a5f46 70 (PinName)(((mbed_spi_init_param *)param->extra)->spi_clk_pin));
mahphalke 8:70fc373a5f46 71
mahphalke 8:70fc373a5f46 72 if (spi == NULL) {
mahphalke 8:70fc373a5f46 73 return FAILURE;
mahphalke 8:70fc373a5f46 74 }
mahphalke 8:70fc373a5f46 75
mahphalke 8:70fc373a5f46 76 // Configure and instantiate slave select pin
mahphalke 8:70fc373a5f46 77 ss = new DigitalOut((PinName)(new_desc->chip_select));
mahphalke 8:70fc373a5f46 78 if (ss == NULL) {
mahphalke 8:70fc373a5f46 79 return FAILURE;
mahphalke 8:70fc373a5f46 80 }
mahphalke 8:70fc373a5f46 81
mahphalke 8:70fc373a5f46 82 // Create the SPI extra descriptor object to store new SPI instances
mahphalke 8:70fc373a5f46 83 mbed_desc = (mbed_spi_desc *)malloc(sizeof(mbed_spi_desc));
mahphalke 8:70fc373a5f46 84 if (mbed_desc == NULL) {
mahphalke 8:70fc373a5f46 85 return FAILURE;
mahphalke 8:70fc373a5f46 86 }
mahphalke 8:70fc373a5f46 87
mahphalke 8:70fc373a5f46 88 mbed_desc->spi_port = (SPI *)spi;
mahphalke 8:70fc373a5f46 89 mbed_desc->slave_select = (DigitalOut *)ss;
mahphalke 8:70fc373a5f46 90 new_desc->extra = (mbed_spi_desc *)mbed_desc;
mahphalke 8:70fc373a5f46 91
mahphalke 8:70fc373a5f46 92 *desc = new_desc;
mahphalke 8:70fc373a5f46 93
mahphalke 8:70fc373a5f46 94 /**
mahphalke 8:70fc373a5f46 95 NOTE: Actual frequency of SPI clk will be somewhat device
mahphalke 8:70fc373a5f46 96 dependent, relating to clock-settings, prescalars etc. If absolute
mahphalke 8:70fc373a5f46 97 SPI frequency is required, consult your device documentation.
mahphalke 8:70fc373a5f46 98 **/
mahphalke 8:70fc373a5f46 99 spi->frequency(param->max_speed_hz);
mahphalke 15:fd2c3c3038bf 100 spi->format(SPI_8_BIT_FRAME, param->mode); // data write/read format
mahphalke 14:46aad38346a6 101 spi->set_default_write_value(0x00); // code to write when reading back
mahphalke 14:46aad38346a6 102 ss->write(GPIO_HIGH); // set SS high
Mahesh Phalke 13:c446482b0360 103
mahphalke 8:70fc373a5f46 104 return SUCCESS;
mahphalke 8:70fc373a5f46 105 }
mahphalke 8:70fc373a5f46 106
mahphalke 8:70fc373a5f46 107 return FAILURE;
mahphalke 8:70fc373a5f46 108 }
mahphalke 8:70fc373a5f46 109
mahphalke 8:70fc373a5f46 110
mahphalke 8:70fc373a5f46 111 /**
mahphalke 8:70fc373a5f46 112 * @brief Free the resources allocated by spi_init().
mahphalke 8:70fc373a5f46 113 * @param desc - The SPI descriptor.
mahphalke 8:70fc373a5f46 114 * @return SUCCESS in case of success, FAILURE otherwise.
mahphalke 8:70fc373a5f46 115 */
mahphalke 8:70fc373a5f46 116 int32_t spi_remove(struct spi_desc *desc)
mahphalke 8:70fc373a5f46 117 {
mahphalke 8:70fc373a5f46 118 if (desc) {
mahphalke 8:70fc373a5f46 119 // Free the SPI port object
mahphalke 8:70fc373a5f46 120 if ((SPI *)(((mbed_spi_desc *)(desc->extra))->spi_port)) {
mahphalke 8:70fc373a5f46 121 delete((SPI *)(((mbed_spi_desc *)(desc->extra))->spi_port));
mahphalke 8:70fc373a5f46 122 }
mahphalke 8:70fc373a5f46 123
mahphalke 8:70fc373a5f46 124 // Free the SS port object
mahphalke 8:70fc373a5f46 125 if ((DigitalOut *)(((mbed_spi_desc *)(desc->extra))->slave_select)) {
mahphalke 8:70fc373a5f46 126 delete((DigitalOut *)(((mbed_spi_desc *)(desc->extra))->slave_select));
mahphalke 8:70fc373a5f46 127 }
mahphalke 8:70fc373a5f46 128
mahphalke 8:70fc373a5f46 129 // Free the SPI extra descriptor object
mahphalke 8:70fc373a5f46 130 if ((mbed_spi_desc *)(desc->extra)) {
mahphalke 8:70fc373a5f46 131 free((mbed_spi_desc *)(desc->extra));
mahphalke 8:70fc373a5f46 132 }
mahphalke 8:70fc373a5f46 133
mahphalke 8:70fc373a5f46 134 // Free the SPI descriptor object
mahphalke 8:70fc373a5f46 135 free(desc);
mahphalke 8:70fc373a5f46 136
mahphalke 8:70fc373a5f46 137 return SUCCESS;
mahphalke 8:70fc373a5f46 138 }
mahphalke 8:70fc373a5f46 139
mahphalke 8:70fc373a5f46 140 return FAILURE;
mahphalke 8:70fc373a5f46 141 }
mahphalke 8:70fc373a5f46 142
mahphalke 8:70fc373a5f46 143
mahphalke 8:70fc373a5f46 144 /**
mahphalke 8:70fc373a5f46 145 * @brief Write and read data to/from SPI.
mahphalke 8:70fc373a5f46 146 * @param desc - The SPI descriptor.
mahphalke 8:70fc373a5f46 147 * @param data - The buffer with the transmitted/received data.
mahphalke 8:70fc373a5f46 148 * @param bytes_number - Number of bytes to write/read.
mahphalke 8:70fc373a5f46 149 * @return SUCCESS in case of success, FAILURE otherwise.
mahphalke 8:70fc373a5f46 150 */
mahphalke 8:70fc373a5f46 151 int32_t spi_write_and_read(struct spi_desc *desc,
mahphalke 8:70fc373a5f46 152 uint8_t *data,
mahphalke 8:70fc373a5f46 153 uint16_t bytes_number)
mahphalke 8:70fc373a5f46 154 {
Mahesh Phalke 11:a2dcf0ebb5b5 155 mbed::SPI *spi; // pointer to new spi instance
Mahesh Phalke 11:a2dcf0ebb5b5 156 mbed::DigitalOut *ss; // pointer to new SS instance
mahphalke 8:70fc373a5f46 157
mahphalke 8:70fc373a5f46 158 if (desc) {
mahphalke 8:70fc373a5f46 159 spi = (SPI *)(((mbed_spi_desc *)(desc->extra))->spi_port);
mahphalke 8:70fc373a5f46 160 ss = (DigitalOut *)(((mbed_spi_desc *)(desc->extra))->slave_select);
Mahesh Phalke 12:d85b77f4160c 161
mahphalke 8:70fc373a5f46 162 ss->write(GPIO_LOW);
mahphalke 15:fd2c3c3038bf 163 spi->write((const char *)data, bytes_number, (char *)data, bytes_number);
mahphalke 8:70fc373a5f46 164 ss->write(GPIO_HIGH);
mahphalke 8:70fc373a5f46 165
mahphalke 8:70fc373a5f46 166 return SUCCESS;
mahphalke 8:70fc373a5f46 167 }
mahphalke 8:70fc373a5f46 168
mahphalke 8:70fc373a5f46 169 return FAILURE;
mahphalke 8:70fc373a5f46 170 }