1

GPDMA コントローラを使用して SSP1 チャネルにアクセスしようとしています。CMSIS ライブラリを使用すると、これは包括的になります。しかし、SSP1 の出力には何も見えません。

最初の例として、1 バイトを送信したいとします。

uint8_t buffer[20] = { 0x9F };

int main(void)
{
  // ... using PINSEL_ConfigPin to configure the SSP1 pins...

  // configure SSP
  SSP_CFG_Type ssp_config;
  ssp_config.Databit = SSP_DATABIT_8;
  ssp_config.CPHA = SSP_CPHA_SECOND;
  ssp_config.CPOL = SSP_CPOL_LO;
  ssp_config.Mode = SSP_MASTER_MODE;
  ssp_config.FrameFormat = SSP_FRAME_SPI;
  ssp_config.ClockRate = 4500000;

  SSP_Init(LPC_SSP1, &ssp_config);
  SSP_Cmd(LPC_SSP1, ENABLE);

  // configure GPDMA
  GPDMA_Channel_CFG_Type dma_config;

  dma_config.ChannelNum = GPDMA_CONN_SSP1_Tx;
  dma_config.TransferSize = 1;                   // <-- (A)
  dma_config.TransferWidth = 0; // M2M only
  dma_config.SrcMemAddr = (uint32_t)&buffer[0];
  dma_config.DstMemAddr = 0;
  dma_config.TransferType = GPDMA_TRANSFERTYPE_M2P;
  dma_config.SrcConn = 0;
  dma_config.DstConn = GPDMA_CONN_SSP1_Tx;
  dma_config.DMALLI = 0;

  Status status = GPDMA_Setup(&dma_config);

  // (B) this was just a try
  LPC_SC->DMAREQSEL |= (1 << dma_config.DstConn);

  // now start DMA
  GPDMA_ChannelCmd(4, ENABLE);
}

注釈: (A) サイズを変更しました: 0、1、20、いくつかの値 何も変更されません (B) CMSIS 実装では、常に DMAREQSEL レジスタのビットがリセットされます。を設定する必要があると思うので、この行を追加しました。しかし、結果は変わりません。

LPC_SSP1 レジスタを直接読み書きする SSP ポーリング機能を使用すると、ロジック アナライザで転送を確認できます。しかし、GPDMA を使用すると何も起こりません。アプローチの何が問題になっていますか?

そこに実用的な例はありますか?

4

1 に答える 1

1

セットアップが不完全でした。DMA が転送の準備ができている間、SSP インターフェイスは DMA アクセスを有効にする必要があります。

関数の末尾の前の次の行により、機能します。

SSP_DMACmd(LPC_SSP1, SSP_DMA_TX, ENABLE);
于 2014-02-27T15:22:05.493 に答える