Fixed three issues with the SPI driver for the LPC1549 platform: #413
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The TXDATCTL register was used even if only the control signals were
modified which caused extra data to be transmitted.
The RXDAT register does not only contain the received data, but also
control information in bits 16 to 20. The old code did not mask out
the control information and in rare cases that would cause the returned
data to include too much information (i.e. received 0xaa as data but the
function returned 0x300aa).
The LPC1549 uses a Switch Matrix (SWM) to allow any pin to have any
function. This is not used in the old code which simply assigned
the first instance of the SPI class to SPI0 and the second instance to
SPI1. The third instance would result in a call to error().
This behaviour is not at all working with real world examples where the
SPI bus contains more than two peripherals. The third peripheral would
cause the platform to end up in error().
The solution is to modify the get_available_spi() function to first see
if the MISO/MOSI/SCLK and SSEL pins are already configured for use as
either SPI0 or SPI1. If the exact same pins are already used then the
SPIx will be reused. If one or more pins are different then another
SPIx will be used (or if both are alredy in use then error()). With this
change it is now possible to do this:
MyFlash f(D11,D12,D13); // Will use SPI0
MyTemp t(D11,D12,D13); // Will use SPI0
SDFileSystem s(D11,D12,D13,"sd"); // Will use SPI0
MyDisplay d(D11,D12,D13); // Will use SPI0
The old/existing code would have resulted in this
MyFlash f(D11,D12,D13); // Will use SPI0
MyTemp t(D11,D12,D13); // Will use SPI1
SDFileSystem s(D11,D12,D13,"sd"); // error()
MyDisplay d(D11,D12,D13); // Will never be called