mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
8b3075fdba
Signed-off-by: deadprogram <ron@hybridgroup.com>
117 lines
2.8 KiB
Go
117 lines
2.8 KiB
Go
//go:build atsamd51 || atsame5x
|
|
|
|
package ili9341
|
|
|
|
import (
|
|
"device/sam"
|
|
"machine"
|
|
)
|
|
|
|
type spiDriver struct {
|
|
bus machine.SPI
|
|
}
|
|
|
|
func NewSPI(bus machine.SPI, dc, cs, rst machine.Pin) *Device {
|
|
return &Device{
|
|
dc: dc,
|
|
cs: cs,
|
|
rst: rst,
|
|
rd: machine.NoPin,
|
|
driver: &spiDriver{
|
|
bus: bus,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (pd *spiDriver) configure(config *Config) {
|
|
}
|
|
|
|
func (pd *spiDriver) write8(b byte) {
|
|
pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(b))
|
|
|
|
pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_CTRLB) {
|
|
}
|
|
}
|
|
|
|
func (pd *spiDriver) write8n(b byte, n int) {
|
|
pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
|
|
for i, c := 0, n; i < c; i++ {
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(b))
|
|
}
|
|
|
|
pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_CTRLB) {
|
|
}
|
|
}
|
|
|
|
func (pd *spiDriver) write8sl(b []byte) {
|
|
pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
|
|
for i, c := 0, len(b); i < c; i++ {
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(b[i]))
|
|
}
|
|
|
|
pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_CTRLB) {
|
|
}
|
|
}
|
|
|
|
func (pd *spiDriver) write16(data uint16) {
|
|
pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(uint8(data >> 8)))
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(uint8(data)))
|
|
|
|
pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_CTRLB) {
|
|
}
|
|
}
|
|
|
|
func (pd *spiDriver) write16n(data uint16, n int) {
|
|
pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
|
|
for i := 0; i < n; i++ {
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(uint8(data >> 8)))
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(uint8(data)))
|
|
}
|
|
|
|
pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_CTRLB) {
|
|
}
|
|
}
|
|
|
|
func (pd *spiDriver) write16sl(data []uint16) {
|
|
pd.bus.Bus.CTRLB.ClearBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
|
|
for i, c := 0, len(data); i < c; i++ {
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(uint8(data[i] >> 8)))
|
|
for !pd.bus.Bus.INTFLAG.HasBits(sam.SERCOM_SPIM_INTFLAG_DRE) {
|
|
}
|
|
pd.bus.Bus.DATA.Set(uint32(uint8(data[i])))
|
|
}
|
|
|
|
pd.bus.Bus.CTRLB.SetBits(sam.SERCOM_SPIM_CTRLB_RXEN)
|
|
for pd.bus.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPIM_SYNCBUSY_CTRLB) {
|
|
}
|
|
}
|