# DIO

DIO (汎用IO) は、ファームウェアの制御で任意に入力または出力することができます。

{% hint style="info" %}
一般に GPIO とも呼ばれますが、本マニュアル中では DIO と呼称します。
{% endhint %}

汎用IOを用いて以下のことが可能です。

* デジタル入力 (H または L レベルの読み出し)
  * プルアップ (50kΩ, typ) を設定可能です。
* デジタル出力 (H または L レベルの出力)
  * 供給または吸い込み電流の最大値(3mA at 3V typ)です。
* 割り込み（立ち上がり、または、立ち下がり）
  * 立ち上がり、立ち下がりを同時には検出できません。
  * スリープ時にも利用可能です。

## ポート番号について

DIO は 0 番から 19 番まで 20 本が割り振られています。これらを順に DIO0 ... DIO19 と呼びます。以下に紹介する API では DIO の番号を直接指定します。

```
vPortAsInput(10); // set DIO10 as input
bool_t bPort = bPortRead(10);
   // TRUE: DIO10 is LO(GND) level
   // FALSE: DIO10 is HIGH(VCC) level
```

## 負論理について

TWELITE 無線マイコンにおいては、電源投入のリセット時のポート状態は High (Vcc) レベルになるため、TWELITE NET では原則として High(Vcc) レベルを 0, Lo(GND) レベルを 1 としています。

## 起動時の状態

電源投入時には全てのポートは以下の状態で初期化されます。

* 入力
* プルアップ有り

## 入力

ポートを入力に変更するには [vPortAsInput](https://sdk.twelite.info/twelite-net-api-ref/twelite-net-makuro/utils.h#vportasinput-c)() を呼びます。

```
#define PORT_DI1 11 // DIO11
vPortAsInput(PORT_DI1);
```

ポートの状態を読み出すには、[bPortRead](https://sdk.twelite.info/twelite-net-api-ref/twelite-net-makuro/utils.h#bportread-c)() を呼びます。

```
bool_t bPortStat;
bPortStat = bPortRead(PORT_DI1);
```

### 出力

ポートを出力に変更するには [vPortAsOutput](https://sdk.twelite.info/twelite-net-api-ref/twelite-net-makuro/utils.h#vportasoutput-c)(c) を呼びます。またポートの値を設定するには、[vPortSetLo](https://sdk.twelite.info/twelite-net-api-ref/twelite-net-makuro/utils.h#vportsetlo-c)(), [vPortSetHi](https://sdk.twelite.info/twelite-net-api-ref/twelite-net-makuro/utils.h#vportsetlo-c)(), [vPortSet\_TrueAsLo](https://sdk.twelite.info/twelite-net-api-ref/twelite-net-makuro/utils.h#vportset_trueaslo-c-s)() を呼びます。

```
#define PORT_DO1 18 // DIO18
vPortSet_TrueAsLo(PORT_DO1, TRUE); // TRUE: set Lo
vPortAsOutput(PORT_DO1);
```

{% hint style="info" %}
出力設定を行う前に、ポートの出力設定値を設定しておくことを推奨します。外部からポートの電圧を観察したとき、例えば一瞬GNDに落ちてVccレベルに戻るといった挙動が発生する場合があるためです。
{% endhint %}

### プルアップ

[vPortDisablePullup](https://sdk.twelite.info/twelite-net-api-ref/twelite-net-makuro/utils.h#vportdisablepullup-c)() を呼び出すことで、プルアップを停止することができます。

```
#define PORT_DI1 11 // DIO11

vPortDisablePullup(PORT_DI1);
vPortAsInput(PORT_DI1);
```

{% hint style="info" %}
プルアップを停止することで、以下の場合に省電力化となります。

* 入力ポートで外部がLoレベル
* 出力ポートで Lo レベルを設定する
  {% endhint %}

{% hint style="warning" %}
ただし、プルアップを停止したポートでは、以下のような利用に注意が必要です。

* 入力ポートに何も接続されていない（または相当の状態）
  * 余分な電流消費が発生する場合があります
* 設定が不要なポートのプルアップ停止
  * 余分な電流消費が発生する場合があります
* 入力ポートを割り込み起床ピンとた場合
  * ボタン等を接続する場合は、外部のプルアップが必須です。
    {% endhint %}
