Этот коммит содержится в:
Yannis Huber 2020-06-29 09:47:07 +02:00 коммит произвёл Ron Evans
родитель 5446c6927e
коммит ad0c15080a
4 изменённых файлов: 213 добавлений и 52 удалений

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

@ -2,52 +2,56 @@
package machine package machine
// GPIO pins. // Pins on the MAix Bit.
const ( const (
D0 = P08 D0 = P00 // JTAG_TCLK
D1 = P09 D1 = P01 // JTAG_TDI
D2 = P10 D2 = P02 // JTAG_TMS
D3 = P11 D3 = P03 // JTAG_TDO
D4 = P12 D4 = P04 // UARTHS_RX
D5 = P13 D5 = P05 // UARTHS_TX
D6 = P14 D6 = P06 // RESV0
D7 = P15 D7 = P07 // RESV0
) D8 = P08 // GPIO1
D9 = P09 // GPIO2
// High-speed GPIO pins (GPIOHS). D10 = P10 // GPIO3
const ( D11 = P11 // GPIO4
DHS0 = P16 D12 = P12 // GPIO5
DHS1 = P17 D13 = P13 // GPIO6
DHS2 = P18 D14 = P14 // GPIO7
DHS3 = P19 D15 = P15 // GPIO8
DHS4 = P20 D16 = P16 // GPIOHS0
DHS5 = P21 D17 = P17 // GPIOHS1
DHS6 = P22 D18 = P18 // GPIOHS2
DHS7 = P23 D19 = P19 // GPIOHS3
DHS8 = P24 D20 = P20 // GPIOHS4
DHS9 = P25 D21 = P21 // GPIOHS5
DHS10 = P26 D22 = P22 // GPIOHS6
DHS11 = P27 D23 = P23 // GPIOHS7
DHS12 = P28 D24 = P24 // GPIOHS8
DHS13 = P29 D25 = P25 // GPIOHS9
DHS14 = P30 D26 = P26 // GPIOHS10 / SPI0_MISO
DHS15 = P31 D27 = P27 // GPIOHS11 / SPI0_SCLK
DHS16 = P32 D28 = P28 // GPIOHS12 / SPI0_MOSI
DHS17 = P33 D29 = P29 // GPIOHS13
DHS18 = P34 D30 = P30 // GPIOHS14
DHS19 = P35 D31 = P31 // GPIOHS15
DHS20 = P36 D32 = P32 // GPIOHS16
DHS21 = P37 D33 = P33 // GPIOHS17
DHS22 = P38 D34 = P34 // GPIOHS18
DHS23 = P39 D35 = P35 // GPIOHS19
DHS24 = P40 D36 = P36 // GPIOHS20
DHS25 = P41 D37 = P37 // GPIOHS21
DHS26 = P42 D38 = P38 // GPIOHS22
DHS27 = P43 D39 = P39 // GPIOHS23
DHS28 = P44 D40 = P40 // GPIOHS24
DHS29 = P45 D41 = P41 // GPIOHS25
DHS30 = P46 D42 = P42 // GPIOHS26
DHS31 = P47 D43 = P43 // GPIOHS27
D44 = P44 // GPIOHS28
D45 = P45 // GPIOHS29
D46 = P46 // GPIOHS30
D47 = P47 // GPIOHS31
) )
const ( const (
@ -55,13 +59,20 @@ const (
LED1 = LED_RED LED1 = LED_RED
LED2 = LED_GREEN LED2 = LED_GREEN
LED3 = LED_BLUE LED3 = LED_BLUE
LED_RED = D5 LED_RED = D13
LED_GREEN = D4 LED_GREEN = D12
LED_BLUE = D6 LED_BLUE = D14
) )
// Default pins for UARTHS // Default pins for UARTHS.
const ( const (
UART_TX_PIN = P05 UART_TX_PIN = D5
UART_RX_PIN = P04 UART_RX_PIN = D4
)
// SPI pins.
const (
SPI0_SCK_PIN = D27
SPI0_MOSI_PIN = D28
SPI0_MISO_PIN = D26
) )

15
src/machine/board_maixbit_baremetal.go Обычный файл
Просмотреть файл

@ -0,0 +1,15 @@
// +build k210,maixbit
package machine
import "device/kendryte"
// SPI on the MAix Bit.
var (
SPI0 = SPI{
Bus: kendryte.SPI0,
}
SPI1 = SPI{
Bus: kendryte.SPI1,
}
)

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

@ -4,6 +4,7 @@ package machine
import ( import (
"device/kendryte" "device/kendryte"
"errors"
"runtime/interrupt" "runtime/interrupt"
) )
@ -15,6 +16,7 @@ type PinMode uint8
type fpioaPullMode uint8 type fpioaPullMode uint8
type PinChange uint8 type PinChange uint8
// Pin modes.
const ( const (
PinInput PinMode = iota PinInput PinMode = iota
PinInputPullUp PinInputPullUp
@ -22,12 +24,14 @@ const (
PinOutput PinOutput
) )
// FPIOA internal pull resistors.
const ( const (
fpioaPullNone fpioaPullMode = iota fpioaPullNone fpioaPullMode = iota
fpioaPullDown fpioaPullDown
fpioaPullUp fpioaPullUp
) )
// GPIOHS pin interrupt events.
const ( const (
PinRising PinChange = iota + 1 PinRising PinChange = iota + 1
PinFalling PinFalling
@ -36,6 +40,20 @@ const (
PinLow = 8 PinLow = 8
) )
// FPIOA functions.
const (
fpioaFuncSpi0Sclk = 17
fpioaFuncSpi0D0 = 4
fpioaFuncSpi0D1 = 5
fpioaFuncSpi1Sclk = 83
fpioaFuncSpi1D0 = 70
fpioaFuncSpi1D1 = 71
)
var (
ErrUnsupportedSPIController = errors.New("SPI controller not supported. Use SPI0 or SPI1.")
)
func (p Pin) fpioaSetIOPull(pull fpioaPullMode) { func (p Pin) fpioaSetIOPull(pull fpioaPullMode) {
switch pull { switch pull {
case fpioaPullNone: case fpioaPullNone:
@ -340,3 +358,120 @@ func (uart UART) WriteByte(c byte) {
uart.Bus.TXDATA.Set(uint32(c)) uart.Bus.TXDATA.Set(uint32(c))
} }
type SPI struct {
Bus *kendryte.SPI_Type
}
// SPIConfig is used to store config info for SPI.
type SPIConfig struct {
Frequency uint32
SCK Pin
MOSI Pin
MISO Pin
LSBFirst bool
Mode uint8
}
// Configure is intended to setup the SPI interface.
// Only SPI controller 0 and 1 can be used because SPI2 is a special
// slave-mode controller and SPI3 is used for flashing.
func (spi SPI) Configure(config SPIConfig) error {
// Use default pins if not set.
if config.SCK == 0 && config.MOSI == 0 && config.MISO == 0 {
config.SCK = SPI0_SCK_PIN
config.MOSI = SPI0_MOSI_PIN
config.MISO = SPI0_MISO_PIN
}
// Enable pins for SPI.
sckBits := uint32(kendryte.FPIOA_IO_OE_EN | kendryte.FPIOA_IO_DS_Msk)
dataBits := uint32(kendryte.FPIOA_IO_OE_EN | kendryte.FPIOA_IO_OE_INV | kendryte.FPIOA_IO_IE_EN |
kendryte.FPIOA_IO_IE_INV | kendryte.FPIOA_IO_ST | kendryte.FPIOA_IO_DS_Msk)
// Enable APB2 clock.
kendryte.SYSCTL.CLK_EN_CENT.SetBits(kendryte.SYSCTL_CLK_EN_CENT_APB2_CLK_EN)
var fpioaFuncSclk uint32
var fpioaFuncD0 uint32
var fpioaFuncD1 uint32
switch spi.Bus {
case kendryte.SPI0:
// Initialize FPIOA values.
fpioaFuncSclk = fpioaFuncSpi0Sclk
fpioaFuncD0 = fpioaFuncSpi0D0
fpioaFuncD1 = fpioaFuncSpi0D1
// Initialize SPI clock.
kendryte.SYSCTL.CLK_EN_PERI.SetBits(kendryte.SYSCTL_CLK_EN_PERI_SPI0_CLK_EN)
kendryte.SYSCTL.CLK_TH1.ClearBits(kendryte.SYSCTL_CLK_TH1_SPI0_CLK_Msk)
case kendryte.SPI1:
// Initialize FPIOA values.
fpioaFuncSclk = fpioaFuncSpi1Sclk
fpioaFuncD0 = fpioaFuncSpi1D0
fpioaFuncD1 = fpioaFuncSpi1D1
// Initialize SPI clock.
kendryte.SYSCTL.CLK_EN_PERI.SetBits(kendryte.SYSCTL_CLK_EN_PERI_SPI1_CLK_EN)
kendryte.SYSCTL.CLK_TH1.ClearBits(kendryte.SYSCTL_CLK_TH1_SPI1_CLK_Msk)
default:
return ErrUnsupportedSPIController
}
// Set FPIOA functins for selected pins.
kendryte.FPIOA.IO[uint8(config.SCK)].Set(uint32(sckBits | fpioaFuncSclk))
kendryte.FPIOA.IO[uint8(config.MOSI)].Set(uint32(dataBits | fpioaFuncD0))
kendryte.FPIOA.IO[uint8(config.MISO)].Set(uint32(dataBits | fpioaFuncD1))
// Set default frequency.
if config.Frequency == 0 {
config.Frequency = 500000
}
baudr := CPUFrequency() / config.Frequency
print(baudr)
spi.Bus.BAUDR.Set(baudr)
// Configure SPI mode 0, standard frame format, 8-bit data, little-endian.
spi.Bus.IMR.Set(0)
spi.Bus.DMACR.Set(0)
spi.Bus.DMATDLR.Set(0x10)
spi.Bus.DMARDLR.Set(0)
spi.Bus.SER.Set(0)
spi.Bus.SSIENR.Set(0)
spi.Bus.CTRLR0.Set((7 << 16))
spi.Bus.SPI_CTRLR0.Set(0)
spi.Bus.ENDIAN.Set(0)
return nil
}
// Transfer writes/reads a single byte using the SPI interface.
func (spi SPI) Transfer(w byte) (byte, error) {
spi.Bus.SSIENR.Set(0)
// Set transfer-receive mode.
spi.Bus.CTRLR0.ClearBits(0x3 << 8)
// Enable/disable SPI.
spi.Bus.SSIENR.Set(1)
defer spi.Bus.SSIENR.Set(0)
// Enable/disable device.
spi.Bus.SER.Set(0x1)
defer spi.Bus.SER.Set(0)
spi.Bus.DR0.Set(uint32(w))
// Wait for transfer.
for spi.Bus.SR.Get()&0x05 != 0x04 {
}
// Wait for data.
for spi.Bus.RXFLR.Get() == 0 {
}
return byte(spi.Bus.DR0.Get()), nil
}

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

@ -1,4 +1,4 @@
// +build !baremetal sam stm32 fe310 // +build !baremetal sam stm32 fe310 k210
package machine package machine