40#define SW_SPI_MODE0 0x00
41#define SW_SPI_MODE1 0x04
42#define SW_SPI_MODE3 0x0C
116 int16_t
begin( uint8_t
pin,uint8_t SPIModeparam, uint8_t MOSIpin = 255, uint8_t MISOpin = 255, uint8_t CSpin = 255)
122 if (SPIModeparam == SPI_MODE1)
128 if (SPIModeparam == SPI_MODE3)
134 if (SPIModeparam != 0 && SPIModeparam != 1 && SPIModeparam != 3)
138 uint8_t tx[8] = { 200,
_pin,
_pinMode, SPIModeparam,MOSIpin,MISOpin, CSpin, 0x55 };
140 return _sw.sendPacket(tx, rx);
162 uint8_t
transfer(uint8_t data,
bool csSaysStayLow =
false)
164 uint8_t tx[8] = { 201,
_pin,
_pinMode, 8, data,0x55, 0x55, 0x55 };
171 int16_t result =
_sw.sendPacket(tx, rx);
186 uint16_t
transfer(uint16_t data,
bool csSaysStayLow =
false) {
194 int16_t result =
_sw.sendPacket(tx, rx);
199 return ((((uint16_t)rx[5]) << 8) + (uint16_t)rx[4]);
209 void transfer(
void* buf,
size_t count,
bool csSaysStayLow =
false) {
215 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] };
220 if (count == 0 && !csSaysStayLow)
224 _sw.sendPacket(tx, rx);
225 ((uint8_t*)buf)[0] = rx[3];
226 ((uint8_t*)buf)[1] = rx[4];
227 ((uint8_t*)buf)[2] = rx[5];
228 ((uint8_t*)buf)[3] = rx[6];
229 ((uint8_t*)buf)[4] = rx[7];
230 buf = (
void*)((uint8_t*)buf + 5);
234 uint8_t tx[8] = { 201,
_pin,
_pinMode,(uint8_t)(count * 8), 0x55, 0x55, 0x55, 0x55 };
235 for (
size_t i = 0; i < count; ++i)
237 tx[4 + i] = ((uint8_t*)buf)[i];
245 int16_t result =
_sw.sendPacket(tx, rx);
250 for (
size_t i = 0; i < count; ++i)
252 ((uint8_t*)buf)[i] = rx[4 + i];
261 uint8_t tx[8] = { 202,
_pin,
_pinMode, 8, ((uint8_t*)buf)[0],0x55, 0x55, 0x55 };
265 if(count == 0 && !csSaysStayLow)
269 int16_t result =
_sw.sendPacket(tx, rx);
274 *(uint8_t*)buf = rx[4];
275 buf = (
void*)((uint8_t*)buf + 1);
286 uint8_t tx[8] = { 201,
_pin,
_pinMode, (uint8_t)(bitCount), 0x55, 0x55, 0x55, 0x55 };
290 uint8_t byteCount = (bitCount + 7) / 8;
291 if (outBuf !=
nullptr) {
292 for (
size_t i = 0; i < byteCount; ++i) {
293 tx[4 + i] = outBuf[i];
301 int16_t result =
_sw.sendPacket(tx, rx);
306 if (inBuf !=
nullptr) {
307 for (
size_t i = 0; i < byteCount; ++i) {
308 inBuf[i] = rx[4 + i];
317 uint8_t tx[8] = { 203,
_pin,
_pinMode, 0x55, 0x55, 0x55, 0x55, 0x55 };
318 if (outBuf !=
nullptr) {
319 for (
size_t i = 0; i < 5; ++i) {
320 tx[3 + i] = outBuf[i];
328 int16_t result =
_sw.sendPacket(tx, rx);
333 if (inBuf !=
nullptr) {
334 for (
size_t i = 0; i < 5; ++i) {
335 inBuf[i] = rx[3 + i];
343 uint8_t tx[8] = { 205,
_pin,
_pinMode, 0x55, 0x55, 0x55, 0x55, 0x55 };
344 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.
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 begin(uint8_t pin, uint8_t SPIModeparam, uint8_t MOSIpin=255, uint8_t MISOpin=255, uint8_t CSpin=255)
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=SW_MSBFIRST, uint8_t dataMode=SW_SPI_MODE0)