Add support for KL46Z
Fork of BurstSPI by
Revision 3:7d9b64d67b22, committed 2013-07-04
- Comitter:
- Sissors
- Date:
- Thu Jul 04 19:03:58 2013 +0000
- Parent:
- 2:a8e55f7cbfee
- Child:
- 4:8585ddebd28b
- Child:
- 5:4437229b0738
- Commit message:
- Refactored code, added version 1 of KL25Z support
Changed in this revision
--- a/BurstSPI.cpp Fri Jan 04 09:51:42 2013 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-#include "BurstSPI.h"
-
-BurstSPI::BurstSPI(PinName mosi, PinName miso, PinName sclk) : SPI(mosi, miso, sclk){
-
-}
-
-
-void BurstSPI::fastWrite(int data) {
- //Wait until FIFO has space
- while(((_spi.spi->SR) & 0x02) == 0);
-
- //transmit data
- _spi.spi->DR = data;
- }
-
-void BurstSPI::setFormat( void ) {
- format(_bits, _mode);
- frequency(_hz);
- }
-
-void BurstSPI::clearRX( void ) {
- //Do it while either data in RX buffer, or while it is busy
- while(((_spi.spi->SR) & ((1<<4) + (1<<2))) != 0) {
- //Wait until data in RX buffer
- while(((_spi.spi->SR) & (1<<2)) == 0);
- int dummy = _spi.spi->DR;
- }
-}
\ No newline at end of file
--- a/BurstSPI.h Fri Jan 04 09:51:42 2013 +0000
+++ b/BurstSPI.h Thu Jul 04 19:03:58 2013 +0000
@@ -26,7 +26,8 @@
* the normal mbed library. With this library it takes 25ms, which is also the theoretical
* amount of time it should take. If you are running at 1MHz this will do alot less.
*/
-class BurstSPI : public SPI {
+class BurstSPI : public SPI
+{
public:
/** Create a SPI master connected to the specified pins
*
@@ -39,7 +40,7 @@
* @param miso SPI Master In, Slave Out pin
* @param sclk SPI Clock pin
*/
- BurstSPI(PinName mosi, PinName miso, PinName sclk);
+ BurstSPI(PinName mosi, PinName miso, PinName sclk) : SPI(mosi, miso, sclk) {};
/** Put data packet in the SPI TX FIFO buffer
*
@@ -49,17 +50,20 @@
* @param data Data to be sent to the SPI slave
*/
void fastWrite(int data);
-
+
/** Use this function before fastWrite to set the correct settings
- *
+ *
* It is not needed to use this if the last SPI commands were either normal SPI transmissions,
* or setting different format/frequency for this object. It is required to call this
* function when several SPI objects use the same peripheral, and your last transmission was
* from a different object with different settings. Not sure if you should use it?
* Use it, it takes very little time to execute, so can't hurt.
*/
- void setFormat( void );
-
+ void setFormat( void ) {
+ format(_bits, _mode);
+ frequency(_hz);
+ }
+
/** After you are done with fastWrite, call this function
*
* FastWrite simply fills the SPI's (SSP's actually) TX FIFO buffer as fast as it can,
@@ -67,34 +71,34 @@
* so the the RX buffer is full with unneeded packets. This function waits until transmission is finished,
* and clears the RX buffer. You always have to call this before you want to receive
* SPI data after using fastWrite.
- */
+ */
void clearRX( void );
-
-
+
+
//Just for documentation:
- #if 0
+#if 0
/** Configure the data transmission format
*
* @param bits Number of bits per SPI frame (4 - 16)
* @param mode Clock polarity and phase mode (0 - 3)
*
* @code
- * mode | POL PHA
- * -----+--------
- * 0 | 0 0
+ * mode | POL PHA
+ * -----+--------
+ * 0 | 0 0
* 1 | 0 1
- * 2 | 1 0
+ * 2 | 1 0
* 3 | 1 1
* @endcode
*/
void format(int bits, int mode = 0);
-
+
/** Set the spi bus clock frequency
*
* @param hz SCLK frequency in hz (default = 1MHz)
*/
void frequency(int hz = 1000000);
-
+
/** Write to the SPI Slave and return the response
*
* @param value Data to be sent to the SPI slave
@@ -103,7 +107,7 @@
* Response from the SPI slave
*/
virtual int write(int value);
- #endif
+#endif
};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/BurstSPI_KL25Z.cpp Thu Jul 04 19:03:58 2013 +0000
@@ -0,0 +1,24 @@
+#ifdef TARGET_KL25Z
+#include "BurstSPI.h"
+
+void BurstSPI::fastWrite(int data) {
+ //Wait until FIFO has space
+ while(((_spi.spi->S) & SPI_S_SPTEF_MASK) == 0);
+ //transmit data
+ _spi.spi->D = data;
+ }
+
+void BurstSPI::clearRX( void ) {
+ //We put in a delay here, this function shouldn't be called very often, so not a huge problem
+ //Without delay you will rise the CS line before it is finished (been there, done that)
+ //We use time required to transmit 20 bits (8 bits being transmitted, 8 bits in FIFO, 4 bits safety margin
+
+ float bytetime = 20.0/_hz;
+ wait(bytetime);
+
+ //Wait until status is flagged that we can read, read:
+ while (_spi.spi->S & SPI_S_SPRF_MASK == 0);
+ int dummy = _spi.spi->D;
+
+}
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/BurstSPI_LPC1768.cpp Thu Jul 04 19:03:58 2013 +0000
@@ -0,0 +1,20 @@
+#ifdef TARGET_LPC1768
+#include "BurstSPI.h"
+
+void BurstSPI::fastWrite(int data) {
+ //Wait until FIFO has space
+ while(((_spi.spi->SR) & 0x02) == 0);
+
+ //transmit data
+ _spi.spi->DR = data;
+ }
+
+void BurstSPI::clearRX( void ) {
+ //Do it while either data in RX buffer, or while it is busy
+ while(((_spi.spi->SR) & ((1<<4) + (1<<2))) != 0) {
+ //Wait until data in RX buffer
+ while(((_spi.spi->SR) & (1<<2)) == 0);
+ int dummy = _spi.spi->DR;
+ }
+}
+#endif
\ No newline at end of file
S. Ken San
