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 }