# 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](/twelite-net-api-ref/twelite-net-makuro/utils.h.md#vportasinput-c)() を呼びます。

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

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

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

### 出力

ポートを出力に変更するには [vPortAsOutput](/twelite-net-api-ref/twelite-net-makuro/utils.h.md#vportasoutput-c)(c) を呼びます。またポートの値を設定するには、[vPortSetLo](/twelite-net-api-ref/twelite-net-makuro/utils.h.md#vportsetlo-c)(), [vPortSetHi](/twelite-net-api-ref/twelite-net-makuro/utils.h.md#vportsetlo-c)(), [vPortSet\_TrueAsLo](/twelite-net-api-ref/twelite-net-makuro/utils.h.md#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](/twelite-net-api-ref/twelite-net-makuro/utils.h.md#vportdisablepullup-c)() を呼び出すことで、プルアップを停止することができます。

```
#define PORT_DI1 11 // DIO11

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

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

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

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sdk.twelite.info/hw-api-ref/perifuraru/dio.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
