[En-Nut-Discussion] SW SPI bus reading data

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Fri Sep 2 11:38:48 CEST 2016


>>>>> "Aigars" == Aigars  <aigars at egle.cs.rtu.lv> writes:

    Aigars> Hello.  Is there some examples on how to read data from SPI
    Aigars> interface ? For given case I need to read temperature from
    Aigars> MAX6675 thermocouple attached to F port on 2.1B version
    Aigars> board. As I understand there is SW bitbanging possibility in
    Aigars> configuration, but wiki topic on SPI is little to complex for my
    Aigars> level...

All those legacy SPI drivers make things hard to understand. It is also a
pity that the Wiki is offline.  The spibus
driver is the most recent. For spibus do: 

-First, you need to define the pin settings for the bitbang driver. E.g. 
for the nucleo_l476rg board I have:

SBBI0_CS0_PORT  = "NUTGPIO_PORTA"
SBBI0_CS0_PIN   = "4"
SBBI0_CS1_PORT  = "NUTGPIO_PORTB"
SBBI0_CS1_PIN   = "5"
SBBI0_SCK_PORT  = "NUTGPIO_PORTA"
SBBI0_SCK_PIN   = "5"
SBBI0_MISO_PORT = "NUTGPIO_PORT"
SBBI0_MISO_PIN  = "6"
SBBI0_MOSI_PORT = "NUTGPIO_PORTA"
SBBI0_MOSI_PIN  = "7"

Either do that in the <board>.conf file or use qnutconf
Device Drivers-> Serial Bit Banged Interface 0

- Now define your device, like

/*!
 * \brief First ILI9341 LCD Controller SPI node implementation structure.
 */
NUTSPINODE nodeIli9341_0 = {
    NULL,                       /*!< \brief Pointer to the bus controller driver, node_bus. */
    NULL,                       /*!< \brief Pointer to the bus device driver specific settings, node_stat. */
    ILI9341_0_SPI_RATE,         /*!< \brief Initial clock rate, node_rate. */
    ILI9341_SPI_MODE,           /*!< \brief Initial mode, node_mode. */
    8,                          /*!< \brief Initial data bits, node_bits. */
    FB0_CS_INDEX,               /*!< \brief Chip select, node_cs. */
    &ili9341_0_dcb,             /*!< \brief Pointer to our private device control block, node_dcb. */
};

Register your device like:
rc = NutRegisterSpiDevice(&DEV_FB, &DEF_SPIBUS, FB0_CS_INDEX);

Now talk to your device lik
    rc = (*bus->bus_alloc) (node, 0);
    data[0] = LS0XX_CMD_CLEAR_ALL;
    data[1] = 0;
    data[2] = 0;
    data[3] = 0;
    if (rc == 0) {
        rc = (*bus->bus_transfer) (node, &data, NULL, 4);
        if (rc == 0) {
            (*bus->bus_wait) (node, NUT_WAIT_INFINITE);
        }
        (*bus->bus_release) (node);
    }
    return rc;

I hope I did not miss anything. Please give feedback on Success/error.

Bye
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 1623569 ------- Fax. 06151 1623305 ---------


More information about the En-Nut-Discussion mailing list