ichinoseki_Bteam_2019 / SPI_Encoder

Dependents:   ArmNode

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;
+    }
+}