![](http://datasheet.mmic.net.cn/260000/PIC16LC72_datasheet_15942878/PIC16LC72_79.png)
1995 Microchip Technology Inc.
DS30390B-page 79
PIC16C7X
11.1
SPI Mode
Applicable Devices
70 71 71A 72 73 73A 74 74A
The SPI mode allows 8-bits of data to be synchro-
nously transmitted and received simultaneously. To
accomplish communication, typically three pins are
used:
Serial Data Out (SDO) RC5/SDO
Serial Data In (SDI) RC4/SDI
Serial Clock (SCK) RC3/SCK
Additionally a fourth pin may be used when in a slave
mode of operation:
Slave Select (SS) RA5/AN4/SS
When initializing the SPI, several options need to be
specified. This is done by programming the appropriate
control bits in the SSPCON register (SSPCON<5:0>).
These control bits allow the following to be specified:
Master Mode (SCK is the clock output)
Slave Mode (SCK is the clock input)
Clock Polarity (Output/Input data on the
Rising/Falling edge of SCK)
Clock Rate (Master mode only)
Slave Select Mode (Slave mode only)
The SSP consists of a transmit/receive Shift Register
(SSPSR) and a Buffer register (SSPBUF). The SSPSR
shifts the data in and out of the device, MSB first. The
SSPBUF holds the data that was previously written to
the SSPSR, until the received data is ready. Once the
8-bits of data have been received, that information is
moved to the SSPBUF register. Then the buffer full
detect bit BF (SSPSTAT <0>) and interrupt flag bit
SSPIF (PIR1<3>) are set. This double buffering of the
received data (SSPBUF) allows the next byte to start
reception before reading the data that was received.
Any write to the SSPBUF register during transmission/
reception of data will be ignored, and the write collision
detect bit WCOL (SSPCON<7>) will be set. User soft-
ware must clear the WCOL bit so that it can be deter-
mined if the following write(s) to the SSPBUF register
completed successfully. When the application software
is expecting to receive valid data, the SSPBUF should
be read before the next byte of data to transfer is written
to the SSPBUF. Buffer full bit BF (SSPSTAT<0>) indi-
cates when SSPBUF has been loaded with the
received data (transmission is complete). When the
SSPBUF is read, bit BF is cleared. This data may be
irrelevant if the SPI is only a transmitter. Generally the
SSP Interrupt is used to determine when the transmis-
sion/reception has completed. The SSPBUF can then
be read (if data is meaningful) and/or the SSPBUF
(SSPSR) can be written. If the interrupt method is not
going to be used, then software polling can be done to
ensure that a write collision does not occur.
Example 11-1 shows the loading of the SSPBUF
(SSPSR) for data transmission. The shaded instruction
is only required if the received data is meaningful.
EXAMPLE 11-1: LOADING THE SSPBUF
(SSPSR) REGISTER
BSF STATUS, RP0 ;Specify Bank 1
LOOP BTFSS SSPSTAT, BF ;Has data been
;received
;(transmit
;complete)
GOTO LOOP ;No
BCF STATUS, RP0 ;Specify Bank 0
MOVF SSPBUF, W ;W reg = contents
; of SSPBUF
MOVWF RXDATA ;Save in user RAM
MOVF TXDATA, W ;W reg = contents
; of TXDATA
MOVWF SSPBUF ;New data to xmit
The block diagram of the SSP module, when in SPI
mode (Figure 11-3), shows that the SSPSR is not
directly readable or writable, and can only be accessed
from addressing the SSPBUF register. Additionally, the
SSP status register (SSPSTAT) indicates the various
status conditions.
FIGURE 11-3: SSP BLOCK DIAGRAM
(SPI MODE)
Read
Write
Internal
data bus
SDI
SDO
SS
SCK
SSPSR reg
SSPBUF reg
SSPM3:SSPM0
bit0
shift
clock
SS Control
Enable
Edge
Select
Clock Select
TMR2 output
2
T
CY
Prescaler
4, 16, 64
Data from TX/RX in SSPSR
TRISC<3>
Edge
Select
2
4