2011-03-02 7 views
3

このトピック(DMA & SPI)はマイクロチップフォーラムの多数のスレッドで既に話題になっていますが、実際にはキーワード " dma "とdma & spiに関するすべてのトピックを読んでください。PIC32のDMA経由でSPIデータを受信

そして、私はまだ私の問題で立ち往生していますが、私は誰かが私を助けることができると思います:)ここで

が問題です。

私のチップはPIC32MX775F512Hです。 DMA経由でSPIを使用してデータを受信(受信のみ)しようとしています。 SPIで受信することはできず、SPIコアはSPIBUF(私にとってSPI1ABUF)に書き込む場合にのみ、2つのDMAチャネルを使用してデータを受信しようとしています。 送信側のDMA_CHANNEL1。 受信側のDMA_CHANNEL2。私はコピー

http://www.microchip.com/forums/tm.aspx?tree=true&high=&m=562453&mpage=1#

からのコードを貼り付けそして、それは運なしで動作するようにしようとしました。それは数バイト(5または6)しか受信しません。

私は両方のdmaチャネルのDMA_EV_BLOCK_DONEにEvent Enable Flagsを設定しましたが、割り込みは発生しません。

ご存知ですか?これら2つの割り込みハンドラと

int Spi_recv_via_DMA(SPI_simple_master_class* SPI_Port, int8u *in_bytes, int16u num_bytes2) 
{ 
DmaChannel dmaTxChn=DMA_CHANNEL1; 
DmaChannel dmaRxChn=DMA_CHANNEL2; 
SpiChannel spiTxChn=SPI_Port->channel; 
    int8u   dummy_input; 

    DmaChnOpen(dmaTxChn, DMA_CHN_PRI3, DMA_OPEN_DEFAULT); 
    DmaChnOpen(dmaRxChn, DMA_CHN_PRI3, DMA_OPEN_DEFAULT); 

    DmaChnSetEventControl(dmaTxChn, DMA_EV_START_IRQ_EN | DMA_EV_START_IRQ(_SPI1A_RX_IRQ)); 
    DmaChnSetEventControl(dmaRxChn, DMA_EV_START_IRQ_EN | DMA_EV_START_IRQ(_SPI1A_RX_IRQ)); 

    DmaChnClrEvFlags(dmaTxChn, DMA_EV_ALL_EVNTS); 
    DmaChnClrEvFlags(dmaRxChn, DMA_EV_ALL_EVNTS); 
    DmaChnSetEvEnableFlags(dmaRxChn, DMA_EV_BLOCK_DONE); 
    DmaChnSetEvEnableFlags(dmaTxChn, DMA_EV_BLOCK_DONE); 

    //SpiChnClrTxIntFlag(spiTxChn); 
    //SpiChnClrRxIntFlag(spiTxChn); 

    DmaChnSetTxfer(dmaTxChn, tx_dummy_buffer, (void *)&SPI1ABUF, num_bytes2, 1, 1); 
    DmaChnSetTxfer(dmaRxChn, (void *)&SPI1ABUF, in_bytes, 1, num_bytes2, 1); 

    while ((SPI1ASTAT & SPIRBE) == 0) 
     dummy_input = SPI1ABUF; 
    SPI1ASTAT &= ~SPIROV; 

    DmaRxIntFlag = 0; 
    DmaChnEnable(dmaRxChn); 
    DmaChnStartTxfer(dmaTxChn, DMA_WAIT_NOT, 0); 


    while(!DmaRxIntFlag); 
    return 1;  
} 

// handler for the DMA channel 1 interrupt 
void __ISR(_DMA1_VECTOR, ipl5) DmaHandler1(void) 
{ 
int evFlags;  // event flags when getting the interrupt 
    //LED_On(LED_CFG); 
INTClearFlag(INT_SOURCE_DMA(DMA_CHANNEL1)); // acknowledge the INT controller, we're servicing int 

evFlags=DmaChnGetEvFlags(DMA_CHANNEL1); // get the event flags 

    if(evFlags&DMA_EV_BLOCK_DONE) 
    { // just a sanity check. we enabled just the DMA_EV_BLOCK_DONE transfer done interrupt 
     DmaTxIntFlag = 1; 
    DmaChnClrEvFlags(DMA_CHANNEL1, DMA_EV_BLOCK_DONE); 
    } 
    // LED_Off(LED_CFG); 
} 

void __ISR(_DMA2_VECTOR, ipl5) DmaHandler2(void) 
{ 
int evFlags;  // event flags when getting the interrupt 

INTClearFlag(INT_SOURCE_DMA(DMA_CHANNEL2)); // acknowledge the INT controller, we're servicing int 

evFlags=DmaChnGetEvFlags(DMA_CHANNEL2); // get the event flags 

    if(evFlags&DMA_EV_BLOCK_DONE) 
    { // just a sanity check. we enabled just the DMA_EV_BLOCK_DONE transfer done interrupt 
     DmaRxIntFlag = 1; 
    DmaChnClrEvFlags(DMA_CHANNEL2, DMA_EV_BLOCK_DONE); 
    } 
} 

は、だから私はラインで永遠に待って終わる:ここ

は、私が使用していたコードであり、一方、(!DmaRxIntFlag)。

割り込みベクタにブレークポイントを入れましたが、決して呼び出されません。

これは、これまでに持続的な待機中のいくつかのレジスタの状態です:

DMACON 0x0000C800
DMASTAT 0x00000001の

私はSPI1Aポートを使用しています、DCH1SPTRの0x5
DCH1SSIZ

SPI1ABUFと_SPI1A_RX_IRQので、 0x2B

DCH2DPTR 0x6
DCH2DSI Z 0x2Bを

チャンネル1はチャンネル2
を送信するために使用される0x00000620

DCH2CON 0x00008083
DCH2ECON 0x1B10
DCH2INT 0x00800C4
DCH2SSA 0x1F805820
DCH2DSAはあなたが

+0

SPI接続の他端にはどのような種類のデバイスがありますか?私はそれが既にデータを送信しているモードにあると仮定しなければならないでしょうか? –

答えて

0
  1. を受信するために使用される

    スレーブモードでSPIを使用していますか?またはマスターモードでコマンドの応答を読み取ろうとしていますか?

  2. このチップのシリコンエラッタを確認しましたか? dspic 33fjファミリには、SPIスレーブモードが機能しないという問題がありました。

それ以外は、DmaRxIntFlagの変更を待つことをお勧めしません。 DMA転送を設定し、メインループを続行する必要があります。 DMAは割り込みハンドラをトリガします。

これが役に立ちます。

1

あなたはこれらの不足している:

DmaRxIntFlag = 0; 
DmaChnEnable(dmaRxChn); 
DmaChnStartTxfer(dmaTxChn, DMA_WAIT_NOT, 0); 

幸運前

INTEnable(INT_SOURCE_DMA(dmaTxChn), INT_ENABLED); // Tx 
INTEnable(INT_SOURCE_DMA(dmaRxChn), INT_ENABLED); // Rx 

rigth!

関連する問題