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