調査ターゲット
使われている項目
サンプルコードの中で登場するpico SDK関連のものを整理する。
include ファイル
includeは3つしている。
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/i2c.h"
使っているAPI
- stdio_init_all
- i2c_init
- gpio_set_function
- gpio_pull_up
- bi_decl
- bi_2pins_with_func
- i2c_write_blocking
- i2c_read_blocking
API仕様
全体構成
大きく分けると6つのライブラリ群に分けられる模様。
今回使ってるのは
pico/stdlib
Aggregation of a core subset of Raspberry Pi Pico SDK libraries used by most executables along with some additional utility methods. Including pico_stdlib gives you everything you need to get a basic program running which prints to stdout or flashes a LED.
基本的なライブラリを読み込んでいる模様。
この辺り
#include "pico.h"
#include "pico/stdio.h"
#include "pico/time.h"
#include "hardware/gpio.h"
#include "hardware/uart.h"
stdio_init_all()
標準入出力関係を初期化してくれる。
ここはちょっとよくわからなかった。
When stdio_usb is configured, this method can be optionally made to block, waiting for a connection via the variables specified in stdio_usb_init (i.e. PICO_STDIO_USB_CONNECT_WAIT_TIMEOUT_MS)
i2c_init()
名前の通りi2c通信の初期化をする。
第一引数
第一引数はi2c_inst_t* という型のデータだが、i2c_0かi2c_1のどちらかを使うように書かれている。
これらを使えということかな。
今回はi2c_defaultというマクロを使っていて、これが
ここで定義されている。
さらにいろいろ定義があるが、
__CONCATで“i2c”とPICO_DEFAULT_I2Cを文字列結合している。
PICO_DEFAULT_I2Cは
pico.hで定義されていて 0
である。
なので、
PICO_DEFAULT_I2C_INSTANCEは
i2c0
になる。
このi2c0は&i2c0_instである(
定義)。
第二引数
Hz単位のBaudrate。
サンプルでは、boardrateを400kHzにしているが、なぜこの値かよくわからなかった。
datasheetを見るとfast modeの時の最大値が400kHzだったが、それのことだろうか?
一旦ここまで
gpio_set_function()
第一引数で指定したピンを第二引数のGPIO機能を指定する。
第一引数
サンプルでは、はpico.hで指定しているデフォルトピンを使っている。
#ifndef PICO_DEFAULT_I2C
#define PICO_DEFAULT_I2C 0
#endif
#ifndef PICO_DEFAULT_I2C_SDA_PIN
#define PICO_DEFAULT_I2C_SDA_PIN 4
#endif
#ifndef PICO_DEFAULT_I2C_SCL_PIN
#define PICO_DEFAULT_I2C_SCL_PIN 5
#endif
デフォルト以外では下記のペア(SCL, SDAの順)が使える。
[GP1,GP0]、[GP3,GP2]、 [GP5,GP4]、 [GP7,GP6]、 [GP9,GP8]、 [GP11,GP10]、 [GP13,GP12]、[GP15,GP14]、 [GP17,GP16]、 [GP19,GP18]、 [GP21,GP20]、 [GP27,GP26]
https://www.denshi.club/parts/2021/04/raspberry-pi-pico-6.html
第二引数
図のenumの値を入れる。
今回は
GPIO_FUNC_I2C
gpio_pull_up()
治一引数で指定したピンをプルアップする。
The SDA and SCL I2C connections are open drain and therefore require a pullup resistor as shown in the application diagram in Figure 4
i2c_write_blocking()
ブロッキングしながら、指定したアドレスに渡したデータを書き込む。
第一引数
i2c_init()と同じ
第二引数
このページによるとAがSA0につながっていて、デフォルトは3.3VにプルアップしてつながっているためSAOが1になっている。そのため0x1Dになっている。
もしSA0を0にしたいならGNDにつなぐ。
第三、第四引数
書き込むデータとその長さ
第五引数
ちょっとよくわからなかった。
i2c_read_blocking()
指定したアドレスから指定した長さのデータを読み込む
サンプル内の具体的な処理
i2c_write_blocking()に関しては、何度か違う処理をしている。
それについて整理する。
モードの変更
mma8451_set_state()
書き込んでいるbufの中身は下記。
buf[0] = REG_CTRL_REG1; //0x2A
buf[1] = 0x00 or 0x01
datasheetを読むとスタンドバイモード/アクティブモードの切り替えの模様。
ダイナミックレンジの調整
buf[0] = REG_DATA_CFG; //0x0E
buf[1] = range_config; //0x01; // 0x00 for ±2g, 0x01 for ±4g, 0x02 for ±8g
ダイナミックレンジの調整をしていて、ここでは±4gにしている。
センサ値の読み取り
加速度センサのxを読み取るときは、i2c_read_blocking()の前にREG_X_MSB(0x01)を書き込み
yの時はREG_Y_MSB(0x03)、zの時はREG_Z_MSB(0x05)を書き込んでいる。