Software SPI Library

The mikroC PRO for ARM provides routines for implementing Software SPI communication. These routines are hardware independent and can be used with any MCU. The Software SPI Library provides easy communication with other devices via SPI: A/D converters, D/A converters, MAX7219, LTC1290, etc.

Library configuration:

The library configures SPI to the master mode, clock = 20kHz, data sampled at the middle of interval, clock idle state low and data transmitted at low to high edge.

  Important : The Software SPI library implements time-based activities, so interrupts need to be disabled when using it.

External dependencies of Software SPI Library

Stellaris

The following variables must be defined in all projects using Software SPI Library: Description : Example :
extern sfr sbit SoftSpi_SDI; Data In line. sbit SoftSpi_SDI at GPIO_PORTJ_DATA4_bit;
extern sfr sbit SoftSpi_SDO; Data Out line. sbit SoftSpi_SDO at GPIO_PORTJ_DATA5_bit;
extern sfr sbit SoftSpi_CLK; Clock line. sbit SoftSpi_CLK at GPIO_PORTJ_DATA3_bit;
extern sfr sbit SoftSpi_SDI_Direction; Direction of the Data In pin. sbit SoftSpi_SDI_Direction at GPIO_PORTJ_DIR4_bit;
extern sfr sbit SoftSpi_SDO_Direction; Direction of the Data Out pin sbit SoftSpi_SDO_Direction at GPIO_PORTJ_DIR5_bit;
extern sfr sbit SoftSpi_CLK_Direction; Direction of the Clock pin. sbit SoftSpi_CLK_Direction at GPIO_PORTJ_DIR3_bit;

STM32

The following variables must be defined in all projects using Software SPI Library: Description : Example :
extern sfr sbit SoftSpi_SDI; Data In line. sbit SoftSpi_SDI at GPIOD_ODR.B3;
extern sfr sbit SoftSpi_SDO; Data Out line. sbit SoftSpi_SDO at GPIOD_ODR.B4;
extern sfr sbit SoftSpi_CLK; Clock line. sbit SoftSpi_CLK at GPIOD_ODR.B5;

Library Routines

Soft_SPI_Init

Prototype

void Soft_SPI_Init();

Description

Routine initializes the software SPI module.

Parameters

None.

Returns

Nothing.

Requires

External dependencies of the library from the top of the page must be defined before using this function.

Example

Stellaris

// DAC module connections
sbit SoftSpi_CLK at GPIO_PORTJ_DATA3_bit;
sbit SoftSpi_SDI at GPIO_PORTJ_DATA4_bit;
sbit SoftSpi_SDO at GPIO_PORTJ_DATA5_bit;

sbit SoftSpi_CLK_Direction at GPIO_PORTJ_DIR3_bit;
sbit SoftSpi_SDI_Direction at GPIO_PORTJ_DIR4_bit;
sbit SoftSpi_SDO_Direction at GPIO_PORTJ_DIR5_bit;
// End DAC module connections
...
Soft_SPI_Init(); // Init Soft_SPI

STM32

// DAC module connections
sbit SoftSpi_CLK at GPIOD_ODR.B3;
sbit SoftSpi_SDI at GPIOD_ODR.B4;
sbit SoftSpi_SDO at GPIOD_ODR.B5;
// End DAC module connections
...
Soft_SPI_Init(); // Init Soft_SPI
Notes

None.

Soft_SPI_Read

Prototype

unsigned short Soft_SPI_Read(char sdata);

Description

This routine performs 3 operations simultaneously. It provides clock for the Software SPI bus, reads a byte and sends a byte.

Parameters
  • sdata: data to be sent.
Returns

Byte received via the SPI bus.

Requires

Soft SPI must be initialized before using this function. See Soft_SPI_Init routine.

Example
unsigned short data_read;
char data_send;
...
// Read a byte and assign it to data_read variable
// (data_send byte will be sent via SPI during the Read operation)
data_read = Soft_SPI_Read(data_send);
Notes

None.

Soft_SPI_Write

Prototype

void Soft_SPI_Write(char sdata);

Description

This routine sends one byte via the Software SPI bus.

Parameters
  • sdata: data to be sent.
Returns

Nothing.

Requires

Soft SPI must be initialized before using this function. See Soft_SPI_Init.

Example
// Write a byte to the Soft SPI bus
Soft_SPI_Write(0xAA);
Notes

None.

Library Example

The code demonstrates how to use Software SPI library functions for communication between MCU and MCP4921 DAC chip.

Stellaris

// DAC module connections
sbit Chip_Select at GPIO_PORTJ_DATA1_bit;
sbit SoftSpi_CLK at GPIO_PORTJ_DATA3_bit;
sbit SoftSpi_SDI at GPIO_PORTJ_DATA4_bit;
sbit SoftSpi_SDO at GPIO_PORTJ_DATA5_bit;

sbit Chip_Select_Direction at GPIO_PORTJ_DIR1_bit;
sbit SoftSpi_CLK_Direction at GPIO_PORTJ_DIR3_bit;
sbit SoftSpi_SDI_Direction at GPIO_PORTJ_DIR4_bit;
sbit SoftSpi_SDO_Direction at GPIO_PORTJ_DIR5_bit;
// End DAC module connections

unsigned int value;

void InitMain() {
  GPIO_Digital_Input(&GPIO_PORTJ_DATA_BITS, _GPIO_PINMASK_6 | _GPIO_PINMASK_7); // Set PJ6 and PJ7 as digital input
  GPIO_Digital_Output(&GPIO_PORTJ_DATA_BITS, _GPIO_PINMASK_1);                  // Set PJ1 as digital output

  Chip_Select = 1;                       // Deselect DAC
  Soft_SPI_Init();                       // Initialize Soft_SPI
}

// DAC increments (0..4095) --> output voltage (0..Vref)
void DAC_Output(unsigned int valueDAC) {
  char temp;

  Chip_Select = 0;                       // Select DAC chip

  // Send High Byte
  temp = (valueDAC >> 8) & 0x0F;         // Store valueDAC[11..8] to temp[3..0]
  temp |= 0x30;                          // Define DAC setting, see MCP4921 datasheet
  Soft_SPI_Write(temp);                  // Send high byte via Soft SPI

  // Send Low Byte
  temp = valueDAC;                       // Store valueDAC[7..0] to temp[7..0]
  Soft_SPI_Write(temp);                  // Send low byte via Soft SPI

  Chip_Select = 1;                       // Deselect DAC chip
}

void main() {

  InitMain();                            // Perform main initialization

  value = 2048;                          // When program starts, DAC gives
                                         //   the output in the mid-range

  while (1) {                            // Endless loop

    if ((GPIO_PORTJ_DATA7_bit) && (value < 4095)) {   // If PJ7 button is pressed
      value++;                           //   increment value
      }
    else {
      if ((GPIO_PORTJ_DATA6_bit) && (value > 0)) {    // If PJ6 button is pressed
        value--;                         //   decrement value
        }
      }

    DAC_Output(value);                   // Send value to DAC chip
    Delay_ms(1);                         // Slow down key repeat pace
  }
}

STM32

// DAC module connections
sbit Chip_Select at GPIOD_ODR.B1;
sbit SoftSpi_CLK at GPIOD_ODR.B3;
sbit SoftSpi_SDI at GPIOD_IDR.B4;
sbit SoftSpi_SDO at GPIOD_ODR.B5;
// End DAC module connections

unsigned int value;

void InitMain() {
  GPIO_Digital_Input(&GPIOC_BASE,  _GPIO_PINMASK_6 | _GPIO_PINMASK_7); // Set PC6 and PC7 as digital input
  GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_1);                   // Set PD1 as digital output

  Chip_Select = 1;                       // Deselect DAC
  Soft_SPI_Init();                       // Initialize Soft_SPI
}

// DAC increments (0..4095) --> output voltage (0..Vref)
void DAC_Output(unsigned int valueDAC) {
  char temp;

  Chip_Select = 0;                       // Select DAC chip

  // Send High Byte
  temp = (valueDAC >> 8) & 0x0F;         // Store valueDAC[11..8] to temp[3..0]
  temp |= 0x30;                          // Define DAC setting, see MCP4921 datasheet
  Soft_SPI_Write(temp);                  // Send high byte via Soft SPI

  // Send Low Byte
  temp = valueDAC;                       // Store valueDAC[7..0] to temp[7..0]
  Soft_SPI_Write(temp);                  // Send low byte via Soft SPI

  Chip_Select = 1;                       // Deselect DAC chip
}

void main() {

  InitMain();                            // Perform main initialization

  value = 2048;                          // When program starts, DAC gives
                                         //   the output in the mid-range

  while (1) {                            // Endless loop

    if ((GPIOC_IDRbits.IDR7) && (value < 4095)) { // If PC7 button is pressed
      value++;                                    //   increment value
      }
    else {
      if ((GPIOC_IDRbits.IDR6) && (value > 0)) {  // If PC6 button is pressed
        value--;                                  //   decrement value
        }
      }

    DAC_Output(value);                   // Send value to DAC chip
    Delay_ms(1);                         // Slow down key repeat pace
  }
}
Copyright (c) 2002-2012 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code