Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: SPI_Encoder.cpp
- Revision:
- 0:21ae825df645
- Child:
- 1:7826ec4d9405
diff -r 000000000000 -r 21ae825df645 SPI_Encoder.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SPI_Encoder.cpp Mon Jul 22 17:45:28 2019 +0000
@@ -0,0 +1,67 @@
+#include "mbed.h"
+#include "SPI_Encoder.h"
+
+
+SPI_Encoder::SPI_Encoder(PinName mosi, PinName miso, PinName sclk, PinName _cs0, PinName _cs1, PinName _cs2, PinName _cs3) : encoder(mosi, miso, sclk), cs0(_cs0), cs1(_cs1), cs2(_cs2), cs3(_cs3)
+{
+ encoder.format(8,0);
+ encoder.frequency(8000000);
+};
+
+void SPI_Encoder::getPosition(int num)
+{
+ if (EncoderByteData[num] != Encoderposition_last[num]) { //if nothing has changed dont wast time sending position
+ Encoderposition_last[num] = EncoderByteData[num] ; //set last position to current position
+ } else {
+ uint8_t recieved = 0xA5;//just a temp vairable
+ EncoderByteData[num] = 0;//reset position vairable
+ switching(num, 0);
+ _SPI_T(num, 0x10);//issue read command
+ wait_ms(50);//give time to read. Timmig is critical
+
+ while (recieved != 0x10) { //loop while encoder is not ready to send
+ recieved = _SPI_T(num, 0x00); //cleck again if encoder is still working
+ wait_ms(1); //again,give time to read. Timmig is critical
+ }
+
+ temp[0][num] = _SPI_T(num, 0x00); //Recieve MSB
+ temp[1][num] = _SPI_T(num, 0x00); // recieve LSB
+ switching(num, 1);
+
+ temp[0][num] &=~ 0xF0;//mask out the first 4 bits
+ EncoderByteData[num] = temp[0][num] << 8; //shift MSB to correct EncoderByteData in EncoderByteData message
+ EncoderByteData[num] += temp[1][num]; // add LSB to EncoderByteData message to complete message
+ wait_ms(1);//again,give time to read. Timmig is critical
+ }
+ Steps[num] = EncoderByteData[num]/16;
+}
+
+uint8_t SPI_Encoder::_SPI_T (int num, uint8_t SPITransmit)//Repetive SPI transmit sequence
+{
+ uint8_t SPI_temp = 0; //vairable to hold recieved data
+ switching(num, 0); //select spi device
+ SPI_temp = encoder.write(SPITransmit);//send and recieve
+ switching(num, 1);//deselect spi device
+ return(SPI_temp); //return recieved byte
+}
+
+void SPI_Encoder::_switching(int num, int value)
+{
+ switch(num)
+ {
+ case 0:
+ cs0 = value;
+ break;
+ case 1:
+ cs1 = value;
+ break;
+ case 2:
+ cs2 = value;
+ break;
+ case 3:
+ cs3 = value;
+ break;
+ default:
+ break;
+ }
+}