Spresense sdk v1.5.0(VS code)を使っています

app追加で、myappを作成しました

myapp_main()の中から、spi4を使いたいです

イメージは下記ですが、インクルードも通らないし  
使い方が、全くわかりません

```

    \#include "cxd56_spi.h"
    
    spi_dev_s * spi4;
    
    int myapp_main(int argc, char *argv[]) {
    
      printf("myapp spi test\n");
    
      spi4 = cxd56_spibus_initialize(4);
    
      printf("freq %d\n",  spi4->frequency);
    
      return 0;
    }
    
```

加えて、読み書きを同時に、例えば、4byte実行したいのですが、  
読み書き一発の関数もわかりません  
最初は、loopbackイメージ

Arduino IDEだと直線的アプローチでできるのですが、

nuttxのドライバへ登録見たいな感じになるのでしょうか？

ps. サンプルコードにあればよかったのですが、見当たらず

* * *

将来的にはDMAを使いたいです

```

    ■SDKコンフィグ
    *CXD56xx Configuration
    SPI*
    > ✔︎ CXD56_SPI
    
    *CXD56xx Configuration ➤ SPI
    SPI4*
    
    > ✔︎ CXD56_SPI4
    
    *CXD56xx Configuration ➤ SPI ➤ SPI4
    DMAC support for SPI4 TX*
    > ✔︎ CXD56_DMAC_SPI4_TX
    
    *CXD56xx Configuration ➤ SPI ➤ SPI4
    DMAC support for SPI4 RX*
    > ✔︎ CXD56_DMAC_SPI4_RX
    
```
CC BY-SA 4.0
2020-02-03T13:36:15.933
62749
2020-04-15T00:19:08.970
2020-02-04T00:20:11.273
3060
34647
question
spresense
Spresense sdk spi4をmyappから利用するには
SpresenseのSPIを使っているLCDのドライバの実装を見ると、  
spresense/nuttx/include/nuttx/spi/spi.hに定義されているマクロを使って操作するようです。  
なので、インクルードするファイルは2つで、

```

    #include <nuttx/spi/spi.h>
    #include <cxd56_spi.h>
    
```

で行けると思います。

初期化処理ですが、  
DMAを使う場合は、別にDMAの設定が必要なようです。

sdk/bsp/board/common/src/cxd56_ili9340.c:347行目付近から抜粋

```

          spi = cxd56_spibus_initialize(DISPLAY_SPI);
          hdl = cxd56_dmachannel(DISPLAY_DMA_TXCH, DISPLAY_DMA_TX_MAXSIZE);
          if (hdl)
            {
              conf.channel_cfg = DISPLAY_DMA_TXCH_CFG;
              conf.dest_width  = CXD56_DMAC_WIDTH8;
              conf.src_width   = CXD56_DMAC_WIDTH8;
              cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_TX, hdl, &conf);
            }
          hdl = cxd56_dmachannel(DISPLAY_DMA_RXCH, DISPLAY_DMA_RX_MAXSIZE);
          if (hdl)
            {
              conf.channel_cfg = DISPLAY_DMA_RXCH_CFG;
              conf.dest_width  = CXD56_DMAC_WIDTH8;
              conf.src_width   = CXD56_DMAC_WIDTH8;
              cxd56_spi_dmaconfig(DISPLAY_SPI, CXD56_SPI_DMAC_CHTYPE_RX, hdl, &conf);
            }
    
```

SPIのモードなどの設定は、nuttx/spi/spi.hに定義されているマクロを使っているようです。

```

          SPI_SETMODE(priv->spi, SPIDEV_MODE3);
          SPI_SETBITS(priv->spi, 8);
          SPI_HWFEATURES(priv->spi, 0);
          SPI_SETFREQUENCY(priv->spi, ILI9340_SPI_MAXFREQUENCY);
    
```

あとは、送受信を同時に行うには、SPI_EXCHANGE()というマクロを使えば良いようです。

使い方はnuttxのヘッダに記載があります。  
nuttx/include/nuttx/spi/spi.h:377行目から

```

    /****************************************************************************
     * Name: SPI_EXCHANGE
     *
     * Description:
     *   Exahange a block of data from SPI. Required.
     *
     * Input Parameters:
     *   dev      - Device-specific state data
     *   txbuffer - A pointer to the buffer of data to be sent
     *   rxbuffer - A pointer to the buffer in which to receive data
     *   nwords   - the length of data that to be exchanged in units of words.
     *              The wordsize is determined by the number of bits-per-word
     *              selected for the SPI interface.  If nbits <= 8, the data is
     *              packed into uint8_t's; if nbits >8, the data is packed into
     *              uint16_t's
     *
     * Returned Value:
     *   None
     *
     ****************************************************************************/
    
```

最後に、cxd56_spi.hがインクルードエラーになるのは、  
デフォルトでインクルードパスが通っていないためのようで、それを通すには、  
myappのディレクトリの.vscode/application.mkの中の71行目辺りに、  
CFLAGSとCXXFLAGSの定義があるので、  
その後ろの行に、

```

    CFLAGS += -I $(SDKTOP)/bsp/src
    CXXFLAGS += -I $(SDKTOP)/bsp/src
    
```

を加えてパスを追加すれば良いと思います。

参考になれば幸いです。
CC BY-SA 4.0
2020-04-15T00:12:12.547
65622
2020-04-15T00:19:08.970
2020-04-15T00:19:08.970
34651
34651
62749
answer