Platform drivers for Mbed.

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

Revision:
20:4951ea6abee5
Parent:
17:af1f2416dd26
diff -r 3c61197500c4 -r 4951ea6abee5 spi.cpp
--- a/spi.cpp	Wed Sep 29 12:32:10 2021 +0100
+++ b/spi.cpp	Mon Nov 29 12:39:54 2021 +0000
@@ -217,6 +217,56 @@
 	return FAILURE;
 }
 
+
+/**
+ * @brief Transfer (write/read) the number of SPI messages
+ * @param desc - The SPI descriptor
+ * @param msgs - Pointer to SPI messages
+ * @param num_of_msgs - Number of SPI messages
+ * @return SUCCESS in case of success, FAILURE otherwise.
+ * @note Use of this function requires CSB pin to be software controlled
+ */
+int32_t spi_transfer(struct spi_desc *desc, struct spi_msg *msgs,
+		     uint32_t num_of_msgs)
+{
+	mbed::SPI *spi; 			// pointer to new spi instance
+	mbed::DigitalOut *csb;   	// pointer to new CSB instance
+	uint8_t msg_cnt;			// SPI message counter
+
+	if (desc) {
+		if (!((mbed_spi_desc *)desc->extra)->use_sw_csb)
+			return FAILURE;
+
+		spi = (SPI *)(((mbed_spi_desc *)(desc->extra))->spi_port);
+		csb = (DigitalOut *)(((mbed_spi_desc *)(desc->extra))->csb_gpio);
+
+		if (!spi || !csb)
+			return FAILURE;
+
+		for (msg_cnt = 0; msg_cnt < num_of_msgs; msg_cnt++) {
+			csb->write(GPIO_LOW);
+
+			/* Perform synchronous SPI write and read */
+			if (!msgs[msg_cnt].tx_buff) {
+				spi->write(NULL, 0,
+					   (char *)msgs[msg_cnt].rx_buff, msgs[msg_cnt].bytes_number);
+			} else {
+				spi->write((const char *)msgs[msg_cnt].tx_buff, msgs[msg_cnt].bytes_number,
+					   (char *)msgs[msg_cnt].rx_buff, msgs[msg_cnt].bytes_number);
+			}
+
+			if (msgs[msg_cnt].cs_change) {
+				csb->write(GPIO_HIGH);
+			}
+		}
+
+		csb->write(GPIO_HIGH);
+		return SUCCESS;
+	}
+
+	return FAILURE;
+}
+
 #ifdef __cplusplus  // Closing extern c
 }
 #endif //  _cplusplus