mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-04 02:57:46 +00:00
2bee29959b
Fixes #4663 "in reverse" by making SPI a pointer everywhere, as discussed in the comments. Signed-off-by: deadprogram <ron@hybridgroup.com>
120 lines
2.3 KiB
Go
120 lines
2.3 KiB
Go
//go:build avr && atmega328pb
|
|
|
|
package machine
|
|
|
|
import (
|
|
"device/avr"
|
|
"runtime/interrupt"
|
|
"runtime/volatile"
|
|
)
|
|
|
|
const irq_USART0_RX = avr.IRQ_USART0_RX
|
|
const irq_USART1_RX = avr.IRQ_USART1_RX
|
|
|
|
var (
|
|
UART1 = &_UART1
|
|
_UART1 = UART{
|
|
Buffer: NewRingBuffer(),
|
|
|
|
dataReg: avr.UDR1,
|
|
baudRegH: avr.UBRR1H,
|
|
baudRegL: avr.UBRR1L,
|
|
statusRegA: avr.UCSR1A,
|
|
statusRegB: avr.UCSR1B,
|
|
statusRegC: avr.UCSR1C,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
// Register the UART interrupt.
|
|
interrupt.New(irq_USART1_RX, _UART1.handleInterrupt)
|
|
}
|
|
|
|
// I2C0 is the only I2C interface on most AVRs.
|
|
var I2C0 = &I2C{
|
|
srReg: avr.TWSR0,
|
|
brReg: avr.TWBR0,
|
|
crReg: avr.TWCR0,
|
|
drReg: avr.TWDR0,
|
|
srPS0: avr.TWSR0_TWPS0,
|
|
srPS1: avr.TWSR0_TWPS1,
|
|
crEN: avr.TWCR0_TWEN,
|
|
crINT: avr.TWCR0_TWINT,
|
|
crSTO: avr.TWCR0_TWSTO,
|
|
crEA: avr.TWCR0_TWEA,
|
|
crSTA: avr.TWCR0_TWSTA,
|
|
}
|
|
|
|
var I2C1 = &I2C{
|
|
srReg: avr.TWSR1,
|
|
brReg: avr.TWBR1,
|
|
crReg: avr.TWCR1,
|
|
drReg: avr.TWDR1,
|
|
srPS0: avr.TWSR1_TWPS10,
|
|
srPS1: avr.TWSR1_TWPS11,
|
|
crEN: avr.TWCR1_TWEN1,
|
|
crINT: avr.TWCR1_TWINT1,
|
|
crSTO: avr.TWCR1_TWSTO1,
|
|
crEA: avr.TWCR1_TWEA1,
|
|
crSTA: avr.TWCR1_TWSTA1,
|
|
}
|
|
|
|
// SPI configuration
|
|
var SPI0 = &SPI{
|
|
spcr: avr.SPCR0,
|
|
spdr: avr.SPDR0,
|
|
spsr: avr.SPSR0,
|
|
|
|
spcrR0: avr.SPCR0_SPR0,
|
|
spcrR1: avr.SPCR0_SPR1,
|
|
spcrCPHA: avr.SPCR0_CPHA,
|
|
spcrCPOL: avr.SPCR0_CPOL,
|
|
spcrDORD: avr.SPCR0_DORD,
|
|
spcrSPE: avr.SPCR0_SPE,
|
|
spcrMSTR: avr.SPCR0_MSTR,
|
|
|
|
spsrI2X: avr.SPSR0_SPI2X,
|
|
spsrSPIF: avr.SPSR0_SPIF,
|
|
|
|
sck: PB5,
|
|
sdo: PB3,
|
|
sdi: PB4,
|
|
cs: PB2,
|
|
}
|
|
|
|
var SPI1 = &SPI{
|
|
spcr: avr.SPCR1,
|
|
spdr: avr.SPDR1,
|
|
spsr: avr.SPSR1,
|
|
|
|
spcrR0: avr.SPCR1_SPR10,
|
|
spcrR1: avr.SPCR1_SPR11,
|
|
spcrCPHA: avr.SPCR1_CPHA1,
|
|
spcrCPOL: avr.SPCR1_CPOL1,
|
|
spcrDORD: avr.SPCR1_DORD1,
|
|
spcrSPE: avr.SPCR1_SPE1,
|
|
spcrMSTR: avr.SPCR1_MSTR1,
|
|
|
|
spsrI2X: avr.SPSR1_SPI2X1,
|
|
spsrSPIF: avr.SPSR1_SPIF1,
|
|
|
|
sck: PC1,
|
|
sdo: PE3,
|
|
sdi: PC0,
|
|
cs: PE2,
|
|
}
|
|
|
|
// getPortMask returns the PORTx register and mask for the pin.
|
|
func (p Pin) getPortMask() (*volatile.Register8, uint8) {
|
|
switch {
|
|
case p >= PB0 && p <= PB7: // port B
|
|
return avr.PORTB, 1 << uint8(p-portB)
|
|
case p >= PC0 && p <= PC7: // port C
|
|
return avr.PORTC, 1 << uint8(p-portC)
|
|
case p >= PD0 && p <= PD7: // port D
|
|
return avr.PORTD, 1 << uint8(p-portD)
|
|
default: // port E
|
|
return avr.PORTE, 1 << uint8(p-portE)
|
|
}
|
|
}
|