import rp2
from machine import Pin
import utime
#-------------------------------------------------------
# 定数
sm_id = 0
ILI9341_DC_Pin = 22
ILI9341_RST_Pin = 26
ILI9341_CS_Pin = 27
# ピン設定
LED = Pin(25, Pin.OUT)
ILI9341_DC = Pin(ILI9341_DC_Pin, Pin.OUT)
ILI9341_RST = Pin(ILI9341_RST_Pin, Pin.OUT)
ILI9341_CS = Pin(ILI9341_CS_Pin, Pin.OUT)
# CS信号をLow(選択)に
ILI9341_CS.value(0);
#-------------------------------------------------------
# sidesetを使用し、SPIのMOSIとクロック信号を出力
@rp2.asm_pio(out_init=(rp2.PIO.OUT_LOW), sideset_init=(rp2.PIO.OUT_LOW))
def spi_tx_8bit():
pull(block).side(0) # 32bit分のデータ(FIFO)が溜まるまでブロック
out(null, 24).side(0) # 24bit分のデータを捨てる
label('send_data')
out(pins, 1).side(1) # 1bitのデータ送信、およびクロック信号
jmp(not_osre, 'send_data').side(0) # OSR(Output Shift Register)が空でなければ次のデータ、およびクロック信号
#-------------------------------------------------------
# sidesetを使用し、SPIのMOSIとクロック信号を出力
@rp2.asm_pio(out_init=(rp2.PIO.OUT_LOW), sideset_init=(rp2.PIO.OUT_LOW))
def spi_tx_16bit():
pull(block).side(0) # 32bit分のデータ(FIFO)が溜まるまでブロック
out(null, 16).side(0) # 16bit分のデータを捨てる
label('send_data')
out(pins, 1).side(1) # 1bitのデータ送信、およびクロック信号
jmp(not_osre, 'send_data').side(0) # OSR(Output Shift Register)が空でなければ次のデータ、およびクロック信号
#-------------------------------------------------------
# sidesetを使用し、SPIのMOSIとクロック信号を出力
@rp2.asm_pio(out_init=(rp2.PIO.OUT_LOW), sideset_init=(rp2.PIO.OUT_LOW))
def spi_tx_32bit():
pull(block).side(0) # 32bit分のデータ(FIFO)が溜まるまでブロック
label('send_data')
out(pins, 1).side(1) # 1bitのデータ送信、およびクロック信号
jmp(not_osre, 'send_data').side(0) # OSR(Output Shift Register)が空でなければ次のデータ、およびクロック信号
#-------------------------------------------------------
# pioのステートマシン設定
sm_ILI9341 = rp2.StateMachine(sm_id, spi_tx_8bit, freq=1_000_000, out_base=Pin(20), sideset_base=Pin(21))
sm_ILI9341.active(1)
#-------------------------------------------------------
# DC設定用関数
def set_ili9341_dc(val):
utime.sleep_ms(1)
if (val == 0):
ILI9341_DC.value(0) # コマンド送信
else:
ILI9341_DC.value(1) # データ送信
utime.sleep_ms(1)
#-------------------------------------------------------
# ILI9341の設定
ILI9341_RST.value(0) # HARDWARE Reset
utime.sleep_ms(100)
ILI9341_RST.value(1)
set_ili9341_dc(0) # コマンド送信
sm_ILI9341.put(0x01) # cmd SOFTWARE RESET
sm_ILI9341.put(0x13) # cmd Normal Display Mode ON
sm_ILI9341.put(0x36) # cmd Memory Access Control
set_ili9341_dc(1) # データ送信
sm_ILI9341.put(0x48) # data 縦画面, 左上から描画
set_ili9341_dc(0) # コマンド送信
sm_ILI9341.put(0x3a) # cmd Pixel Format Set
set_ili9341_dc(1) # データ送信
sm_ILI9341.put(0x55) # data 16Bits / 1Pixcel
set_ili9341_dc(0) # コマンド送信
sm_ILI9341.put(0x11) # cmd Sleep Out
sm_ILI9341.put(0x29) # cmd Display ON
# col方向の描画範囲
set_ili9341_dc(0) # コマンド送信
sm_ILI9341.put(0x2a) # cmd
set_ili9341_dc(1) # データ送信
sm_ILI9341.put(0x00) # data
sm_ILI9341.put(0x00) # data
sm_ILI9341.put(0x00) # data
sm_ILI9341.put(0xef) # data
# row方向の描画範囲
set_ili9341_dc(0) # コマンド送信
sm_ILI9341.put(0x2b) # cmd
set_ili9341_dc(1) # データ送信
sm_ILI9341.put(0x00) # data
sm_ILI9341.put(0x00) # data
sm_ILI9341.put(0x01) # data
sm_ILI9341.put(0x3f) # data
# 描画開始
set_ili9341_dc(0) # コマンド送信
sm_ILI9341.put(0x2c) # cmd Memory Write
set_ili9341_dc(1) # データ送信
#-------------------------------------------------------
# pioのステートマシン再設定
sm_ILI9341.active(0)
sm_ILI9341 = rp2.StateMachine(sm_id, spi_tx_32bit, freq=1_000_000, out_base=Pin(20), sideset_base=Pin(21))
sm_ILI9341.active(1)
for i in range(10000):
sm_ILI9341.put(0xaaaabbbb)
while True:
LED.value(1)
utime.sleep(1)
LED.value(0)
utime.sleep(1)