M5Stackの充電制御IC IP5306のネット上に分散していたレジスタ情報をまとめる

#初めに
M5StackのLiPoの充電制御に使われているIP5306はI2Cで制御できます。バッテリーの充電レベルの取得及び充電電流の制御をしてみるために、ネット上に分散しているレジスタ情報をまとめました。

#IP5306について
IP5306は中国の**英集芯科技有限公司(Injoinic Technology, http://www.injoinic.com/)**製のモバイルバッテリー用SoCです。標準品は充電電流2.1A/放電電流2.4A固定となっています。
M5Stackの発売当初は標準品が使用されていましたが、途中からI2Cバス経由で各種パラメータが制御できるカスタム版に変更されています。
標準版のデータシートはメーカーのサイトからダウンロードができます。
http://www.injoinic.com/wwwroot/uploads/files/20200221/0405f23c247a34d3990ae100c8b20a27.pdf

#参考資料の入手先
###I2C制御ができるカスタム版のレジスタ資料(M5Stackのドキュメントページ)
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/IIC_IP5306_REG_V1.4_cn.pdf

###I2Cバスの仕様書(NXPから入手)
https://www.nxp.com/docs/ja/user-guide/UM10204.pdf

IP5306CのSlave Addressは0xEAですが、I2CのSlave Addressの0bit目はread/write bitですので、ArduinoIDEやUIFlowからは上位7bit表記の**0x75**でアクセスします。

###その他の資料
カスタム版のレジスタ資料にはバッテリー充電量や充電モードに関するレジスタので記載がないので、ネットで公開されている情報を参考にしました。

####バッテリー充電量の取得
http://www.szjuquan.com/news/bencandy.php?&fid=18&id=2091

####充電モードの取得
https://github.com/lovyan03/M5Stack_LovyanLauncher/blob/master/LovyanLauncher/src/Header.cpp

#IP5306_I2Cのレジスタマップ(日本語版)
赤字の箇所はオリジナルのレジスタ資料には存在しないため追記

##SYS_CTL0
resister: 0x00
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/fe1c3b72-c78e-7508-f579-9c8c7fb81d49.png)

##SYS_CTL1
resister: 0x01
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/fbc79bdc-c3a8-1c02-c017-d8233be6138b.png)

##SYS_CTL2
resister: 0x02
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/252112c2-8e89-f242-1e26-97a7869bb8af.png)

##Charge_CTL0
resister: 0x20
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/7d38f8ab-2407-62a8-5d64-1ccd19114cda.png)

##Charge_CTL1
resister: 0x21
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/6cb2f526-d88b-71aa-825d-084b0d01aebc.png)

##Charge_CTL2
resister: 0x22
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/7486ab3f-6f46-74fb-cc68-402d8c32343d.png)

##Charge_CTL3
resister: 0x23
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/25b2f234-fce2-1593-bc08-8febcd88d981.png)

##CHG_DIG_CTL0
resister: 0x24
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/779e9bff-a1df-8f80-0fc8-817764761fdf.png)

##REG_READ0
resister: 0x70
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/60f4fa2d-c747-76c9-26c4-321d6bba0ae6.png)

##REG_READ1
resister: 0x71
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/98cc1f66-2d39-10f2-fc58-091b8cfa9063.png)

##REG_READ2
resister: 0x72
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/a3370500-87f7-11c6-4228-d1c7ce2d7a6f.png)

##REG_READ3
resister: 0x77
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/3d9d1dfc-f429-06bb-19bf-bd796d8d9cef.png)

##REG_READ4
resister: 0x78
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/0ddff335-a65a-e9de-5f4a-707f9dcaecf8.png)

#充電電流の制御方法
LiPoバッテリーの充電電流は、**CHG_DIG_CTL0(0x24)**の[4:0]に設定値を書き込むことでコントロールできます。
Arduino IDEのM5Stack libraryではPOWERクラスにある**setVinMaxCurrent()**関数で充電電流が設定できます。
各ビットの電流値は**Power.cpp**で定義されていますので、これをORして引数で渡してやればOKです。
#### 2022/06/10追記
POWERクラスが変更されて、電流値の定義がライブラリ外から参照できなくなってしまいました。
使用する場合は、スケッチの中で以下の各電流値の定数を定義してください。

```Power.cpp
//- CHG
#define CURRENT_100MA  (0x01 << 0)
#define CURRENT_200MA  (0x01 << 1)
#define CURRENT_400MA  (0x01 << 2)
#define CURRENT_800MA  (0x01 << 3)
#define CURRENT_1600MA  (0x01 << 4)
```
例えば、M5Stack BASICのボトム(LiPo:110mAh)を使うときは、スケッチのsetup()の最初に以下のように記載してやることで、充電電流オーバーによるLiPoの劣化をある程度防げるはずです。

```xxx.ino
setup(){
  M5.begin();
  M5.Power.begin();
  M5.Power.setVinMaxCurrent(CURRENT_100MA) ;
```

#まとめ
これでIP5306の情報取得及び設定が一通り可能になります。
UIFlowでの動作確認までは出来ているので、Arduino IDEでも動作確認したらスケッチをgithubにでもアップする予定です。