diff --git a/examples/sd/main.go b/examples/sd/main.go index 55a01d1..9df0cc2 100644 --- a/examples/sd/main.go +++ b/examples/sd/main.go @@ -17,18 +17,19 @@ const ( var ( spibus = machine.SPI0 -) - -func main() { - time.Sleep(time.Second) - SPI_CS_PIN.Configure(machine.PinConfig{Mode: machine.PinOutput}) - err := spibus.Configure(machine.SPIConfig{ + spicfg = machine.SPIConfig{ Frequency: 250000, Mode: 0, SCK: SPI_SCK_PIN, SDO: SPI_TX_PIN, SDI: SPI_RX_PIN, - }) + } +) + +func main() { + time.Sleep(time.Second) + SPI_CS_PIN.Configure(machine.PinConfig{Mode: machine.PinOutput}) + err := spibus.Configure(spicfg) if err != nil { panic(err.Error()) } @@ -38,9 +39,14 @@ func main() { if err != nil { panic("sd card init:" + err.Error()) } + // After initialization it's safe to increase SPI clock speed. + csd := sdcard.CSD() + kbps := csd.TransferSpeed().RateKilobits() + spicfg.Frequency = uint32(kbps * 1000) + err = spibus.Configure(spicfg) + cid := sdcard.CID() pname := cid.ProductName() - csd := sdcard.CSD() if !cid.IsValid() { copy := cid.RawCopy() println("CID not valid: theirCRC=", cid.CRC7(), "ourCRC=", sd.CRC7(copy[:15])) diff --git a/sd/card.go b/sd/card.go index b0ff98f..13bfbc9 100644 --- a/sd/card.go +++ b/sd/card.go @@ -58,6 +58,8 @@ func (c *SPICard) csEnable(b bool) { c.cs(!b) } func (c *SPICard) LastReadCRC() uint16 { return c.lastCRC } func (c *SPICard) LastR1() r1 { return c.lastr1 } +// Init initializes the SD card. This routine should be performed with a SPI clock +// speed of around 100..400kHz. One may increase the clock speed after initialization. func (d *SPICard) Init() error { dummy := d.buf[:] for i := range dummy { diff --git a/sd/definitions.go b/sd/definitions.go index 4ae58f7..2adbb3e 100644 --- a/sd/definitions.go +++ b/sd/definitions.go @@ -447,7 +447,7 @@ var log10table = [...]int64{ 1000000, } -// RateMegabits returns the transfer rate in megabits per second. +// RateMegabits returns the transfer rate in kilobits per second. func (t TransferSpeed) RateKilobits() int64 { return 100 * log10table[t&0b111] }