machine/samd21: use PinMode for SPI SERCOM peripheral to allow for more configuration options on boards like Arduino Nano33-IoT that have many predefined pin mappings

Signed-off-by: Ron Evans <ron@hybridgroup.com>
Этот коммит содержится в:
Ron Evans 2019-09-16 14:42:46 +02:00 коммит произвёл Ayke
родитель d2856bd6bd
коммит f5fd49bb74
6 изменённых файлов: 53 добавлений и 45 удалений

Просмотреть файл

@ -37,7 +37,7 @@ const (
A0 Pin = PA02 // ADC/AIN[0] A0 Pin = PA02 // ADC/AIN[0]
A1 Pin = PB02 // ADC/AIN[10] A1 Pin = PB02 // ADC/AIN[10]
A2 Pin = PA11 // ADC/AIN[19] A2 Pin = PA11 // ADC/AIN[19]
A3 Pin = PA10 // ADC/AIN[18] A3 Pin = PA10 // ADC/AIN[18],
A4 Pin = PB08 // ADC/AIN[2], SCL: SERCOM2/PAD[1] A4 Pin = PB08 // ADC/AIN[2], SCL: SERCOM2/PAD[1]
A5 Pin = PB09 // ADC/AIN[3], SDA: SERCOM2/PAD[1] A5 Pin = PB09 // ADC/AIN[3], SDA: SERCOM2/PAD[1]
A6 Pin = PA09 // ADC/AIN[17] A6 Pin = PA09 // ADC/AIN[17]
@ -118,19 +118,20 @@ var (
// SPI pins // SPI pins
const ( const (
SPI0_SCK_PIN Pin = PB11 // SCK: SERCOM4/PAD[3] SPI0_SCK_PIN Pin = A2 // SCK: SERCOM0/PAD[3]
SPI0_MOSI_PIN Pin = PB10 // MOSI: SERCOM4/PAD[2] SPI0_MOSI_PIN Pin = A3 // MOSI: SERCOM0/PAD[2]
SPI0_MISO_PIN Pin = PA12 // MISO: SERCOM4/PAD[0] SPI0_MISO_PIN Pin = A6 // MISO: SERCOM0/PAD[1]
) )
// SPI on the Arduino Nano 33. // SPI on the Arduino Nano 33.
var ( var (
SPI0 = SPI{Bus: sam.SERCOM1_SPI, SPI0 = SPI{Bus: sam.SERCOM0_SPI,
SCK: SPI0_SCK_PIN, SCK: SPI0_SCK_PIN,
MOSI: SPI0_MOSI_PIN, MOSI: SPI0_MOSI_PIN,
MISO: SPI0_MISO_PIN, MISO: SPI0_MISO_PIN,
DOpad: spiTXPad2SCK3, DOpad: spiTXPad2SCK3,
DIpad: sercomRXPad0} DIpad: sercomRXPad0,
PinMode: PinSERCOM}
) )
// I2S pins // I2S pins

Просмотреть файл

@ -115,11 +115,12 @@ const (
// SPI on the Circuit Playground Express. // SPI on the Circuit Playground Express.
var ( var (
SPI0 = SPI{Bus: sam.SERCOM3_SPI, SPI0 = SPI{Bus: sam.SERCOM3_SPI,
SCK: SPI0_SCK_PIN, SCK: SPI0_SCK_PIN,
MOSI: SPI0_MOSI_PIN, MOSI: SPI0_MOSI_PIN,
MISO: SPI0_MISO_PIN, MISO: SPI0_MISO_PIN,
DOpad: spiTXPad2SCK3, DOpad: spiTXPad2SCK3,
DIpad: sercomRXPad0} DIpad: sercomRXPad0,
PinMode: PinSERCOMAlt}
) )
// I2S pins // I2S pins

Просмотреть файл

@ -89,11 +89,12 @@ const (
// SPI on the Feather M0. // SPI on the Feather M0.
var ( var (
SPI0 = SPI{Bus: sam.SERCOM4_SPI, SPI0 = SPI{Bus: sam.SERCOM4_SPI,
SCK: SPI0_SCK_PIN, SCK: SPI0_SCK_PIN,
MOSI: SPI0_MOSI_PIN, MOSI: SPI0_MOSI_PIN,
MISO: SPI0_MISO_PIN, MISO: SPI0_MISO_PIN,
DOpad: spiTXPad2SCK3, DOpad: spiTXPad2SCK3,
DIpad: sercomRXPad0} DIpad: sercomRXPad0,
PinMode: PinSERCOMAlt}
) )
// I2S pins // I2S pins

Просмотреть файл

@ -91,11 +91,12 @@ const (
// SPI on the ItsyBitsy M0. // SPI on the ItsyBitsy M0.
var ( var (
SPI0 = SPI{Bus: sam.SERCOM4_SPI, SPI0 = SPI{Bus: sam.SERCOM4_SPI,
SCK: SPI0_SCK_PIN, SCK: SPI0_SCK_PIN,
MOSI: SPI0_MOSI_PIN, MOSI: SPI0_MOSI_PIN,
MISO: SPI0_MISO_PIN, MISO: SPI0_MISO_PIN,
DOpad: spiTXPad2SCK3, DOpad: spiTXPad2SCK3,
DIpad: sercomRXPad0} DIpad: sercomRXPad0,
PinMode: PinSERCOMAlt}
) )
// "Internal" SPI pins; SPI flash is attached to these on ItsyBitsy M0 // "Internal" SPI pins; SPI flash is attached to these on ItsyBitsy M0
@ -109,11 +110,12 @@ const (
// "Internal" SPI on Sercom 5 // "Internal" SPI on Sercom 5
var ( var (
SPI1 = SPI{Bus: sam.SERCOM5_SPI, SPI1 = SPI{Bus: sam.SERCOM5_SPI,
SCK: SPI1_SCK_PIN, SCK: SPI1_SCK_PIN,
MOSI: SPI1_MOSI_PIN, MOSI: SPI1_MOSI_PIN,
MISO: SPI1_MISO_PIN, MISO: SPI1_MISO_PIN,
DOpad: spiTXPad2SCK3, DOpad: spiTXPad2SCK3,
DIpad: sercomRXPad1} DIpad: sercomRXPad1,
PinMode: PinSERCOMAlt}
) )
// I2S pins // I2S pins

Просмотреть файл

@ -66,11 +66,12 @@ const (
// SPI on the Trinket M0. // SPI on the Trinket M0.
var ( var (
SPI0 = SPI{Bus: sam.SERCOM0_SPI, SPI0 = SPI{Bus: sam.SERCOM0_SPI,
SCK: SPI0_SCK_PIN, SCK: SPI0_SCK_PIN,
MOSI: SPI0_MOSI_PIN, MOSI: SPI0_MOSI_PIN,
MISO: SPI0_MISO_PIN, MISO: SPI0_MISO_PIN,
DOpad: spiTXPad2SCK3, DOpad: spiTXPad2SCK3,
DIpad: sercomRXPad0} DIpad: sercomRXPad0,
PinMode: PinSERCOMAlt}
) )
// I2C pins // I2C pins

Просмотреть файл

@ -876,12 +876,13 @@ func waitForSync() {
// SPI // SPI
type SPI struct { type SPI struct {
Bus *sam.SERCOM_SPI_Type Bus *sam.SERCOM_SPI_Type
SCK Pin SCK Pin
MOSI Pin MOSI Pin
MISO Pin MISO Pin
DOpad int DOpad int
DIpad int DIpad int
PinMode PinMode
} }
// SPIConfig is used to store config info for SPI. // SPIConfig is used to store config info for SPI.
@ -896,7 +897,6 @@ type SPIConfig struct {
// Configure is intended to setup the SPI interface. // Configure is intended to setup the SPI interface.
func (spi SPI) Configure(config SPIConfig) { func (spi SPI) Configure(config SPIConfig) {
config.SCK = spi.SCK config.SCK = spi.SCK
config.MOSI = spi.MOSI config.MOSI = spi.MOSI
config.MISO = spi.MISO config.MISO = spi.MISO
@ -904,6 +904,8 @@ func (spi SPI) Configure(config SPIConfig) {
doPad := spi.DOpad doPad := spi.DOpad
diPad := spi.DIpad diPad := spi.DIpad
pinMode := spi.PinMode
// set default frequency // set default frequency
if config.Frequency == 0 { if config.Frequency == 0 {
config.Frequency = 4000000 config.Frequency = 4000000
@ -915,9 +917,9 @@ func (spi SPI) Configure(config SPIConfig) {
} }
// enable pins // enable pins
config.SCK.Configure(PinConfig{Mode: PinSERCOMAlt}) config.SCK.Configure(PinConfig{Mode: pinMode})
config.MOSI.Configure(PinConfig{Mode: PinSERCOMAlt}) config.MOSI.Configure(PinConfig{Mode: pinMode})
config.MISO.Configure(PinConfig{Mode: PinSERCOMAlt}) config.MISO.Configure(PinConfig{Mode: pinMode})
// reset SERCOM // reset SERCOM
spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_SWRST) spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_SWRST)