17 .id=CLSID_ENCODER_BISS
27 SPIDevice(ENCODER_SPI_PORT, ENCODER_SPI_PORT.getCsPins()[0]),
83 this->
spiSpeed = ((buf >> 5) & 0x3) +1;
92 buf |= ((this->
spiSpeed-1) & 0x3) << 5;
96 Flash_Write(ADR_BISSENC_OFS, (uint16_t)(scaledOfs) );
104 prescale = SPI_BAUDRATEPRESCALER_64;
107 prescale = SPI_BAUDRATEPRESCALER_32;
110 prescale = SPI_BAUDRATEPRESCALER_16;
113 prescale = SPI_BAUDRATEPRESCALER_16;
119 config->
peripheral.BaudRatePrescaler = prescale;
120 config->
peripheral.FirstBit = SPI_FIRSTBIT_MSB;
121 config->
peripheral.CLKPhase = SPI_PHASE_2EDGE;
122 config->
peripheral.CLKPolarity = SPI_POLARITY_HIGH;
123 config->
peripheral.DataSize = SPI_DATASIZE_8BIT;
124 config->
cspol =
true;
170 rxData64 = (uint64_t)__REV(decod_buf[0]) << 32;
171 rxData64 |= (uint64_t)__REV(decod_buf[1]);
175 rxData64 <<= __builtin_clzll(rxData64);
176 rxData64 &= 0x3FFFFFFFFFFFFFFF;
182 int nbBit = 64-__builtin_clzll(rxData64);
183 if ( nbBit >= ( lenghtDataBit + 10 ) ) {
184 rxData64 >>= nbBit-( lenghtDataBit + 10 );
187 uint8_t crcRx = rxData64 & 0x3F;
188 uint32_t dataRx = (rxData64 >> 6) & ((1<<(lenghtDataBit + 2)) - 1);
189 uint8_t errorWarning = (dataRx & 0x3);
190 newPos = (dataRx >> 2) & ((1<<lenghtDataBit) - 1);
194 crc = ((dataRx >> 30) & 0x03);
195 crc = tableCRC6n[((dataRx >> 24) & 0x3F) ^
crc];
196 crc = tableCRC6n[((dataRx >> 18) & 0x3F) ^
crc];
197 crc = tableCRC6n[((dataRx >> 12) & 0x3F) ^
crc];
198 crc = tableCRC6n[((dataRx >> 6) & 0x3F) ^
crc];
199 crc = tableCRC6n[((dataRx >> 0) & 0x3F) ^
crc];
202 bool crc_ok =
crc == crcRx;
229 int32_t diff = (
pos - newpos);
void makeCrcTable(std::array< T, LEN > &table, const T crcpoly, const uint8_t bits, const bool refin=false, const bool refout=false)
std::array< uint8_t, 64 > EncoderBissC::tableCRC6n __attribute__((section(".ccmram")))
void registerCommand(const char *cmd, const ID cmdid, const char *help=nullptr, uint32_t flags=0)
static CommandStatus handleGetSet(const ParsedCommand &cmd, std::vector< CommandReply > &replies, TVal &value)
static ClassIdentifier info
void endSpiTransfer(SPIPort *port)
static std::array< uint8_t, 64 > tableCRC6n
void beginSpiTransfer(SPIPort *port)
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
cpp_freertos::BinarySemaphore waitForUpdateSem
void spiRxCompleted(SPIPort *port) override
static bool isCreatable()
static const uint32_t waitThresh
static const bool useWaitSem
const ClassIdentifier getInfo()
Command handlers always have class infos. Works well with ChoosableClass.
static const uint8_t bytes
cpp_freertos::BinarySemaphore requestNewDataSem
uint32_t decod_buf[bytes/4]
EncoderType getEncoderType()
virtual SPIConfig * getSpiConfig()
virtual void setSpiConfig(SPIConfig config)
void takeExclusive(bool exclusive)
void receive_DMA(uint8_t *buf, uint16_t size, SPIDevice *device)
void configurePort(SPI_InitTypeDef *config)
bool Take(TickType_t Timeout=portMAX_DELAY)
uint32_t WaitForNotification(TickType_t Timeout=portMAX_DELAY)
TVal Flash_ReadDefault(uint16_t adr, TVal def)
bool Flash_Write(uint16_t adr, uint16_t dat)
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty=true)
static void * memcpy(void *dst, const void *src, size_t n)
SPI_InitTypeDef peripheral
bool cspol
CSPOL=true === active low.