Files
tinygo/src/machine/machine_atmega328p.go
T
2023-12-02 13:26:59 +01:00

61 lines
1.1 KiB
Go

//go:build avr && atmega328p
package machine
import (
"device/avr"
"runtime/volatile"
)
const irq_USART0_RX = avr.IRQ_USART_RX
// I2C0 is the only I2C interface on most AVRs.
var I2C0 = &I2C{
srReg: avr.TWSR,
brReg: avr.TWBR,
crReg: avr.TWCR,
drReg: avr.TWDR,
srPS0: avr.TWSR_TWPS0,
srPS1: avr.TWSR_TWPS1,
crEN: avr.TWCR_TWEN,
crINT: avr.TWCR_TWINT,
crSTO: avr.TWCR_TWSTO,
crEA: avr.TWCR_TWEA,
crSTA: avr.TWCR_TWSTA,
}
// SPI configuration
var SPI0 = SPI{
spcr: avr.SPCR,
spdr: avr.SPDR,
spsr: avr.SPSR,
spcrR0: avr.SPCR_SPR0,
spcrR1: avr.SPCR_SPR1,
spcrCPHA: avr.SPCR_CPHA,
spcrCPOL: avr.SPCR_CPOL,
spcrDORD: avr.SPCR_DORD,
spcrSPE: avr.SPCR_SPE,
spcrMSTR: avr.SPCR_MSTR,
spsrI2X: avr.SPSR_SPI2X,
spsrSPIF: avr.SPSR_SPIF,
sck: PB5,
sdo: PB3,
sdi: PB4,
cs: PB2,
}
// 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)
default: // port D
return avr.PORTD, 1 << uint8(p-portD)
}
}