2017年
3月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2017-03-16 それぞれのコマンドでやっていること

_ arduino UNOでI2C

I2Cを使うと,二本の信号線でアドレスの異なる128個のICと通信できる.AVRやESP8266でI2Cを使ったことはあったが,arduino UNOでI2Cをやろうとしたら,少し間違えたので,その仕組みを調べてみた.

初期化はWire.begin()で行なう.

ICに命令を送るときには,Wire.beginTransmission(adrs)とWire.write(data)とWire.endTransmission()を使う.ソースを見てみると,beginTransmissionではアドレスを定義するだけで,実際には通信は行なわず.writeではバッファに書き込んで,ここでも通信は行なわない.実際に通信が行なわれるのは,endTransmissionのときで,twi_writeToというコマンドを使って,アドレスやデータが送られる.

一方データを読み込むときには,Wire.requestFrom(adrs,bytes)とWire.read()を使うのだが,最初はbeginTransmissionとreadなどでやろうとしてしまった.読み込みでも,アドレスの送信を行なうので,そう考えてしまった.しかし,実際には,requestFromのときにtwi_readFromというコマンドを使って一気にバッファに読み込んでおり,このコマンドが無いと読み込みは行なわれない.その後で使うreadでは,バッファから読み込んでいるだけなのである.

書き込みの時はコマンドを三つ使って,読み込みの時は二つなのは,対称性が悪いなと思っていたが,このように,コマンドの内容を理解すると,そうなってしまう必然性が分かった.