It is simply based on an 8 bit shift register shifting data out on a single pin and shifting data in on another pin.
Note: some devices use more than 8 bits!
Its main use is to replace parallel interfaces so you don't have to route parallel buses around a pcb. pic spi masterFor example you can buy an SPI 12bit ADC and instead of 12 parallel wires to read the data you only need 4 SPI connections. Actually you may only need three as you may not need to send data to the device!
With the SPI interface you can communicate with a device transmitting and receiving 8 bits of data at the same time and it is suited to high speed streaming data transfers.
Note: The trade off between usingpic spi slave a parallel interface and the SPI interface is speed e.g. if you read a parallel 12bit ADC at 200ksps then you could read the device at a 200kHz rate but if you want to get the same data rate using SPI then you need a serial speed of 200kHz x 12 = 2.4MHz. So the actual trade off is speed and the consequential noise introduced into the circuit.
Unlike I2C there is no concept of transferring ownership of the bus i.e. changing bus master and there are no slave device addresses. SPI is a much simpler protocol and because of this you can operate it at speeds greater than 10MHz (compared with the 3.4MHz maximum for I2C).
The best feature of SPI is that you can do full duplex data transfers (data in both directions at the same time) which you can not do with I2C and you can do it fast.
Note: The maximum rate for a PIC Micro using a 20MHz clock is 5MHz.
SPI Interface : Signals
SPI Interface Signals
PIC name Master Slave
SCK Serial clock output from master [SCK] Input to slave [SCK]
SDO Serial data output from master [MOSI] Input to slave [MOSI}
SDI Serial data input from slave [MISO] Output from slave [MISO]
SS Optional slave (chip) select [SS]
Slave select [SS]
 denotes SPI naming convention
Here is the setup for a single SPI device connection:
SPI Interface - single device
Single SPI device
Note: The chip select signal SS is optional for a single device system as you could tie the SS input at the slave low if the other lines are dedicated to SPI use.
There are two ways to implement multiple slave operation:
* Use a separate chip select for each slave device.
* Wire all the slaves together DataOut to DataIn (daisy chain).
SII Interface : Using chip selects
SPI Interface using separate chip selects
With this scheme you control each slave device using its chip select line (usually active low- red arrows show control lines). When disabled the Data output from the slave goes into a high impedance state so it does not interfere with the currently selected slave and the data input is ignored (check datasheet).
The advantage of this scheme is that you can consider each device separately when you compare it with the daisy chain method.
SPI Interface : Daisy chaining
SPI interface with daisy chain
With this scheme all data sent by the master is shifted into all devices and all data sent from each device is shifted out to the next (shown by red dotted arrow). For this scheme to work you have to make sure that each slave uses the clock in the same way (see clock and data) and you have to get the right number of bits - so there is more work to do in software.
Compared to I2C these are very inelegant slave selection mechanisms and look like kludges to get round the fact that SPI was designed really as a simple single master to single slave protocol. Having said that the above methods will work but for daisy chaining you will have to be careful of clock polarity and clock use as this is not defined in the SPI standard.
SPI Interface : Clock and Data
How a device reacts to clock input is undefined!!!
Data can be sampled at the rising or falling edge and data can be generated after the rising or falling edge!
This is why you can set the clock output from a master mode device in multiple ways just look at the diagram below - the first four signals are the four options you have to select the output clock.
SPI Interface PIC signals (extract from DS39582B)
PIC SPI interface signals
You match the output clock to the clock that your device requires.
Note: This is why daisy chaining may not be a good idea (or you have to think very carefully about it!).
Note: For Master or Slave mode when using PICs you need to set the TRIS direction of the SCK pin appropriately.
Problems with the SPI interface
* The clock scheme may not be the same between devices.
* The data length can vary from device to device.
Advantages of the SPI interface
* Very fast > 10Mhz.
* Simple protocol (easy to program in software if you have no SPI hardware module).
* Simple interface (no bidirectional pins c.f. I2C).
* Supports full duplex data streaming.
>>>> extracted from http://www.best-microcontroller-projects.com/spi-interface.html<<<<