void spi_preinit(spi_t *obj, PinName mosi, PinName miso, PinName clk, PinName cs) { SPIName spi_mosi = (SPIName) pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName) pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_clk = (SPIName) pinmap_peripheral(clk, PinMap_SPI_CLK); SPIName spi_cs = (SPIName) pinmap_peripheral(cs, PinMap_SPI_CS); SPIName spi_data = (SPIName) pinmap_merge(spi_mosi, spi_miso); SPIName spi_ctrl = (SPIName) pinmap_merge(spi_clk, spi_cs); obj->spi.spi = (USART_TypeDef *) pinmap_merge(spi_data, spi_ctrl); MBED_ASSERT((int) obj->spi.spi != NC); if (cs != NC) { /* Slave mode */ obj->spi.master = false; } else { obj->spi.master = true; } #if defined(_SILICON_LABS_32B_PLATFORM_1) // On P1, we need to ensure all pins are on same location uint32_t loc_mosi = pin_location(mosi, PinMap_SPI_MOSI); uint32_t loc_miso = pin_location(miso, PinMap_SPI_MISO); uint32_t loc_clk = pin_location(clk, PinMap_SPI_CLK); uint32_t loc_cs = pin_location(cs, PinMap_SPI_CS); uint32_t loc_data = pinmap_merge(loc_mosi, loc_miso); uint32_t loc_ctrl = pinmap_merge(loc_clk, loc_cs); obj->spi.location = pinmap_merge(loc_data, loc_ctrl); MBED_ASSERT(obj->spi.location != NC); #endif obj->spi.dmaOptionsTX.dmaUsageState = DMA_USAGE_OPPORTUNISTIC; }
void spi_preinit(spi_t *obj, PinName mosi, PinName miso, PinName clk, PinName cs) { SPIName spi_mosi = (SPIName) pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName) pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_clk = (SPIName) pinmap_peripheral(clk, PinMap_SPI_CLK); SPIName spi_cs = (SPIName) pinmap_peripheral(cs, PinMap_SPI_CS); SPIName spi_data = (SPIName) pinmap_merge(spi_mosi, spi_miso); SPIName spi_ctrl = (SPIName) pinmap_merge(spi_clk, spi_cs); obj->spi.spi = (USART_TypeDef *) pinmap_merge(spi_data, spi_ctrl); MBED_ASSERT((int) obj->spi.spi != NC); if (cs != NC) { /* Slave mode */ obj->spi.master = false; } else { obj->spi.master = true; } uint32_t loc_mosi = pin_location(mosi, PinMap_SPI_MOSI); uint32_t loc_miso = pin_location(miso, PinMap_SPI_MISO); uint32_t loc_clk = pin_location(clk, PinMap_SPI_CLK); uint32_t loc_cs = pin_location(cs, PinMap_SPI_CS); uint32_t loc_data = pinmap_merge(loc_mosi, loc_miso); uint32_t loc_ctrl = pinmap_merge(loc_clk, loc_cs); obj->spi.location = pinmap_merge(loc_data, loc_ctrl); MBED_ASSERT(obj->spi.location != NC); obj->spi.dmaOptionsTX.dmaUsageState = DMA_USAGE_OPPORTUNISTIC; }
void i2c_preinit(i2c_t *obj, PinName sda, PinName scl) { I2CName i2c_sda = (I2CName) pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName) pinmap_peripheral(scl, PinMap_I2C_SCL); obj->i2c.i2c = (I2C_TypeDef*) pinmap_merge(i2c_sda, i2c_scl); MBED_ASSERT(((int) obj->i2c.i2c) != NC); int loc_sda = pin_location(sda, PinMap_I2C_SDA); int loc_scl = pin_location(scl, PinMap_I2C_SCL); obj->i2c.loc = pinmap_merge(loc_sda, loc_scl); MBED_ASSERT(obj->i2c.loc != NC); obj->i2c.sda = sda; obj->i2c.scl = scl; }
void analogin_init(analogin_t *obj, PinName pin) { static uint8_t adc_initialized = 0; /* Init structure */ obj->adc = (ADC_TypeDef *) pinmap_peripheral(pin, PinMap_ADC); MBED_ASSERT((int) obj->adc != NC); obj->channel = pin_location(pin, PinMap_ADC); MBED_ASSERT((int) obj->channel != NC); /* Only initialize the ADC once */ if (!adc_initialized) { /* Turn on the clock */ CMU_ClockEnable(cmuClock_ADC0, true); /* Init with default settings */ ADC_Init_TypeDef init = ADC_INIT_DEFAULT; init.prescale = 4; ADC_Init(obj->adc, &init); /* Init for single conversion use */ ADC_InitSingle_TypeDef singleInit = ADC_INITSINGLE_DEFAULT; /* Measure input channel with Vdd reference. */ singleInit.reference = adcRefVDD; singleInit.resolution = adcRes12Bit; singleInit.acqTime = adcAcqTime32; ADC_InitSingle(obj->adc, &singleInit); adc_initialized = 1; } }
void analogout_init(dac_t *obj, PinName pin) { /* init in-memory structure */ obj->dac = (DAC_TypeDef *) pinmap_peripheral(pin, PinMap_DAC); MBED_ASSERT((int) obj->dac != NC); obj->channel = pin_location(pin, PinMap_DAC); MBED_ASSERT((int) obj->channel != NC); pin_mode(pin, Disabled); if (!dac_initialized) { /* Initialize the DAC. Will disable both DAC channels, so should only be done once */ /* Use default settings */ CMU_ClockEnable(cmuClock_DAC0, true); DAC_Init_TypeDef init = DAC_INIT_DEFAULT; /* Calculate the DAC clock prescaler value that will result in a DAC clock * close to 500kHz. Second parameter is zero. This uses the current HFPERCLK * frequency instead of setting a new one. */ init.prescale = DAC_PrescaleCalc(500000, REFERENCE_FREQUENCY); /* Set reference voltage to VDD */ init.reference = dacRefVDD; DAC_Init(obj->dac, &init); dac_initialized = 1; } /* Use default channel settings */ DAC_InitChannel_TypeDef initChannel = DAC_INITCHANNEL_DEFAULT; initChannel.enable = true; DAC_InitChannel(obj->dac, &initChannel, obj->channel); }
void analogout_preinit(dac_t *obj, PinName pin) { obj->dac = (DAC_TypeDef *) pinmap_peripheral(pin, PinMap_DAC); MBED_ASSERT((int) obj->dac != NC); obj->channel = pin_location(pin, PinMap_DAC); MBED_ASSERT((int) obj->channel != NC); }
void spi_enable_pins(spi_t *obj, uint8_t enable, PinName mosi, PinName miso, PinName clk, PinName cs) { if (enable) { if (obj->spi.master) { /* Master mode */ /* Either mosi or miso can be NC */ if (mosi != NC) { pin_mode(mosi, PushPull); } if (miso != NC) { pin_mode(miso, Input); } pin_mode(clk, PushPull); /* Don't set cs pin, since we toggle it manually */ } else { /* Slave mode */ if (mosi != NC) { pin_mode(mosi, Input); } if (miso != NC) { pin_mode(miso, PushPull); } pin_mode(clk, Input); pin_mode(cs, Input); } } else { // TODO_LP return PinMode to the previous state if (obj->spi.master) { /* Master mode */ /* Either mosi or miso can be NC */ if (mosi != NC) { pin_mode(mosi, Disabled); } if (miso != NC) { pin_mode(miso, Disabled); } pin_mode(clk, Disabled); /* Don't set cs pin, since we toggle it manually */ } else { /* Slave mode */ if (mosi != NC) { pin_mode(mosi, Disabled); } if (miso != NC) { pin_mode(miso, Disabled); } pin_mode(clk, Disabled); pin_mode(cs, Disabled); } } /* Enabling pins and setting location */ #ifdef _USART_ROUTEPEN_RESETVALUE uint32_t route = USART_ROUTEPEN_CLKPEN; obj->spi.spi->ROUTELOC0 &= ~_USART_ROUTELOC0_CLKLOC_MASK; obj->spi.spi->ROUTELOC0 |= pin_location(clk, PinMap_SPI_CLK)<<_USART_ROUTELOC0_CLKLOC_SHIFT; if (mosi != NC) { route |= USART_ROUTEPEN_TXPEN; obj->spi.spi->ROUTELOC0 &= ~_USART_ROUTELOC0_TXLOC_MASK; obj->spi.spi->ROUTELOC0 |= pin_location(mosi, PinMap_SPI_MOSI)<<_USART_ROUTELOC0_TXLOC_SHIFT; } if (miso != NC) { route |= USART_ROUTEPEN_RXPEN; obj->spi.spi->ROUTELOC0 &= ~_USART_ROUTELOC0_RXLOC_MASK; obj->spi.spi->ROUTELOC0 |= pin_location(miso, PinMap_SPI_MOSI)<<_USART_ROUTELOC0_RXLOC_SHIFT; } if (!obj->spi.master) { route |= USART_ROUTEPEN_CSPEN; obj->spi.spi->ROUTELOC0 &= ~_USART_ROUTELOC0_CSLOC_MASK; obj->spi.spi->ROUTELOC0 |= pin_location(cs, PinMap_SPI_MOSI)<<_USART_ROUTELOC0_CSLOC_SHIFT; } obj->spi.spi->ROUTEPEN = route; }