Skip to content

Add spi aberridg #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jun 27, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ disableUBX7Fcheck KEYWORD2
checkUblox KEYWORD2
checkUbloxI2C KEYWORD2
checkUbloxSerial KEYWORD2
checkUbloxSPI KEYWORD2

process KEYWORD2
processNMEA KEYWORD2
Expand Down
52 changes: 30 additions & 22 deletions src/SparkFun_u-blox_GNSS_Arduino_Library.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -452,12 +452,15 @@ boolean SFE_UBLOX_GNSS::begin(Stream &serialPort)
}

// Initialize for SPI
boolean SFE_UBLOX_GNSS::begin(SPIClass &spiPort, uint8_t ssPin, int spiSpeed)
boolean SFE_UBLOX_GNSS::begin(SPIClass &spiPort, uint8_t csPin, uint32_t spiSpeed)
{
commType = COMM_TYPE_SPI;
_spiPort = &spiPort;
_ssPin = ssPin;
_csPin = csPin;
_spiSpeed = spiSpeed;
// Initialize the chip select pin
pinMode(_csPin, OUTPUT);
digitalWrite(_csPin, HIGH);
//New in v2.0: allocate memory for the packetCfg payload here - if required. (The user may have called setPacketCfgPayloadSize already)
if (packetCfgPayloadSize == 0)
setPacketCfgPayloadSize(MAX_PAYLOAD_SIZE);
Expand Down Expand Up @@ -790,32 +793,22 @@ boolean SFE_UBLOX_GNSS::checkUbloxSerial(ubxPacket *incomingUBX, uint8_t request
//Checks SPI for data, passing any new bytes to process()
boolean SFE_UBLOX_GNSS::checkUbloxSpi(ubxPacket *incomingUBX, uint8_t requestedClass, uint8_t requestedID)
{
// process the contents of the SPI buffer if not empty!
uint8_t bufferByte = spiBuffer[0];
uint8_t bufferIndex = 0;

while (bufferByte != 0xFF) {
process(bufferByte, incomingUBX, requestedClass, requestedID);
bufferIndex++;
bufferByte = spiBuffer[bufferIndex];
// Process the contents of the SPI buffer if not empty!
for (uint8_t i = 0; i < spiBufferIndex; i++) {
process(spiBuffer[i], incomingUBX, requestedClass, requestedID);
}

// reset the contents of the SPI buffer
for(uint8_t i = 0; i < bufferIndex; i++)
{
spiBuffer[i] = 0xFF;
}

spiBufferIndex = 0;

SPISettings settingsA(_spiSpeed, MSBFIRST, SPI_MODE0);
_spiPort->beginTransaction(settingsA);
digitalWrite(_ssPin, LOW);
digitalWrite(_csPin, LOW);
uint8_t byteReturned = _spiPort->transfer(0x0A);
while (byteReturned != 0xFF || currentSentence != NONE)
{
process(byteReturned, incomingUBX, requestedClass, requestedID);
byteReturned = _spiPort->transfer(0x0A);
}
digitalWrite(_ssPin, HIGH);
digitalWrite(_csPin, HIGH);
_spiPort->endTransaction();
return (true);

Expand Down Expand Up @@ -2858,7 +2851,7 @@ void SFE_UBLOX_GNSS::sendSerialCommand(ubxPacket *outgoingUBX)
void SFE_UBLOX_GNSS::spiTransfer(uint8_t byteToTransfer)
{
uint8_t returnedByte = _spiPort->transfer(byteToTransfer);
if (returnedByte != 0xFF)
if (returnedByte != 0xFF || currentSentence != NONE)
{
spiBuffer[spiBufferIndex] = returnedByte;
spiBufferIndex++;
Expand All @@ -2868,9 +2861,24 @@ void SFE_UBLOX_GNSS::spiTransfer(uint8_t byteToTransfer)
// Send a command via SPI
void SFE_UBLOX_GNSS::sendSpiCommand(ubxPacket *outgoingUBX)
{
if (spiBuffer == NULL) //Memory has not yet been allocated - so use new
{
spiBuffer = new uint8_t[SPI_BUFFER_SIZE];
}

if (spiBuffer == NULL) {
if ((_printDebug == true) || (_printLimitedDebug == true)) // This is important. Print this if doing limited debugging
{
_debugSerial->print(F("process: memory allocation failed for SPI Buffer!"));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please change process to sendSpiCommand.
(In other libraries, I've started using the full class::function name SFE_UBLOX_GNSS::sendSpiCommand just in case you have debug messages turned on in more than one library simultaneously. But no need to do that here.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Paul - done and done :-)

Please also check my other pull request - that one is much more involved and may need (yet more) tweaking! See comments therein.

And my pleasure - I really NEED this lib for my project, so happy to enhance it to meet my needs and to help others.

}
}

// Start at the beginning of the SPI buffer
spiBufferIndex = 0;

SPISettings settingsA(_spiSpeed, MSBFIRST, SPI_MODE0);
_spiPort->beginTransaction(settingsA);
digitalWrite(_ssPin, LOW);
digitalWrite(_csPin, LOW);
//Write header bytes
spiTransfer(UBX_SYNCH_1); //μ - oh ublox, you're funny. I will call you micro-blox from now on.
if (_printDebug) _debugSerial->printf("%x ", UBX_SYNCH_1);
Expand Down Expand Up @@ -2898,7 +2906,7 @@ void SFE_UBLOX_GNSS::sendSpiCommand(ubxPacket *outgoingUBX)
if (_printDebug) _debugSerial->printf("%x ", outgoingUBX->checksumA);
spiTransfer(outgoingUBX->checksumB);
if (_printDebug) _debugSerial->printf("%x \n", outgoingUBX->checksumB);
digitalWrite(_ssPin, HIGH);
digitalWrite(_csPin, HIGH);
_spiPort->endTransaction();
}

Expand Down
13 changes: 8 additions & 5 deletions src/SparkFun_u-blox_GNSS_Arduino_Library.h
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,9 @@ enum sfe_ublox_ls_src_e
//#define MAX_PAYLOAD_SIZE 768 //Worst case: UBX_CFG_VALSET packet with 64 keyIDs each with 64 bit values
#endif

// For storing SPI bytes received during sendSpiCommand
#define SPI_BUFFER_SIZE 128

//-=-=-=-=- UBX binary specific variables
struct ubxPacket
{
Expand Down Expand Up @@ -562,8 +565,8 @@ class SFE_UBLOX_GNSS
boolean begin(TwoWire &wirePort = Wire, uint8_t deviceAddress = 0x42); //Returns true if module is detected
//serialPort needs to be perviously initialized to correct baud rate
boolean begin(Stream &serialPort); //Returns true if module is detected
//SPI - supply instance of SPIClass, slave select pin and SPI speed (in Hz)
boolean begin(SPIClass &spiPort, uint8_t ssPin, int spiSpeed);
//SPI - supply instance of SPIClass, chip select pin and SPI speed (in Hz)
boolean begin(SPIClass &spiPort, uint8_t csPin, uint32_t spiSpeed);

void end(void); //Stop all automatic message processing. Free all used RAM

Expand Down Expand Up @@ -1283,7 +1286,7 @@ class SFE_UBLOX_GNSS
Stream *_debugSerial; //The stream to send debug messages to if enabled

SPIClass *_spiPort; //The instance of SPIClass
uint8_t _ssPin; //The slave select pin
uint8_t _csPin; //The chip select pin
int _spiSpeed; //The speed to use for SPI (Hz)

uint8_t _gpsI2Caddress = 0x42; //Default 7-bit unshifted address of the ublox 6/7/8/M8/F9 series
Expand All @@ -1305,8 +1308,8 @@ class SFE_UBLOX_GNSS
uint8_t *payloadCfg = NULL;
uint8_t *payloadAuto = NULL;

uint8_t spiBuffer[20]; // A small buffer to store any bytes being recieved back from the device while we are sending via SPI
uint8_t spiBufferIndex = 0; // The index into the SPI buffer
uint8_t *spiBuffer = NULL; // A buffer to store any bytes being recieved back from the device while we are sending via SPI
uint8_t spiBufferIndex = 0; // Index into the SPI buffer

//Init the packet structures and init them with pointers to the payloadAck, payloadCfg, payloadBuf and payloadAuto arrays
ubxPacket packetAck = {0, 0, 0, 0, 0, payloadAck, 0, 0, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED, SFE_UBLOX_PACKET_VALIDITY_NOT_DEFINED};
Expand Down