|
| 1 | +from .PassiveConnector_Fpc import Fpc050Bottom |
| 2 | +from ..abstract_parts import * |
| 3 | + |
| 4 | + |
| 5 | +class Er_Tft_128_3_Outline(InternalSubcircuit, FootprintBlock): |
| 6 | + """Footprint for TFT panel outline""" |
| 7 | + |
| 8 | + def contents(self) -> None: |
| 9 | + super().contents() |
| 10 | + self.footprint('U', 'edg:Lcd_Er_Tft1_28_3_Outline', {}, |
| 11 | + 'EastRising', 'ER-TFT1.28-3', |
| 12 | + datasheet='https://www.buydisplay.com/download/manual/ER-TFT1.28-3_Datasheet.pdf') |
| 13 | + |
| 14 | + |
| 15 | +class Er_Tft_128_3_Device(InternalSubcircuit, Nonstrict3v3Compatible, Block): |
| 16 | + """15-pin FPC connector for the ER-TFT1.28-3 device""" |
| 17 | + |
| 18 | + def __init__(self) -> None: |
| 19 | + super().__init__() |
| 20 | + |
| 21 | + self.conn = self.Block(Fpc050Bottom(length=15)) # Pin numbering in the doc is flipped in the footprint |
| 22 | + |
| 23 | + # Power pins |
| 24 | + self.vdd = self.Export(self.conn.pins.request('12').adapt_to(VoltageSink( |
| 25 | + voltage_limits=self.nonstrict_3v3_compatible.then_else( |
| 26 | + (2.5, 3.6) * Volt, # abs max is 4.6v |
| 27 | + (2.5, 3.3) * Volt), |
| 28 | + ))) |
| 29 | + |
| 30 | + self.gnd = self.Export(self.conn.pins.request('15').adapt_to(Ground())) |
| 31 | + # Backlight control |
| 32 | + self.ledk = self.Export(self.conn.pins.request('14')) |
| 33 | + self.leda = self.Export(self.conn.pins.request('13')) |
| 34 | + |
| 35 | + dio_model = DigitalBidir.from_supply( |
| 36 | + self.gnd, self.vdd, |
| 37 | + voltage_limit_tolerance=(-0.3, 0.3)*Volt, |
| 38 | + input_threshold_factor=(0.3, 0.7) |
| 39 | + ) |
| 40 | + |
| 41 | + self.rs = self.Export(self.conn.pins.request('11').adapt_to(DigitalSink.from_bidir(dio_model))) |
| 42 | + |
| 43 | + # Control pins |
| 44 | + self.spi = self.Port(SpiPeripheral.empty()) |
| 45 | + self.cs = self.Export(self.conn.pins.request('10').adapt_to(DigitalSink.from_bidir(dio_model))) |
| 46 | + self.connect(self.spi.sck, self.conn.pins.request('9').adapt_to(DigitalSink.from_bidir(dio_model))) |
| 47 | + self.connect(self.spi.mosi, self.conn.pins.request('8').adapt_to(DigitalSink.from_bidir(dio_model))) |
| 48 | + |
| 49 | + self.miso_nc = self.Block(DigitalBidirNotConnected()) |
| 50 | + self.connect(self.spi.miso, self.miso_nc.port) |
| 51 | + |
| 52 | + self.rst = self.Export(self.conn.pins.request('7').adapt_to(DigitalSink.from_bidir(dio_model))) |
| 53 | + |
| 54 | + # Capacitive Touch Panel (CTP) |
| 55 | + self.ctp_i2c = self.Port(I2cTarget(DigitalBidir.empty(), addresses=[0x15]),) |
| 56 | + |
| 57 | + self.ctp_vdd = self.Export(self.conn.pins.request('6').adapt_to(VoltageSink( |
| 58 | + voltage_limits=(2.7, 3.6) * Volt, |
| 59 | + current_draw=(5 * uAmp, 2.5 * mAmp) |
| 60 | + ))) |
| 61 | + |
| 62 | + self.connect(self.gnd, self.conn.pins.request('5').adapt_to(Ground())) |
| 63 | + |
| 64 | + self.ctp_rst = self.Export(self.conn.pins.request('4').adapt_to(DigitalSink.from_bidir(dio_model))) |
| 65 | + self.ctp_int = self.Export(self.conn.pins.request('3').adapt_to(DigitalSink.from_bidir(dio_model))) |
| 66 | + self.connect(self.ctp_i2c.sda, self.conn.pins.request('2').adapt_to(dio_model)) |
| 67 | + self.connect(self.ctp_i2c.scl, self.conn.pins.request('1').adapt_to(DigitalSink.from_bidir(dio_model))) |
| 68 | + |
| 69 | + |
| 70 | +class Er_Tft_128_3(Lcd, Resettable, Block): |
| 71 | + """GC9A01-based 1.28" 240x240 TFT, with optional CST816S-based capacitive touch panel.""" |
| 72 | + |
| 73 | + def __init__(self) -> None: |
| 74 | + super().__init__() |
| 75 | + self.ic = self.Block(Er_Tft_128_3_Device()) |
| 76 | + self.gnd = self.Export(self.ic.gnd, [Common]) |
| 77 | + self.pwr = self.Export(self.ic.vdd, [Power]) |
| 78 | + self.spi = self.Export(self.ic.spi) |
| 79 | + self.cs = self.Export(self.ic.cs) |
| 80 | + self.dc = self.Export(self.ic.rs) |
| 81 | + # touch interface |
| 82 | + self.ctp_i2c = self.Export(self.ic.ctp_i2c, optional=True, doc='Touch panel interface i2c') |
| 83 | + self.ctp_rst = self.Export(self.ic.ctp_rst, optional=True, doc='Touch panel interface') |
| 84 | + self.ctp_int = self.Export(self.ic.ctp_int, optional=True, doc='Touch panel interface') |
| 85 | + |
| 86 | + def contents(self): |
| 87 | + super().contents() |
| 88 | + self.connect(self.reset, self.ic.rst) |
| 89 | + self.require(self.reset.is_connected()) |
| 90 | + |
| 91 | + self.lcd = self.Block(Er_Tft_128_3_Outline()) # for ic outline |
| 92 | + |
| 93 | + self.connect(self.ic.ledk.adapt_to(Ground()), self.gnd) |
| 94 | + forward_current = (24, 30)*mAmp |
| 95 | + forward_voltage = 2.9*Volt |
| 96 | + self.led_res = self.Block(Resistor( |
| 97 | + resistance=((self.pwr.link().voltage.upper() - forward_voltage) / forward_current.upper(), |
| 98 | + (self.pwr.link().voltage.lower() - forward_voltage) / forward_current.lower()))) |
| 99 | + self.connect(self.led_res.a.adapt_to(VoltageSink(current_draw=forward_current)), self.pwr) |
| 100 | + self.connect(self.led_res.b, self.ic.leda) |
| 101 | + self.connect(self.pwr, self.ic.ctp_vdd) |
| 102 | + self.require(self.ctp_i2c.is_connected() == self.ctp_rst.is_connected()) |
| 103 | + self.require(self.ctp_i2c.is_connected() == self.ctp_int.is_connected()) |
| 104 | + |
0 commit comments