tinygo.org/x/drivers@v0.27.1-0.20240509133757-7dbca2a54349/ili9341/spi_atsamd21.go (about)

     1  //go:build atsamd21
     2  
     3  package ili9341
     4  
     5  import (
     6  	"device/sam"
     7  	"machine"
     8  )
     9  
    10  type spiDriver struct {
    11  	bus machine.SPI
    12  }
    13  
    14  func NewSPI(bus machine.SPI, dc, cs, rst machine.Pin) *Device {
    15  	return &Device{
    16  		dc:  dc,
    17  		cs:  cs,
    18  		rst: rst,
    19  		rd:  machine.NoPin,
    20  		driver: &spiDriver{
    21  			bus: bus,
    22  		},
    23  	}
    24  }
    25  
    26  func (pd *spiDriver) configure(config *Config) {
    27  }
    28  
    29  func (pd *spiDriver) write8(b byte) {
    30  	pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPI_CTRLB_RXEN)
    31  
    32  	for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
    33  	}
    34  	pd.bus.Bus.DATA.Set(uint32(b))
    35  
    36  	pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPI_CTRLB_RXEN)
    37  	for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) {
    38  	}
    39  }
    40  
    41  func (pd *spiDriver) write8n(b byte, n int) {
    42  	pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPI_CTRLB_RXEN)
    43  
    44  	for i, c := 0, n; i < c; i++ {
    45  		for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
    46  		}
    47  		pd.bus.Bus.DATA.Set(uint32(b))
    48  	}
    49  
    50  	pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPI_CTRLB_RXEN)
    51  	for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) {
    52  	}
    53  }
    54  
    55  func (pd *spiDriver) write8sl(b []byte) {
    56  	pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPI_CTRLB_RXEN)
    57  
    58  	for i, c := 0, len(b); i < c; i++ {
    59  		for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
    60  		}
    61  		pd.bus.Bus.DATA.Set(uint32(b[i]))
    62  	}
    63  
    64  	pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPI_CTRLB_RXEN)
    65  	for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) {
    66  	}
    67  }
    68  
    69  func (pd *spiDriver) write16(data uint16) {
    70  	pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPI_CTRLB_RXEN)
    71  
    72  	for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
    73  	}
    74  	pd.bus.Bus.DATA.Set(uint32(uint8(data >> 8)))
    75  	for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
    76  	}
    77  	pd.bus.Bus.DATA.Set(uint32(uint8(data)))
    78  
    79  	pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPI_CTRLB_RXEN)
    80  	for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) {
    81  	}
    82  }
    83  
    84  func (pd *spiDriver) write16n(data uint16, n int) {
    85  	pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPI_CTRLB_RXEN)
    86  
    87  	for i := 0; i < n; i++ {
    88  		for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
    89  		}
    90  		pd.bus.Bus.DATA.Set(uint32(uint8(data >> 8)))
    91  		for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
    92  		}
    93  		pd.bus.Bus.DATA.Set(uint32(uint8(data)))
    94  	}
    95  
    96  	pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPI_CTRLB_RXEN)
    97  	for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) {
    98  	}
    99  }
   100  
   101  func (pd *spiDriver) write16sl(data []uint16) {
   102  	pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPI_CTRLB_RXEN)
   103  
   104  	for i, c := 0, len(data); i < c; i++ {
   105  		for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
   106  		}
   107  		pd.bus.Bus.DATA.Set(uint32(uint8(data[i] >> 8)))
   108  		for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_DRE) {
   109  		}
   110  		pd.bus.Bus.DATA.Set(uint32(uint8(data[i])))
   111  	}
   112  
   113  	pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPI_CTRLB_RXEN)
   114  	for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) {
   115  	}
   116  }