2015年10月10日土曜日

mbed で、spiでシリアル連続受信。

おひさぶり、やましょうです。

mbedでspi slaveって機能があるのですが、これでと8bitか16bitでしか受信できない。
lpc1768ではsspを使用してdma使用して、連続受信できると思うのですが、
dma使用した場合に可変長受信できるか不明。
波形的には下記のような波形ですね。



方法1.これをlpc1768で8bit単位取得。
SPIを設定する。

初期設定で下記を設定
    LPC_SC->PCONP           |=  (1 << 8);
    LPC_SC->PCLKSEL0        &= ~(3 << 16);
    LPC_PINCON->PINSEL0     |= uint32_t(3 << 30);
    LPC_PINCON->PINSEL1     |=  (3 << 0);
    LPC_PINCON->PINSEL1     |=  (3 << 2);
    LPC_PINCON->PINSEL1     |=  (3 << 4);
    LPC_SPI->SPCR            = (1 << 7);
    Dummy                     = LPC_SPI->SPSR;
    LPC_SSP1->DR         = Dummy;
    LPC_SPI->SPDR            = 0x00;
    LPC_SPI->SPINT           = (1 << 0);

    NVIC_SetVector(SPI_IRQn, (uint32_t) &IntSpi);
    NVIC_SetPriority(SPI_IRQn, 8);
    NVIC_EnableIRQ(SPI_IRQn);

そして割込み内で
void IntSpi(void)
{
    uint8_t Dummy  = LPC_SPI->SPDR;
        LPC_SSP1->DR  = Dummy;
        LPC_SPI->SPINT = (1 << SPIF);
}

これで動く模様。
私は2ch同時に受信したい。
ってことで没

(Nxpのシリアル系って他のメーカと比べてあまりにも独自な仕様ですよね。
しかもアプリケーションマニアルに、回路のブロック構成も書いてないので詳細がわからない。)


ここで救世主のSTちゃんの登場です。
STはレジスターの説明とは細かく書いていないのですが、ブロック図がちゃんと書いてあり
これならできそうと直感的に動きそうと言うことで実装です。

STだとこれだけ
 初期化部

    Slave1.format ( 8, 3 );
    Slave2.format ( 8, 3 );

   SPI1->CR2 |= 0x40;   // 割り込み許可
   SPI2->CR2 |= 0x40;   // 割り込み許可   NVIC_SetVector(SPI1_IRQn, (uint32_t) &IntSpi1);
   NVIC_EnableIRQ(SPI1_IRQn);
優先順位はお好きに

   NVIC_SetVector(SPI2_IRQn, (uint32_t) &IntSpi2);
   NVIC_EnableIRQ(SPI2_IRQn);

優先順位はお好きに

void IntSpi1(void)
{
  uint8_t     Dummy    = SPI1->DR;
                SPI1->DR = Dummy;
}


void IntSpi2(void)
{
  uint8_t     Dummy    = SPI2->DR;
                SPI2->DR = Dummy;
}

 って簡単にできました。

STさん、回路が単純で素敵です。
でも去年のetでボード送付してくれる筈がいまだに届いていないのでそろそろ送付してください.w
  
それではまた次回。