116 int16_t
begin( uint8_t
pin,uint8_t SPIMode, uint8_t MOSIpin = 255, uint8_t MISOpin = 255, uint8_t CSpin = 255)
121 if (SPIMode == SPI_MODE1)
125 else if (SPIMode == SPI_MODE3)
130 if (SPIMode != 0 && SPIMode != 1 && SPIMode != 3)
134 uint8_t tx[8] = { 200,
_pin,
_pinMode, SPIMode,MOSIpin,MISOpin, CSpin, 0x55 };
136 return _sw.sendPacket(tx, rx);
158 uint8_t
transfer(uint8_t data,
bool csSaysStayLow =
false)
160 uint8_t tx[8] = { 201,
_pin,
_pinMode, 8, data,0x55, 0x55, 0x55 };
167 int16_t result =
_sw.sendPacket(tx, rx);
182 uint16_t
transfer(uint16_t data,
bool csSaysStayLow =
false) {
190 int16_t result =
_sw.sendPacket(tx, rx);
195 return ((((uint16_t)rx[5]) << 8) + (uint16_t)rx[4]);
205 void transfer(
void* buf,
size_t count,
bool csSaysStayLow =
false) {
211 uint8_t tx[8] = { 204,
_pin,
_pinMode, ((uint8_t*)buf)[0], ((uint8_t*)buf)[1], ((uint8_t*)buf)[2], ((uint8_t*)buf)[3], ((uint8_t*)buf)[4] };
216 if (count == 0 && !csSaysStayLow)
220 _sw.sendPacket(tx, rx);
221 ((uint8_t*)buf)[0] = rx[3];
222 ((uint8_t*)buf)[1] = rx[4];
223 ((uint8_t*)buf)[2] = rx[5];
224 ((uint8_t*)buf)[3] = rx[6];
225 ((uint8_t*)buf)[4] = rx[7];
226 buf = (
void*)((uint8_t*)buf + 5);
230 uint8_t tx[8] = { 201,
_pin,
_pinMode,(uint8_t)(count * 8), 0x55, 0x55, 0x55, 0x55 };
231 for (
size_t i = 0; i < count; ++i)
233 tx[4 + i] = ((uint8_t*)buf)[i];
241 int16_t result =
_sw.sendPacket(tx, rx);
246 for (
size_t i = 0; i < count; ++i)
248 ((uint8_t*)buf)[i] = rx[4 + i];
257 uint8_t tx[8] = { 202,
_pin,
_pinMode, 8, ((uint8_t*)buf)[0],0x55, 0x55, 0x55 };
261 if(count == 0 && !csSaysStayLow)
265 int16_t result =
_sw.sendPacket(tx, rx);
270 *(uint8_t*)buf = rx[4];
271 buf = (
void*)((uint8_t*)buf + 1);
282 uint8_t tx[8] = { 201,
_pin,
_pinMode, (uint8_t)(bitCount), 0x55, 0x55, 0x55, 0x55 };
286 uint8_t byteCount = (bitCount + 7) / 8;
287 if (outBuf !=
nullptr) {
288 for (
size_t i = 0; i < byteCount; ++i) {
289 tx[4 + i] = outBuf[i];
297 int16_t result =
_sw.sendPacket(tx, rx);
302 if (inBuf !=
nullptr) {
303 for (
size_t i = 0; i < byteCount; ++i) {
304 inBuf[i] = rx[4 + i];
313 uint8_t tx[8] = { 203,
_pin,
_pinMode, 0x55, 0x55, 0x55, 0x55, 0x55 };
314 if (outBuf !=
nullptr) {
315 for (
size_t i = 0; i < 5; ++i) {
316 tx[3 + i] = outBuf[i];
324 int16_t result =
_sw.sendPacket(tx, rx);
329 if (inBuf !=
nullptr) {
330 for (
size_t i = 0; i < 5; ++i) {
331 inBuf[i] = rx[3 + i];
339 uint8_t tx[8] = { 205,
_pin,
_pinMode, 0x55, 0x55, 0x55, 0x55, 0x55 };
340 int16_t result =
_sw.sendPacket(tx);
#define SW_LE16(_a)
Convert a uint16_t to two bytes in little endian format for array initialization.
@ SW_ERROR_INVALID_PARAMETER_3
(#17) The pin configuration parameter in Byte 3 was invalid
Class for a Serial Wombat chip. Each Serial Wombat chip on a project should have its own instance.
SerialWombatPin(SerialWombatChip &serialWombatChip)
Instantiates a Serial Wombat Pin.
uint8_t pin()
Returns the current SW pin number. Used primarily for virtual calls by derived classes.
int16_t begin(uint8_t pin, uint8_t SPIMode, uint8_t MOSIpin=255, uint8_t MISOpin=255, uint8_t CSpin=255)
uint16_t transfer(uint16_t data, bool csSaysStayLow=false)
uint8_t transfer(uint8_t data, bool csSaysStayLow=false)
int16_t transferPacketUpTo32Bits(uint8_t *outBuf, uint8_t *inBuf, size_t bitCount, bool csSaysStayLow=false)
SerialWombatSPI(SerialWombatChip &serialWombat)
Constructor for the SerialWombatSPI class.
int16_t transferPacket40Bits(uint8_t *outBuf, uint8_t *inBuf, bool csSaysStayLow=false)
static void beginTransaction(SerialWombatSPISettings settings)
void transfer(void *buf, size_t count, bool csSaysStayLow=false)
A class for storing SPI settings. This isn't actually used, but included for congruency with Arduino.
SerialWombatSPISettings(uint32_t clock=0, uint8_t bitOrder=MSBFIRST, uint8_t dataMode=SPI_MODE0)