Source code for jitxexamples.components.flash.winbond_W25Q128JVSIQ

"""
Winbond W25Q128 Serial Flash Memory

Component definition for Winbond W25Q128JVSIQ 128Mbit Serial Flash Memory
"""

from jitx.anchor import Anchor
from jitx.feature import Courtyard, Custom, Paste, Silkscreen, Soldermask
from jitx.landpattern import Landpattern, Pad, PadMapping
from jitx.model3d import Model3D
from jitx.net import Port
from jitx.shapes.composites import rectangle
from jitx.shapes.primitive import Arc, ArcPolyline, Circle, Polyline, Text
from jitx.symbol import Direction, Pin, Symbol, SymbolMapping
from jitx.component import Component
from jitx.circuit import Circuit
from jitx.common import Power
from jitxlib.protocols.serial import WideSPI
from jitxlib.parts import Capacitor


[docs] class CapsuleSmdPad(Pad): """SMD pad for SOIC-8 package with capsule shape""" shape = rectangle(0.63, 2.25) solder_mask = [Soldermask(rectangle(0.732, 2.352))] paste = [Paste(rectangle(0.732, 2.352))]
[docs] class LandpatternSOIC_8_L5_3_W5_3_P1_27_LS8_0_BL(Landpattern): """SOIC-8 landpattern for W25Q128JVSIQ flash memory""" name = "SOIC-8_L5.3-W5.3-P1.27-LS8.0-BL" p = { 1: CapsuleSmdPad().at((-1.905, -3.5305)), 2: CapsuleSmdPad().at((-0.635, -3.5305)), 3: CapsuleSmdPad().at((0.635, -3.5305)), 4: CapsuleSmdPad().at((1.905, -3.5305)), 5: CapsuleSmdPad().at((1.905, 3.5305)), 6: CapsuleSmdPad().at((0.635, 3.5305)), 7: CapsuleSmdPad().at((-0.635, 3.5305)), 8: CapsuleSmdPad().at((-1.905, 3.5305)), } reference_designator = Silkscreen(Text(">REF", 0.5, Anchor.W).at((-0.75, 6.4121))) value_label = Custom(Text(">VALUE", 0.5, Anchor.W).at((-0.75, 5.4121)), name="Fab") silkscreen = [ Silkscreen( Polyline( 0.152, [ (-2.639, -2.1765), (-2.639, 2.1765), (2.639, 2.1765), (2.639, -2.1765), (-2.639, -2.1765), ], ) ), Silkscreen(ArcPolyline(0.3, [Arc((-1.905, -1.4235), 0.15, 0, -360)])), Silkscreen(ArcPolyline(0.3, [Arc((-2.672, -3.5305), 0.15, 0, -360)])), ] custom_layer = [ Custom(ArcPolyline(0.3, [Arc((-1.905, -4.3505), 0.15, 0, -360)]), name="Fab"), Custom(ArcPolyline(0.06, [Arc((-2.585, -3.9205), 0.03, 0, -360)]), name="Fab"), ] courtyard = Courtyard(rectangle(5.43, 9.413)) model3d = Model3D( "winbond_W25Q128JVSIQ.stp", position=(0.0, 0.0, 0.0), scale=(1.0, 1.0, 1.0), rotation=(0.0, 0.0, 0.0), )
[docs] class SymbolW25Q128JVSIQTR(Symbol): """Schematic symbol for W25Q128JVSIQ flash memory""" pin_name_size = 0.7874 pad_name_size = 0.7874 CS_NOT = Pin((-8, 3), 2, Direction.Left) DO = Pin((-8, 1), 2, Direction.Left) IO2 = Pin((-8, -1), 2, Direction.Left) GND = Pin((-8, -3), 2, Direction.Left) DI = Pin((8, -3), 2, Direction.Right) CLK = Pin((8, -1), 2, Direction.Right) IO3 = Pin((8, 1), 2, Direction.Right) VCC = Pin((8, 3), 2, Direction.Right) reference_designator = Text(">REF", 0.55559, Anchor.C).at((0, 6.27481)) value_label = Text(">VALUE", 0.55559, Anchor.C).at((0, 5.48741)) shapes = [ rectangle(16.00003, 10.80002), Circle(radius=0.3).at((-7.00001, 4.40001)), Circle(radius=0.3).at((-7.00001, 4.40001)), ]
[docs] class W25Q128JVSIQ(Component): """Winbond W25Q128JVSIQ 128Mbit Serial Flash Memory""" manufacturer = "Winbond" mpn = "W25Q128JVSIQ" reference_designator_prefix = "U" datasheet = "https://www.lcsc.com/datasheet/lcsc_datasheet_1811142111_Winbond-Elec-W25Q128JVSIQ_C97521.pdf" CS_NOT = Port() """Chip Select (active low)""" DO = Port() """Data Output (MISO)""" IO2 = Port() """I/O2 pin for quad SPI operation""" GND = Port() """Ground connection""" DI = Port() """Data Input (MOSI)""" CLK = Port() """Serial Clock""" IO3 = Port() """I/O3 pin for quad SPI operation""" VCC = Port() """Power supply (2.7V to 3.6V)""" landpattern = LandpatternSOIC_8_L5_3_W5_3_P1_27_LS8_0_BL() symbol = SymbolW25Q128JVSIQTR() cmappings = [ SymbolMapping( { CS_NOT: symbol.CS_NOT, DO: symbol.DO, IO2: symbol.IO2, GND: symbol.GND, DI: symbol.DI, CLK: symbol.CLK, IO3: symbol.IO3, VCC: symbol.VCC, } ), PadMapping( { CS_NOT: landpattern.p[1], DO: landpattern.p[2], IO2: landpattern.p[3], GND: landpattern.p[4], DI: landpattern.p[5], CLK: landpattern.p[6], IO3: landpattern.p[7], VCC: landpattern.p[8], } ), ]
[docs] class W25Q128(Circuit): """ W25Q128 128Mbit Serial Flash Memory Reference Circuit Features: - W25Q128JVSIQ flash memory IC (128Mbit/16MB capacity) - 4.7µF bypass capacitor for power supply decoupling - SPI interface for communication - Proper power and ground connections Pin Configuration: - CS_NOT: Chip Select (active low) - DI: Data Input (MOSI) - DO: Data Output (MISO) - CLK: Serial Clock - IO2: I/O2 (for quad SPI) - IO3: I/O3 (for quad SPI) - VCC: Power supply (2.7V to 3.6V) - GND: Ground Datasheet: https://www.lcsc.com/datasheet/lcsc_datasheet_1811142111_Winbond-Elec-W25Q128JVSIQ_C97521.pdf """ # Power supply interface power = Power() # Quad SPI interface for full 4-wire operation qspi = WideSPI.quad(cs=True) def __init__(self): # Instantiate the W25Q128 flash memory self.flash = W25Q128JVSIQ() # 4.7µF bypass capacitor for power supply decoupling # Using X7R dielectric for good temperature stability self.bypass_cap = Capacitor(capacitance=4.7e-6).insert( self.flash.VCC, self.flash.GND, short_trace=True ) # Net connections nets_list = [ # Power connections self.power.Vp + self.flash.VCC, self.power.Vn + self.flash.GND, # Quad SPI interface connections # Connect all 4 data lines for full quad SPI operation self.qspi.data[0] + self.flash.DI, # Data line 0 (MOSI in standard SPI) self.qspi.data[1] + self.flash.DO, # Data line 1 (MISO in standard SPI) self.qspi.data[2] + self.flash.IO2, # Data line 2 (for quad SPI) self.qspi.data[3] + self.flash.IO3, # Data line 3 (for quad SPI) self.qspi.sck + self.flash.CLK, # Serial Clock ] # Add chip select connection if available if self.qspi.cs is not None: nets_list.append(self.qspi.cs + self.flash.CS_NOT) self.nets = nets_list
# Device alias for easy import following JITX patterns Device: type[W25Q128] = W25Q128