東芝から発売されているFlashAirを用いた開発を行う人々向けのまとめwikiです。※本wikiは東芝及びフィックスターズ、キオクシアとは何の関係もありません。お問合わせは管理者へお願いします。

×

概要

FlashAir単体でI2C通信を行います。
とりあえず、スイッチサイエンスの液晶は表示できました。受信関数は未テスト。
lib:pioduinoを内蔵して使っています。


ライセンス

スクリプト

sda0=0    --MOSI(SDO)
scl0=1    --MISO(SDI)

PIO_MODE = 0x00   --ピン入出力変数(触らないこと)
PIO_DATA  = 0x00   --ピン状態変数(触らないこと)

HIGH  = 0x1 --定数
LOW  = 0x0 --定数

INPUT  =  0x0 --定数
OUTPUT  =  0x1 --定数

function delay(t)
	sleep(t)
end

function digitalWrite(port,dat)
	local mask = bit32.lshift(1,port)
	local nmask = bit32.bnot (mask)

	if(dat == LOW) then
		PIO_DATA = bit32.band(PIO_DATA, nmask)
	else
		PIO_DATA = bit32.bor(PIO_DATA, mask)	
	end

	return fa.pio(PIO_MODE,PIO_DATA)
end

function digitalRead(port)
	local PIO_STATUS = 0
	local mask = bit32.lshift(1,port)
	
	PIO_STATUS, PIO_INFO = fa.pio(PIO_MODE, PIO_DATA)
	
	if(bit32.btest (PIO_INFO,mask)) then
		return HIGH, PIO_STATUS
	end
	
	return LOW, PIO_STATUS
--(IF文や他の関数に直接突っ込めるよう、第一引数にポート状態を置いてある)
end

function pinMode(port,mode)
	local mask = bit32.lshift(1,port)
	local nmask = bit32.bnot (mask)

	if (mode == OUTPUT) then
		PIO_MODE = bit32.bor(PIO_MODE, mask)	
	else
		PIO_MODE = bit32.band(PIO_MODE, nmask)
	end

	return fa.pio(PIO_MODE,PIO_DATA)
end

dW = digitalWrite
dR = digitalRead
pM = pinMode

function I2C_START()
   digitalWrite(sda0,LOW);
   digitalWrite(scl0,LOW);
 
   pinMode(scl0,INPUT);
   pinMode(sda0,INPUT);

   pinMode(scl0,INPUT);
   pinMode(sda0,OUTPUT);

   pinMode(scl0,OUTPUT);
   pinMode(sda0,OUTPUT);
end

function I2C_STOP()
   digitalWrite(sda0,LOW);
   digitalWrite(scl0,LOW);
 
   pinMode(scl0,INPUT);
   pinMode(sda0,OUTPUT);

   pinMode(scl0,INPUT);
   pinMode(sda0,INPUT);

end

function I2C_ADR(a,x)
    local t = bit32.lshift(a,1)
    t = bit32.band(t,0xFE)
    t = bit32.bor(t,x)
    
    return I2C_WRITE(t);
end

function I2C_WRITE(d)
   digitalWrite(sda0,LOW);
   digitalWrite(scl0,LOW);
 
  pinMode(scl0,OUTPUT);
  
  for i=0,7 do
 x = bit32.lshift(d,i)
  
    if(bit32.btest(x,0x80)) then
      pinMode(sda0,INPUT);
    else
      pinMode(sda0,OUTPUT);    
 end

  pinMode(scl0,INPUT);

  pinMode(scl0,OUTPUT);

  end

  pinMode(sda0,INPUT);
  local ack = digitalRead(sda0);
  pinMode(scl0,INPUT); --アクノリッジ

  pinMode(scl0,OUTPUT);  

  return ack;
end

function I2C_READ(d)
  local dat = 0;
  digitalWrite(sda0,LOW);
  digitalWrite(scl0,LOW);
 
  pinMode(scl0,OUTPUT);
  pinMode(sda0,INPUT);
  
  for i=0,7 do
    pinMode(scl0,INPUT); --変化確定
    --読み出し処理を入れる
    
    dat = bit32.bleft(dat,1);
    if(digitalRead(sda0) == HIGH)then
      dat = bit32.bor(dat,1)
    end
    
    pinMode(scl0,OUTPUT); --相手変化
  end

  pinMode(sda0,OUTPUT);--アクノリッジ送出

  pinMode(scl0,INPUT); --アクノリッジ確定

  pinMode(scl0,OUTPUT);  

  return dat;
end

function i2c_print(s)
 local sl = string.len(s);

 I2C_START();
 I2C_ADR(0x3E,0); --READ/WRITE
 I2C_WRITE(0x40);
 for i=1,sl do
 local c = string.byte(s,i);
 I2C_WRITE(c);
 end
 I2C_STOP();

end

 digitalWrite(sda0,LOW);
 digitalWrite(scl0,LOW);
 
 pinMode(sda0,INPUT);
 pinMode(scl0,INPUT);

--初期化
 I2C_START();
 I2C_ADR(0x3E,0); --READ/WRITE
 I2C_WRITE(0x00); 
 I2C_WRITE(0x38); 
 I2C_WRITE(0x39); 
 I2C_WRITE(0x14); 
 I2C_WRITE(0x70); 
 I2C_WRITE(0x56); 
 I2C_WRITE(0x6c);
 I2C_STOP();

 delay(100);

 I2C_START();
 I2C_ADR(0x3E,0); --READ/WRITE
 I2C_WRITE(0x00); 
 I2C_WRITE(0x38); 
 I2C_WRITE(0x0d); 
 I2C_WRITE(0x01);
 I2C_STOP();

--完了

 delay(100);
 i2c_print("I2C LCD");


--下段に移動
 I2C_START();
 I2C_ADR(0x3E,0); --READ/WRITE
 I2C_WRITE(0x00); 
 I2C_WRITE(0xC0); 
 I2C_STOP();

 i2c_print("FlashAir");
 
 print("OK")

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

スマートフォンの方は画面下部よりPC版に切り替えることをおすすめします

アクセス解析中

忍者アナライズ

GoogleAnalytics

編集にはIDが必要です

広告募集中