vamos desde el principio y recurrimos a la fuente de sabiduría infinita (la hoja de datos del micro
)
copio y pego tal cual la pagina 89
SPI mode allows 8 bits of data to be synchronously
transmitted and received simultaneously. To
accomplish communication, typically three pins are
used:
• Serial Data Out (SDO) RB2/SDO/RX/DT
• Serial Data In (SDI) RB1/SDI/SDA
• Serial Clock (SCK) RB4/SCK/SCL
Additionally, a fourth pin may be used when in a Slave
mode of operation:
• Slave Select (SS) RB5/SS/TX/CK
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>)
and the SSPSTAT register (SSPSTAT<7:6>). 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 (Idle state of SCK)
• Clock Edge (output data on rising/falling
edge of SCK)
• Clock Rate (Master mode only)
• Slave Select mode (Slave mode only)
Hablemos del hardware, el micro posee un puerto serial sincrónico (SSP) que puede ser utilizado tanto en modo SPI o en modo I2C, los pines del puerto ya están preestablecidos en su arquitectura y los detalla la hoja 89. Para utilizar el modulo faltaría configurar el puerto afectando los registros (SSPCON y SSPSTAT) eso lo hacemos en asembler o utilizamos la función setup_spi(). Las funciones que vamos a utilizar seria spi_write y spi_read.
Ahora CCS a partir de las últimas versiones ha implementado SPI por software (si vas a una versión más viejita ni siquiera existía #use spi), de manera que #use spi se utiliza para comunicación por soft osea CCS ocupa recursos e implementa la comunicación a lo bestia dentro del micro. Por eso es necesario explicarle que pines queremos nosotros que sean el clock, la entrada de datos y la salida de datos.
También podemos usar #use spi para configurar la comunicación y forzarlo a que sea por hardware como indica el ejemplo del CCS
#use spi(FORCE_HW, BITS=16, stream=SPI_STREAM)
// uses hardware SPI and gives this stream the name SPI_STREAM
Aca podemos utilizar la funcion spi_xfer.
Fijate la diferencia entre SPI_READ ( o SPI_WRITE) y SPI_XFER
SPI_READ
Availability:
This function is only available on devices with SPI hardware.
SPI_XFER
Availability:
All devices with SPI support.
Pero de ninguna manera fozarlo por hard y pasarle los pines que queramos como entradas o salidas, se entiende?
.
Saludos!!