github.com/tinygo-org/tinygo@v0.31.3-0.20240404173401-90b0bf646c27/src/machine/machine_atmega328p.go (about)

     1  //go:build avr && atmega328p
     2  
     3  package machine
     4  
     5  import (
     6  	"device/avr"
     7  	"runtime/volatile"
     8  )
     9  
    10  const irq_USART0_RX = avr.IRQ_USART_RX
    11  
    12  // I2C0 is the only I2C interface on most AVRs.
    13  var I2C0 = &I2C{
    14  	srReg: avr.TWSR,
    15  	brReg: avr.TWBR,
    16  	crReg: avr.TWCR,
    17  	drReg: avr.TWDR,
    18  	srPS0: avr.TWSR_TWPS0,
    19  	srPS1: avr.TWSR_TWPS1,
    20  	crEN:  avr.TWCR_TWEN,
    21  	crINT: avr.TWCR_TWINT,
    22  	crSTO: avr.TWCR_TWSTO,
    23  	crEA:  avr.TWCR_TWEA,
    24  	crSTA: avr.TWCR_TWSTA,
    25  }
    26  
    27  // SPI configuration
    28  var SPI0 = SPI{
    29  	spcr: avr.SPCR,
    30  	spdr: avr.SPDR,
    31  	spsr: avr.SPSR,
    32  
    33  	spcrR0:   avr.SPCR_SPR0,
    34  	spcrR1:   avr.SPCR_SPR1,
    35  	spcrCPHA: avr.SPCR_CPHA,
    36  	spcrCPOL: avr.SPCR_CPOL,
    37  	spcrDORD: avr.SPCR_DORD,
    38  	spcrSPE:  avr.SPCR_SPE,
    39  	spcrMSTR: avr.SPCR_MSTR,
    40  
    41  	spsrI2X:  avr.SPSR_SPI2X,
    42  	spsrSPIF: avr.SPSR_SPIF,
    43  
    44  	sck: PB5,
    45  	sdo: PB3,
    46  	sdi: PB4,
    47  	cs:  PB2,
    48  }
    49  
    50  // getPortMask returns the PORTx register and mask for the pin.
    51  func (p Pin) getPortMask() (*volatile.Register8, uint8) {
    52  	switch {
    53  	case p >= PB0 && p <= PB7: // port B
    54  		return avr.PORTB, 1 << uint8(p-portB)
    55  	case p >= PC0 && p <= PC7: // port C
    56  		return avr.PORTC, 1 << uint8(p-portC)
    57  	default: // port D
    58  		return avr.PORTD, 1 << uint8(p-portD)
    59  	}
    60  }