はじめに

Contiki OS + TelosBで実験をしていると、スリープ時でも消費電流が690 uAと結構大きいことが発覚しました。 データシートを見ると数 uAぐらいまでは落ちるはずです。 いろいろ調べたところ、Contiki OSの本体の深いところまでいじらないといけない様子。

Flashメモリのpower down

TelosBはフラッシュメモリとしてM25P80を使ってます。 ところがContiki OSにはM25P80をPower Downモードにするコマンドが実装されてません。 というわけで以下のコードを追加します。

core/dev/xmem.h

以下を追加。

void xmem_deep_power_down(void);
int xmem_release_from_deep_power_down(void);

platform/sky/dev/xmem.c

void
xmem_deep_power_down(void)
{
  spl_t s;

  s = splhigh();
  SPI_FLASH_ENABLE();

  SPI_WRITE(SPI_FLASH_INS_DP);
  
  SPI_FLASH_DISABLE();
  splx(s);
}

#define M25P80_SIGNATURE 0x13

int
xmem_release_from_deep_power_down(void)
{
  unsigned char signature;
  spl_t s;

  s = splhigh();
  SPI_FLASH_ENABLE();

  SPI_WRITE(SPI_FLASH_INS_RES);
  SPI_WRITE(0);                 /* Three dummy bytes */
  SPI_WRITE(0);                 /* Three dummy bytes */
  SPI_WRITE(0);                 /* Three dummy bytes */

  FASTSPI_CLEAR_RX();
  FASTSPI_RX(signature);

  SPI_FLASH_DISABLE();
  splx(s);

  if (signature == M25P80_SIGNATURE)
    return 0;                   /* Success */
  else
    return -1;                  /* Fail */
}

  添付編集
Last-modified: 2015-07-22 (水) 23:55:25 (759d)