The ssi. object implements up to four serial synchronous interface (SSI) channels on the general-purpose I/O lines of your BASIC/C-programmable device. Examples of such interfaces are:
Clock/data (example: goto http://www.maxim-ic.com and search for MAX7219 display driver IC);
Numerous variations on the above.
You can typically get all the necessary data from the IC you want to interface to. Note that some interface designs may not be free to use (i.e. they are patented, etc.).
The common denominator among these interfaces is the presence of the clock line that "paces" data transmission on the data line(s) — with each clock cycle on the clock line, one bit of data can be transmitted over the data line(s). In contrast, UARTs (managed by the ser. object) are not synchronous — there is no clock line to synchronize two devices and this is why there is an "A" ("asynchronous") in "UART".
SSI interface links have masters and slaves. The master's role is to generate the clock pulses that slaves will use to synchronize themselves to the master. Only one device can be the master at any given time. The ssi. object can only work as the master. That is, it generates the clock for others to use.
Of course, it is possible to communicate with SSI devices by manipulating general-purpose I/O lines of your device directly. This is known as "bit-banging" or "bit-blasting". The advantage of the SSI object is in speed — the same data exchange will often compete hundreds of times faster compared with bit-banging.
A particular channel to work with is selected through the ssi.channel property. All other properties and methods apply to the currently selected channel.
The ssi.enabled property defines if the channel is disabled or enabled. Necessary configuration of the communication channel can only be performed when ssi.enabled= 0- NO. Actual data exchange is possible only when ssi.enabled= 1- YES.
If you are going to talk to an I2C device, be sure to check out More on I2C topic.