Re: SW SPI bus reading data

Uwe Bonnes <bon-1JbLm1bU5j5ZIx36JBfelj3+ndqKAYMe9FMPySWZwLkb1SvskN2V4Q@public.gmane.org> Fri, 2 Sep 2016 11:38:48 +0200
Newsgroups gmane.comp.hardware.microcontrollers.ethernut
Message-ID <[email protected]>
>>>>> "Aigars" == Aigars  <[email protected]> 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-1JbLm1bU5j5ZIx36JBfelj3+ndqKAYMe9FMPySWZwLkb1SvskN2V4Q@public.gmane.org

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 1623569 ------- Fax. 06151 1623305 ---------
_______________________________________________
http://lists.egnite.de/mailman/listinfo/en-nut-discussion