Software SPI Library

The mikroBasic PRO for AVR 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:

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

External dependencies of Software SPI Library

The following variables must be defined in all projects using Software SPI Library: Description : Example :
dim SoftSpi_SDI as sbit sfr external Data In line. dim SoftSpi_SDI as sbit at PINB6_bit
dim SoftSpi_SDO as sbit sfr external Data Out line. dim SoftSpi_SDO as sbit at PORTB5_bit
dim SoftSpi_CLK as sbit sfr external Clock line. dim SoftSpi_CLK as sbit at PORTB7_bit
dim SoftSpi_SDI_Direction as sbit sfr external Direction of the Data In pin. dim SoftSpi_SDI_Direction as sbit at DDB6_bit
dim SoftSpi_SDO_Direction as sbit sfr external Direction of the Data Out pin dim SoftSpi_SDO_Direction as sbit at DDB5_bit
dim SoftSpi_CLK_Direction as sbit sfr external Direction of the Clock pin. dim SoftSpi_CLK_Direction as sbit at DDB7_bit

Library Routines

Soft_SPI_Init

Prototype

sub procedure Soft_SPI_Init()

Returns

Nothing.

Description

Configures and initializes the software SPI module.

Requires

Global variables:

  • SoftSpi_SDI: Data in line
  • SoftSpi_SDO: Data out line
  • SoftSpi_CLK: Data clock line
  • SoftSpi_SDI_Direction: Direction of the Data in pin
  • SoftSpi_SDO_Direction: Direction of the Data out pin
  • SoftSpi_CLK_Direction: Direction of the Data clock pin
must be defined before using this function.

Example
' soft_spi pinout definition
dim SoftSpi_SDI as sbit at PINB6_bit            
dim SoftSpi_SDO as sbit at PORTB5_bit          
dim SoftSpi_CLK as sbit at PORTB7_bit           
dim SoftSpi_SDI_Direction as sbit at DDB6_bit  
dim SoftSpi_SDO_Direction as sbit at DDB5_bit  
dim SoftSpi_CLK_Direction as sbit at DDB7_bit
' end of soft_spi pinout definition

...
Soft_SPI_Init() ' Init Soft_SPI

Soft_SPI_Read

Prototype

sub function Soft_SPI_Read(dim sdata as byte) as word

Returns

Byte received via the SPI bus.

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.

Requires

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

Example
dim data_read as byte
    data_send as byte
...
' 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)

Soft_SPI_Write

Prototype

sub procedure Soft_SPI_Write(dim sdata as byte)

Returns

Nothing.

Description

This routine sends one byte via the Software SPI bus.

Parameters :

  • sdata: data to be sent.

Requires

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

Example
' Write a byte to the Soft SPI bus
Soft_SPI_Write(0xAA)

Library Example

This code demonstrates using library routines for Soft_SPI communication. Also, this example demonstrates working with Microchip's MCP4921 12-bit D/A converter.

Copy Code To ClipboardCopy Code To Clipboard
program Soft_SPI

' DAC module connections
dim Chip_Select as sbit at PORTB0_bit
    SoftSpi_CLK as sbit at PORTB7_bit
    SoftSpi_SDI as sbit at PINB6_bit   ' Note: Input signal
    SoftSpi_SDO as sbit at PORTB5_bit

dim Chip_Select_Direction as sbit at DDB0_bit
    SoftSpi_CLK_Direction as sbit at DDB7_bit
    SoftSpi_SDI_Direction as sbit at DDB6_bit
    SoftSpi_SDO_Direction as sbit at DDB5_bit
' End DAC module connections

dim value as word

sub procedure InitMain()
  DDA0_bit = 0                           ' Set PA0 pin as input
  DDA1_bit = 0                           ' Set PA1 pin as input
  Chip_Select = 1                        ' Deselect DAC
  Chip_Select_Direction = 1              ' Set CS# pin as Output
  Soft_Spi_Init()                        ' Initialize Soft_SPI
end sub

' DAC increments (0..4095) --> output voltage (0..Vref)
sub procedure DAC_Output(dim valueDAC as word)
dim temp as byte
  Chip_Select = 0                        ' Select DAC chip
  ' Send High Byte
  temp = word(valueDAC >> 8) and 0x0F    ' Store valueDAC[11..8] to temp[3..0]

  temp = temp or 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
end sub
  
main:
  InitMain()                             ' Perform main initialization

  value = 2048                           ' When program starts, DAC gives
                                         '   the output in the mid-range
  while (TRUE)                           ' Endless loop
    if ((PINA0_bit) and (value < 4095)) then     ' If PA0 button is pressed
      Inc(value)                                 '   increment value
    else
      if ((PINA1_bit) and (value > 0)) then      ' If PA1 button is pressed
        Dec(value)                               '   decrement value
      end if
    end if

    DAC_Output(value)                         ' Send value to DAC chip
    Delay_ms(1)                               ' Slow down key repeat pace
  wend
end.
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