libopencm3-examples icon indicating copy to clipboard operation
libopencm3-examples copied to clipboard

If there is an spi_init_master, there should be an spi_init_slave.

Open rewolff opened this issue 10 years ago • 1 comments

I have added spi_init_slave.

The change looks straightforward and should work. But it's untested, will move on to testing this shortly. Hmmm.... We could remove the baud rate parameter in the _init_slave call. ok, we SHOULD remove.... Done.

I renamed the "br" parameter to "baud" because "br" confused me for a split second.

cat ../../spi_init_slave.patch
diff --git a/include/libopencm3/stm32/common/spi_common_all.h b/include/libopencm3/stm32/common/spi_common_all.h
index fa4affb..a77fcbf 100644
--- a/include/libopencm3/stm32/common/spi_common_all.h
+++ b/include/libopencm3/stm32/common/spi_common_all.h
@@ -386,7 +386,9 @@ specific memorymap.h header before including this header file.*/
 BEGIN_DECLS

 void spi_reset(uint32_t spi_peripheral);
-int spi_init_master(uint32_t spi, uint32_t br, uint32_t cpol, uint32_t cpha,
+int spi_init_master(uint32_t spi, uint32_t baud, uint32_t cpol, uint32_t cpha,
+                   uint32_t dff, uint32_t lsbfirst);
+int spi_init_slave(uint32_t spi, uint32_t cpol, uint32_t cpha,
                    uint32_t dff, uint32_t lsbfirst);
 void spi_enable(uint32_t spi);
 void spi_disable(uint32_t spi);
diff --git a/lib/stm32/common/spi_common_f03.c b/lib/stm32/common/spi_common_f03.c
index 5713653..486bd48 100644
--- a/lib/stm32/common/spi_common_f03.c
+++ b/lib/stm32/common/spi_common_f03.c
@@ -89,17 +89,17 @@ spi_lsbfirst.
 @returns int. Error code.
 */

-int spi_init_master(uint32_t spi, uint32_t br, uint32_t cpol, uint32_t cpha,
-                   uint32_t crcl, uint32_t lsbfirst)
+int spi_init_master_slave (uint32_t spi, uint32_t baud, uint32_t cpol, uint32_t cpha,
+                          uint32_t crcl, uint32_t lsbfirst, uint32_t master)
 {
        uint32_t reg32 = SPI_CR1(spi);

        /* Reset all bits omitting SPE, CRCEN and CRCNEXT bits. */
        reg32 &= SPI_CR1_SPE | SPI_CR1_CRCEN | SPI_CR1_CRCNEXT;

-       reg32 |= SPI_CR1_MSTR;  /* Configure SPI as master. */
+       reg32 |= master;        /* Configure SPI as master. */

-       reg32 |= br;            /* Set baud rate bits. */
+       reg32 |= baud;          /* Set baud rate bits. */
        reg32 |= cpol;          /* Set CPOL value. */
        reg32 |= cpha;          /* Set CPHA value. */
        reg32 |= crcl;          /* Set crc length (8 or 16 bits). */
@@ -112,6 +112,20 @@ int spi_init_master(uint32_t spi, uint32_t br, uint32_t cpol, uint32_t cpha,
        return 0; /* TODO */
 }

+int spi_init_master(uint32_t spi, uint32_t baud, uint32_t cpol, uint32_t cpha,
+                    uint32_t dff, uint32_t lsbfirst)
+{
+       return spi_init_master_slave(spi, baud, cpol, cpha, dff, lsbfirst, SPI_CR1_MSTR);
+}
+
+
+int spi_init_slave(uint32_t spi, uint32_t cpol, uint32_t cpha,
+                   uint32_t dff, uint32_t lsbfirst)
+{
+       return spi_init_master_slave(spi, 0, cpol, cpha, dff, lsbfirst, 0); // maybe we should have a define for SLAVE
+}
+
+
 void spi_send8(uint32_t spi, uint8_t data)
 {
        /* Wait for transfer finished. */
diff --git a/lib/stm32/common/spi_common_l1f124.c b/lib/stm32/common/spi_common_l1f124.c
index 6345350..0d05364 100644
--- a/lib/stm32/common/spi_common_l1f124.c
+++ b/lib/stm32/common/spi_common_l1f124.c
@@ -89,17 +89,17 @@ spi_lsbfirst.
 @returns int. Error code.
 */

-int spi_init_master(uint32_t spi, uint32_t br, uint32_t cpol, uint32_t cpha,
-                   uint32_t dff, uint32_t lsbfirst)
+int spi_init_master_slave(uint32_t spi, uint32_t baud, uint32_t cpol, uint32_t cpha,
+                         uint32_t dff, uint32_t lsbfirst, uint32_t master)
 {
        uint32_t reg32 = SPI_CR1(spi);

        /* Reset all bits omitting SPE, CRCEN and CRCNEXT bits. */
        reg32 &= SPI_CR1_SPE | SPI_CR1_CRCEN | SPI_CR1_CRCNEXT;

-       reg32 |= SPI_CR1_MSTR;  /* Configure SPI as master. */
+       reg32 |= master;        /* Configure SPI as master (or not). */

-       reg32 |= br;            /* Set baud rate bits. */
+       reg32 |= baud;          /* Set baud rate bits. */
        reg32 |= cpol;          /* Set CPOL value. */
        reg32 |= cpha;          /* Set CPHA value. */
        reg32 |= dff;           /* Set data format (8 or 16 bits). */
@@ -112,6 +112,21 @@ int spi_init_master(uint32_t spi, uint32_t br, uint32_t cpol, uint32_t cpha,
        return 0; /* TODO */
 }

+
+int spi_init_master(uint32_t spi, uint32_t baud, uint32_t cpol, uint32_t cpha,
+                   uint32_t dff, uint32_t lsbfirst)
+{
+       return spi_init_master_slave(spi, baud, cpol, cpha, dff, lsbfirst, SPI_CR1_MSTR);
+}
+
+
+int spi_init_slave(uint32_t spi, uint32_t cpol, uint32_t cpha,
+                  uint32_t dff, uint32_t lsbfirst)
+{
+       return spi_init_master_slave(spi, 0, cpol, cpha, dff, lsbfirst, 0); // maybe we should have a define for SLAVE
+}
+
+
 /*---------------------------------------------------------------------------*/
 /** @brief SPI Set Data Frame Format to 8 bits

rewolff avatar May 18 '14 10:05 rewolff

Update: Tested! (and works. :-) )

rewolff avatar May 18 '14 11:05 rewolff