machine/samd21: use HasBits() method to simplify bit comparisons

Signed-off-by: Ron Evans <ron@hybridgroup.com>
Этот коммит содержится в:
Ron Evans 2019-05-27 15:38:28 +02:00 коммит произвёл Ayke
родитель be491abc46
коммит 2504754325
3 изменённых файлов: 63 добавлений и 63 удалений

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

@ -201,7 +201,7 @@ func (a ADC) Get() uint16 {
waitADCSync() waitADCSync()
// Waiting for conversion to complete // Waiting for conversion to complete
for (sam.ADC.INTFLAG.Get() & sam.ADC_INTFLAG_RESRDY) == 0 { for !sam.ADC.INTFLAG.HasBits(sam.ADC_INTFLAG_RESRDY) {
} }
val := sam.ADC.RESULT.Get() val := sam.ADC.RESULT.Get()
@ -242,7 +242,7 @@ func (a ADC) getADCChannel() uint8 {
} }
func waitADCSync() { func waitADCSync() {
for (sam.ADC.STATUS.Get() & sam.ADC_STATUS_SYNCBUSY) > 0 { for sam.ADC.STATUS.HasBits(sam.ADC_STATUS_SYNCBUSY) {
} }
} }
@ -325,8 +325,8 @@ func (uart UART) Configure(config UARTConfig) {
// reset SERCOM0 // reset SERCOM0
uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_SWRST) uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_SWRST)
for (uart.Bus.CTRLA.Get()&sam.SERCOM_USART_CTRLA_SWRST) > 0 || for uart.Bus.CTRLA.HasBits(sam.SERCOM_USART_CTRLA_SWRST) ||
(uart.Bus.SYNCBUSY.Get()&sam.SERCOM_USART_SYNCBUSY_SWRST) > 0 { uart.Bus.SYNCBUSY.HasBits(sam.SERCOM_USART_SYNCBUSY_SWRST) {
} }
// set UART mode/sample rate // set UART mode/sample rate
@ -365,7 +365,7 @@ func (uart UART) Configure(config UARTConfig) {
// Enable USART1 port. // Enable USART1 port.
// sercom->USART.CTRLA.bit.ENABLE = 0x1u; // sercom->USART.CTRLA.bit.ENABLE = 0x1u;
uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_ENABLE) uart.Bus.CTRLA.SetBits(sam.SERCOM_USART_CTRLA_ENABLE)
for (uart.Bus.SYNCBUSY.Get() & sam.SERCOM_USART_SYNCBUSY_ENABLE) > 0 { for uart.Bus.SYNCBUSY.HasBits(sam.SERCOM_USART_SYNCBUSY_ENABLE) {
} }
// setup interrupt on receive // setup interrupt on receive
@ -398,7 +398,7 @@ func (uart UART) SetBaudRate(br uint32) {
// WriteByte writes a byte of data to the UART. // WriteByte writes a byte of data to the UART.
func (uart UART) WriteByte(c byte) error { func (uart UART) WriteByte(c byte) error {
// wait until ready to receive // wait until ready to receive
for (uart.Bus.INTFLAG.Get() & sam.SERCOM_USART_INTFLAG_DRE) == 0 { for !uart.Bus.INTFLAG.HasBits(sam.SERCOM_USART_INTFLAG_DRE) {
} }
uart.Bus.DATA.Set(uint16(c)) uart.Bus.DATA.Set(uint16(c))
return nil return nil
@ -454,8 +454,8 @@ func (i2c I2C) Configure(config I2CConfig) {
// reset SERCOM // reset SERCOM
i2c.Bus.CTRLA.SetBits(sam.SERCOM_I2CM_CTRLA_SWRST) i2c.Bus.CTRLA.SetBits(sam.SERCOM_I2CM_CTRLA_SWRST)
for (i2c.Bus.CTRLA.Get()&sam.SERCOM_I2CM_CTRLA_SWRST) > 0 || for i2c.Bus.CTRLA.HasBits(sam.SERCOM_I2CM_CTRLA_SWRST) ||
(i2c.Bus.SYNCBUSY.Get()&sam.SERCOM_I2CM_SYNCBUSY_SWRST) > 0 { i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_SWRST) {
} }
// Set i2c master mode // Set i2c master mode
@ -467,12 +467,12 @@ func (i2c I2C) Configure(config I2CConfig) {
// Enable I2CM port. // Enable I2CM port.
// sercom->USART.CTRLA.bit.ENABLE = 0x1u; // sercom->USART.CTRLA.bit.ENABLE = 0x1u;
i2c.Bus.CTRLA.SetBits(sam.SERCOM_I2CM_CTRLA_ENABLE) i2c.Bus.CTRLA.SetBits(sam.SERCOM_I2CM_CTRLA_ENABLE)
for (i2c.Bus.SYNCBUSY.Get() & sam.SERCOM_I2CM_SYNCBUSY_ENABLE) > 0 { for i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_ENABLE) {
} }
// set bus idle mode // set bus idle mode
i2c.Bus.STATUS.SetBits(wireIdleState << sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos) i2c.Bus.STATUS.SetBits(wireIdleState << sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos)
for (i2c.Bus.SYNCBUSY.Get() & sam.SERCOM_I2CM_SYNCBUSY_SYSOP) > 0 { for i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_SYSOP) {
} }
// enable pins // enable pins
@ -499,7 +499,7 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
// wait until transmission complete // wait until transmission complete
timeout := i2cTimeout timeout := i2cTimeout
for (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_MB) == 0 { for !i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_MB) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on ready to write data") return errors.New("I2C timeout on ready to write data")
@ -507,7 +507,7 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
} }
// ACK received (0: ACK, 1: NACK) // ACK received (0: ACK, 1: NACK)
if (i2c.Bus.STATUS.Get() & sam.SERCOM_I2CM_STATUS_RXNACK) > 0 { if i2c.Bus.STATUS.HasBits(sam.SERCOM_I2CM_STATUS_RXNACK) {
return errors.New("I2C write error: expected ACK not NACK") return errors.New("I2C write error: expected ACK not NACK")
} }
@ -529,17 +529,17 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
i2c.sendAddress(addr, false) i2c.sendAddress(addr, false)
// wait transmission complete // wait transmission complete
for (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_SB) == 0 { for !i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_SB) {
// If the slave NACKS the address, the MB bit will be set. // If the slave NACKS the address, the MB bit will be set.
// In that case, send a stop condition and return error. // In that case, send a stop condition and return error.
if (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_MB) > 0 { if i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_MB) {
i2c.Bus.CTRLB.SetBits(wireCmdStop << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Stop condition i2c.Bus.CTRLB.SetBits(wireCmdStop << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Stop condition
return errors.New("I2C read error: expected ACK not NACK") return errors.New("I2C read error: expected ACK not NACK")
} }
} }
// ACK received (0: ACK, 1: NACK) // ACK received (0: ACK, 1: NACK)
if (i2c.Bus.STATUS.Get() & sam.SERCOM_I2CM_STATUS_RXNACK) > 0 { if i2c.Bus.STATUS.HasBits(sam.SERCOM_I2CM_STATUS_RXNACK) {
return errors.New("I2C read error: expected ACK not NACK") return errors.New("I2C read error: expected ACK not NACK")
} }
@ -574,9 +574,9 @@ func (i2c I2C) WriteByte(data byte) error {
// wait until transmission successful // wait until transmission successful
timeout := i2cTimeout timeout := i2cTimeout
for (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_MB) == 0 { for !i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_MB) {
// check for bus error // check for bus error
if (sam.SERCOM3_I2CM.STATUS.Get() & sam.SERCOM_I2CM_STATUS_BUSERR) > 0 { if sam.SERCOM3_I2CM.STATUS.HasBits(sam.SERCOM_I2CM_STATUS_BUSERR) {
return errors.New("I2C bus error") return errors.New("I2C bus error")
} }
timeout-- timeout--
@ -585,7 +585,7 @@ func (i2c I2C) WriteByte(data byte) error {
} }
} }
if (i2c.Bus.STATUS.Get() & sam.SERCOM_I2CM_STATUS_RXNACK) > 0 { if i2c.Bus.STATUS.HasBits(sam.SERCOM_I2CM_STATUS_RXNACK) {
return errors.New("I2C write error: expected ACK not NACK") return errors.New("I2C write error: expected ACK not NACK")
} }
@ -601,8 +601,8 @@ func (i2c I2C) sendAddress(address uint16, write bool) error {
// wait until bus ready // wait until bus ready
timeout := i2cTimeout timeout := i2cTimeout
for (i2c.Bus.STATUS.Get()&(wireIdleState<<sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos)) == 0 && for !i2c.Bus.STATUS.HasBits(wireIdleState<<sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos) &&
(i2c.Bus.STATUS.Get()&(wireOwnerState<<sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos)) == 0 { !i2c.Bus.STATUS.HasBits(wireOwnerState<<sam.SERCOM_I2CM_STATUS_BUSSTATE_Pos) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on bus ready") return errors.New("I2C timeout on bus ready")
@ -616,7 +616,7 @@ func (i2c I2C) sendAddress(address uint16, write bool) error {
func (i2c I2C) signalStop() error { func (i2c I2C) signalStop() error {
i2c.Bus.CTRLB.SetBits(wireCmdStop << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Stop command i2c.Bus.CTRLB.SetBits(wireCmdStop << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Stop command
timeout := i2cTimeout timeout := i2cTimeout
for (i2c.Bus.SYNCBUSY.Get() & sam.SERCOM_I2CM_SYNCBUSY_SYSOP) > 0 { for i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_SYSOP) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on signal stop") return errors.New("I2C timeout on signal stop")
@ -628,7 +628,7 @@ func (i2c I2C) signalStop() error {
func (i2c I2C) signalRead() error { func (i2c I2C) signalRead() error {
i2c.Bus.CTRLB.SetBits(wireCmdRead << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Read command i2c.Bus.CTRLB.SetBits(wireCmdRead << sam.SERCOM_I2CM_CTRLB_CMD_Pos) // Read command
timeout := i2cTimeout timeout := i2cTimeout
for (i2c.Bus.SYNCBUSY.Get() & sam.SERCOM_I2CM_SYNCBUSY_SYSOP) > 0 { for i2c.Bus.SYNCBUSY.HasBits(sam.SERCOM_I2CM_SYNCBUSY_SYSOP) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on signal read") return errors.New("I2C timeout on signal read")
@ -638,7 +638,7 @@ func (i2c I2C) signalRead() error {
} }
func (i2c I2C) readByte() byte { func (i2c I2C) readByte() byte {
for (i2c.Bus.INTFLAG.Get() & sam.SERCOM_I2CM_INTFLAG_SB) == 0 { for !i2c.Bus.INTFLAG.HasBits(sam.SERCOM_I2CM_INTFLAG_SB) {
} }
return byte(i2c.Bus.DATA.Get()) return byte(i2c.Bus.DATA.Get())
} }
@ -697,11 +697,11 @@ func (i2s I2S) Configure(config I2SConfig) {
// reset the device // reset the device
i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_SWRST) i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_SWRST)
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_SWRST) > 0 { for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_SWRST) {
} }
// disable device before continuing // disable device before continuing
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_ENABLE) > 0 { for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_ENABLE) {
} }
i2s.Bus.CTRLA.ClearBits(sam.I2S_CTRLA_ENABLE) i2s.Bus.CTRLA.ClearBits(sam.I2S_CTRLA_ENABLE)
@ -797,17 +797,17 @@ func (i2s I2S) Configure(config I2SConfig) {
// re-enable // re-enable
i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_ENABLE) i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_ENABLE)
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_ENABLE) > 0 { for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_ENABLE) {
} }
// enable i2s clock // enable i2s clock
i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_CKEN0) i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_CKEN0)
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_CKEN0) > 0 { for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_CKEN0) {
} }
// enable i2s serializer // enable i2s serializer
i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_SEREN1) i2s.Bus.CTRLA.SetBits(sam.I2S_CTRLA_SEREN1)
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_SEREN1) > 0 { for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_SEREN1) {
} }
} }
@ -817,10 +817,10 @@ func (i2s I2S) Read(p []uint32) (n int, err error) {
i := 0 i := 0
for i = 0; i < len(p); i++ { for i = 0; i < len(p); i++ {
// Wait until ready // Wait until ready
for (i2s.Bus.INTFLAG.Get() & sam.I2S_INTFLAG_RXRDY1) == 0 { for !i2s.Bus.INTFLAG.HasBits(sam.I2S_INTFLAG_RXRDY1) {
} }
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_DATA1) > 0 { for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_DATA1) {
} }
// read data // read data
@ -839,10 +839,10 @@ func (i2s I2S) Write(p []uint32) (n int, err error) {
i := 0 i := 0
for i = 0; i < len(p); i++ { for i = 0; i < len(p); i++ {
// Wait until ready // Wait until ready
for (i2s.Bus.INTFLAG.Get() & sam.I2S_INTFLAG_TXRDY1) == 0 { for !i2s.Bus.INTFLAG.HasBits(sam.I2S_INTFLAG_TXRDY1) {
} }
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_DATA1) > 0 { for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_DATA1) {
} }
// write data // write data
@ -858,7 +858,7 @@ func (i2s I2S) Write(p []uint32) (n int, err error) {
// Close the I2S bus. // Close the I2S bus.
func (i2s I2S) Close() error { func (i2s I2S) Close() error {
// Sync wait // Sync wait
for (i2s.Bus.SYNCBUSY.Get() & sam.I2S_SYNCBUSY_ENABLE) > 0 { for i2s.Bus.SYNCBUSY.HasBits(sam.I2S_SYNCBUSY_ENABLE) {
} }
// disable I2S // disable I2S
@ -868,7 +868,7 @@ func (i2s I2S) Close() error {
} }
func waitForSync() { func waitForSync() {
for (sam.GCLK.STATUS.Get() & sam.GCLK_STATUS_SYNCBUSY) > 0 { for sam.GCLK.STATUS.HasBits(sam.GCLK_STATUS_SYNCBUSY) {
} }
} }
@ -903,7 +903,7 @@ func (spi SPI) Configure(config SPIConfig) {
// Disable SPI port. // Disable SPI port.
spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_ENABLE) spi.Bus.CTRLA.ClearBits(sam.SERCOM_SPI_CTRLA_ENABLE)
for (spi.Bus.SYNCBUSY.Get() & sam.SERCOM_SPI_SYNCBUSY_ENABLE) > 0 { for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_ENABLE) {
} }
// enable pins // enable pins
@ -913,8 +913,8 @@ func (spi SPI) Configure(config SPIConfig) {
// reset SERCOM // reset SERCOM
spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_SWRST) spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_SWRST)
for (spi.Bus.CTRLA.Get()&sam.SERCOM_SPI_CTRLA_SWRST) > 0 || for spi.Bus.CTRLA.HasBits(sam.SERCOM_SPI_CTRLA_SWRST) ||
(spi.Bus.SYNCBUSY.Get()&sam.SERCOM_SPI_SYNCBUSY_SWRST) > 0 { spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_SWRST) {
} }
// set bit transfer order // set bit transfer order
@ -932,7 +932,7 @@ func (spi SPI) Configure(config SPIConfig) {
spi.Bus.CTRLB.SetBits((0 << sam.SERCOM_SPI_CTRLB_CHSIZE_Pos) | // 8bit char size spi.Bus.CTRLB.SetBits((0 << sam.SERCOM_SPI_CTRLB_CHSIZE_Pos) | // 8bit char size
sam.SERCOM_SPI_CTRLB_RXEN) // receive enable sam.SERCOM_SPI_CTRLB_RXEN) // receive enable
for (spi.Bus.SYNCBUSY.Get() & sam.SERCOM_SPI_SYNCBUSY_CTRLB) > 0 { for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_CTRLB) {
} }
// set mode // set mode
@ -959,7 +959,7 @@ func (spi SPI) Configure(config SPIConfig) {
// Enable SPI port. // Enable SPI port.
spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_ENABLE) spi.Bus.CTRLA.SetBits(sam.SERCOM_SPI_CTRLA_ENABLE)
for (spi.Bus.SYNCBUSY.Get() & sam.SERCOM_SPI_SYNCBUSY_ENABLE) > 0 { for spi.Bus.SYNCBUSY.HasBits(sam.SERCOM_SPI_SYNCBUSY_ENABLE) {
} }
} }
@ -969,7 +969,7 @@ func (spi SPI) Transfer(w byte) (byte, error) {
spi.Bus.DATA.Set(uint32(w)) spi.Bus.DATA.Set(uint32(w))
// wait for receive // wait for receive
for (spi.Bus.INTFLAG.Get() & sam.SERCOM_SPI_INTFLAG_RXC) == 0 { for !spi.Bus.INTFLAG.HasBits(sam.SERCOM_SPI_INTFLAG_RXC) {
} }
// return data // return data
@ -988,14 +988,14 @@ func InitPWM() {
sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_TCC0_TCC1 << sam.GCLK_CLKCTRL_ID_Pos) | sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_TCC0_TCC1 << sam.GCLK_CLKCTRL_ID_Pos) |
(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) | (sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
sam.GCLK_CLKCTRL_CLKEN) sam.GCLK_CLKCTRL_CLKEN)
for (sam.GCLK.STATUS.Get() & sam.GCLK_STATUS_SYNCBUSY) > 0 { for sam.GCLK.STATUS.HasBits(sam.GCLK_STATUS_SYNCBUSY) {
} }
// Use GCLK0 for TCC2/TC3 // Use GCLK0 for TCC2/TC3
sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_TCC2_TC3 << sam.GCLK_CLKCTRL_ID_Pos) | sam.GCLK.CLKCTRL.Set((sam.GCLK_CLKCTRL_ID_TCC2_TC3 << sam.GCLK_CLKCTRL_ID_Pos) |
(sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) | (sam.GCLK_CLKCTRL_GEN_GCLK0 << sam.GCLK_CLKCTRL_GEN_Pos) |
sam.GCLK_CLKCTRL_CLKEN) sam.GCLK_CLKCTRL_CLKEN)
for (sam.GCLK.STATUS.Get() & sam.GCLK_STATUS_SYNCBUSY) > 0 { for sam.GCLK.STATUS.HasBits(sam.GCLK_STATUS_SYNCBUSY) {
} }
} }
@ -1007,20 +1007,20 @@ func (pwm PWM) Configure() {
// disable timer // disable timer
timer.CTRLA.ClearBits(sam.TCC_CTRLA_ENABLE) timer.CTRLA.ClearBits(sam.TCC_CTRLA_ENABLE)
// Wait for synchronization // Wait for synchronization
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_ENABLE) > 0 { for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_ENABLE) {
} }
// Use "Normal PWM" (single-slope PWM) // Use "Normal PWM" (single-slope PWM)
timer.WAVE.SetBits(sam.TCC_WAVE_WAVEGEN_NPWM) timer.WAVE.SetBits(sam.TCC_WAVE_WAVEGEN_NPWM)
// Wait for synchronization // Wait for synchronization
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_WAVE) > 0 { for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_WAVE) {
} }
// Set the period (the number to count to (TOP) before resetting timer) // Set the period (the number to count to (TOP) before resetting timer)
//TCC0->PER.reg = period; //TCC0->PER.reg = period;
timer.PER.Set(period) timer.PER.Set(period)
// Wait for synchronization // Wait for synchronization
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_PER) > 0 { for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_PER) {
} }
// Set pin as output // Set pin as output
@ -1060,23 +1060,23 @@ func (pwm PWM) Set(value uint16) {
timer.CTRLA.ClearBits(sam.TCC_CTRLA_ENABLE) timer.CTRLA.ClearBits(sam.TCC_CTRLA_ENABLE)
// Wait for synchronization // Wait for synchronization
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_ENABLE) > 0 { for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_ENABLE) {
} }
// Set PWM signal to output duty cycle // Set PWM signal to output duty cycle
pwm.setChannel(uint32(value)) pwm.setChannel(uint32(value))
// Wait for synchronization on all channels // Wait for synchronization on all channels
for (timer.SYNCBUSY.Get() & (sam.TCC_SYNCBUSY_CC0 | for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_CC0 |
sam.TCC_SYNCBUSY_CC1 | sam.TCC_SYNCBUSY_CC1 |
sam.TCC_SYNCBUSY_CC2 | sam.TCC_SYNCBUSY_CC2 |
sam.TCC_SYNCBUSY_CC3)) > 0 { sam.TCC_SYNCBUSY_CC3) {
} }
// enable // enable
timer.CTRLA.SetBits(sam.TCC_CTRLA_ENABLE) timer.CTRLA.SetBits(sam.TCC_CTRLA_ENABLE)
// Wait for synchronization // Wait for synchronization
for (timer.SYNCBUSY.Get() & sam.TCC_SYNCBUSY_ENABLE) > 0 { for timer.SYNCBUSY.HasBits(sam.TCC_SYNCBUSY_ENABLE) {
} }
} }
@ -1233,8 +1233,8 @@ var (
func (usbcdc USBCDC) Configure(config UARTConfig) { func (usbcdc USBCDC) Configure(config UARTConfig) {
// reset USB interface // reset USB interface
sam.USB_DEVICE.CTRLA.SetBits(sam.USB_DEVICE_CTRLA_SWRST) sam.USB_DEVICE.CTRLA.SetBits(sam.USB_DEVICE_CTRLA_SWRST)
for (sam.USB_DEVICE.SYNCBUSY.Get()&sam.USB_DEVICE_SYNCBUSY_SWRST) > 0 || for sam.USB_DEVICE.SYNCBUSY.HasBits(sam.USB_DEVICE_SYNCBUSY_SWRST) ||
(sam.USB_DEVICE.SYNCBUSY.Get()&sam.USB_DEVICE_SYNCBUSY_ENABLE) > 0 { sam.USB_DEVICE.SYNCBUSY.HasBits(sam.USB_DEVICE_SYNCBUSY_ENABLE) {
} }
sam.USB_DEVICE.DESCADD.Set(uint32(uintptr(unsafe.Pointer(&usbEndpointDescriptors)))) sam.USB_DEVICE.DESCADD.Set(uint32(uintptr(unsafe.Pointer(&usbEndpointDescriptors))))

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

@ -439,7 +439,7 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
// clear timeout here // clear timeout here
timeout := i2cTimeout timeout := i2cTimeout
for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL|stm32.I2C_SR2_BUSY) { for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL | stm32.I2C_SR2_BUSY) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on read clear address") return errors.New("I2C timeout on read clear address")
@ -478,7 +478,7 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
// clear address here // clear address here
timeout := i2cTimeout timeout := i2cTimeout
for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL|stm32.I2C_SR2_BUSY) { for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL | stm32.I2C_SR2_BUSY) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on read clear address") return errors.New("I2C timeout on read clear address")
@ -524,7 +524,7 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
// clear address here // clear address here
timeout := i2cTimeout timeout := i2cTimeout
for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL|stm32.I2C_SR2_BUSY) { for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL | stm32.I2C_SR2_BUSY) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on read clear address") return errors.New("I2C timeout on read clear address")
@ -579,7 +579,7 @@ func (i2c I2C) Tx(addr uint16, w, r []byte) error {
// clear address here // clear address here
timeout := i2cTimeout timeout := i2cTimeout
for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL|stm32.I2C_SR2_BUSY) { for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL | stm32.I2C_SR2_BUSY) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on read clear address") return errors.New("I2C timeout on read clear address")
@ -721,7 +721,7 @@ func (i2c I2C) sendAddress(address uint8, write bool) error {
} }
timeout = i2cTimeout timeout = i2cTimeout
for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL|stm32.I2C_SR2_BUSY|stm32.I2C_SR2_TRA) { for !i2c.Bus.SR2.HasBits(stm32.I2C_SR2_MSL | stm32.I2C_SR2_BUSY | stm32.I2C_SR2_TRA) {
timeout-- timeout--
if timeout == 0 { if timeout == 0 {
return errors.New("I2C timeout on send write address") return errors.New("I2C timeout on send write address")

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

@ -67,13 +67,13 @@ func initClocks() {
sam.SYSCTRL_OSC32K_EN1K | sam.SYSCTRL_OSC32K_EN1K |
sam.SYSCTRL_OSC32K_ENABLE) sam.SYSCTRL_OSC32K_ENABLE)
// Wait for oscillator stabilization // Wait for oscillator stabilization
for (sam.SYSCTRL.PCLKSR.Get() & sam.SYSCTRL_PCLKSR_OSC32KRDY) == 0 { for !sam.SYSCTRL.PCLKSR.HasBits(sam.SYSCTRL_PCLKSR_OSC32KRDY) {
} }
// Software reset the module to ensure it is re-initialized correctly // Software reset the module to ensure it is re-initialized correctly
sam.GCLK.CTRL.Set(sam.GCLK_CTRL_SWRST) sam.GCLK.CTRL.Set(sam.GCLK_CTRL_SWRST)
// Wait for reset to complete // Wait for reset to complete
for (sam.GCLK.CTRL.Get()&sam.GCLK_CTRL_SWRST) > 0 && (sam.GCLK.STATUS.Get()&sam.GCLK_STATUS_SYNCBUSY) > 0 { for sam.GCLK.CTRL.HasBits(sam.GCLK_CTRL_SWRST) && sam.GCLK.STATUS.HasBits(sam.GCLK_STATUS_SYNCBUSY) {
} }
// Put OSC32K as source of Generic Clock Generator 1 // Put OSC32K as source of Generic Clock Generator 1
@ -96,7 +96,7 @@ func initClocks() {
// Remove the OnDemand mode, Bug http://avr32.icgroup.norway.atmel.com/bugzilla/show_bug.cgi?id=9905 // Remove the OnDemand mode, Bug http://avr32.icgroup.norway.atmel.com/bugzilla/show_bug.cgi?id=9905
sam.SYSCTRL.DFLLCTRL.Set(sam.SYSCTRL_DFLLCTRL_ENABLE) sam.SYSCTRL.DFLLCTRL.Set(sam.SYSCTRL_DFLLCTRL_ENABLE)
// Wait for ready // Wait for ready
for (sam.SYSCTRL.PCLKSR.Get() & sam.SYSCTRL_PCLKSR_DFLLRDY) == 0 { for !sam.SYSCTRL.PCLKSR.HasBits(sam.SYSCTRL_PCLKSR_DFLLRDY) {
} }
// Handle DFLL calibration based on info learned from Arduino SAMD implementation, // Handle DFLL calibration based on info learned from Arduino SAMD implementation,
@ -130,13 +130,13 @@ func initClocks() {
sam.SYSCTRL_DFLLCTRL_USBCRM | sam.SYSCTRL_DFLLCTRL_USBCRM |
sam.SYSCTRL_DFLLCTRL_BPLCKC) sam.SYSCTRL_DFLLCTRL_BPLCKC)
// Wait for ready // Wait for ready
for (sam.SYSCTRL.PCLKSR.Get() & sam.SYSCTRL_PCLKSR_DFLLRDY) == 0 { for !sam.SYSCTRL.PCLKSR.HasBits(sam.SYSCTRL_PCLKSR_DFLLRDY) {
} }
// Re-enable the DFLL // Re-enable the DFLL
sam.SYSCTRL.DFLLCTRL.SetBits(sam.SYSCTRL_DFLLCTRL_ENABLE) sam.SYSCTRL.DFLLCTRL.SetBits(sam.SYSCTRL_DFLLCTRL_ENABLE)
// Wait for ready // Wait for ready
for (sam.SYSCTRL.PCLKSR.Get() & sam.SYSCTRL_PCLKSR_DFLLRDY) == 0 { for !sam.SYSCTRL.PCLKSR.HasBits(sam.SYSCTRL_PCLKSR_DFLLRDY) {
} }
// Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. // Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz.
@ -154,7 +154,7 @@ func initClocks() {
sam.SYSCTRL.OSC8M.SetBits(sam.SYSCTRL_OSC8M_PRESC_0 << sam.SYSCTRL_OSC8M_PRESC_Pos) sam.SYSCTRL.OSC8M.SetBits(sam.SYSCTRL_OSC8M_PRESC_0 << sam.SYSCTRL_OSC8M_PRESC_Pos)
sam.SYSCTRL.OSC8M.ClearBits(1 << sam.SYSCTRL_OSC8M_ONDEMAND_Pos) sam.SYSCTRL.OSC8M.ClearBits(1 << sam.SYSCTRL_OSC8M_ONDEMAND_Pos)
// Wait for oscillator stabilization // Wait for oscillator stabilization
for (sam.SYSCTRL.PCLKSR.Get() & sam.SYSCTRL_PCLKSR_OSC8MRDY) == 0 { for !sam.SYSCTRL.PCLKSR.HasBits(sam.SYSCTRL_PCLKSR_OSC8MRDY) {
} }
// Use OSC8M as source for Generic Clock Generator 3 // Use OSC8M as source for Generic Clock Generator 3
@ -218,7 +218,7 @@ func initRTC() {
} }
func waitForSync() { func waitForSync() {
for (sam.GCLK.STATUS.Get() & sam.GCLK_STATUS_SYNCBUSY) > 0 { for sam.GCLK.STATUS.HasBits(sam.GCLK_STATUS_SYNCBUSY) {
} }
} }