ichinoseki_Bteam_2019 / SPI_Encoder

Dependents:   ArmNode

SPI_Encoder.cpp

Committer:
Kirua
Date:
2019-07-22
Revision:
0:21ae825df645
Child:
1:7826ec4d9405

File content as of revision 0:21ae825df645:

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