Skip to content

l3VGV/tle5010

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 

Repository files navigation

Chip lowest posible turn on voltage lay in 2.6-2.8V range.

On 3.3V one can expect chip to realiably work with 1MBit SPI transfer clock. Use lower resistance pullups, like 750R.

On 5V 2.25MHZ SPI clock was achived with low or no CRC errors. hct125 register was used to translate levels with stm32f103 !BUT! i do not recomend that. chip is 5V nativly, work fine on 3.3V, so lower serial speed. With 1Mbit/s 5010 reliably work on 70cm long cable(common utp4).

Main clock frequency 4MHz

For some reason, on bluepill board, pulldown of SPI SCK line requred, i used 1k, otherwise CRC error rate on 2MBit spi mode skyrocket.

stm32 spi peripheral setting is

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//LOW HIGH 
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;//32-5V fast 64-safe 3.3V; that is for spi1 and bus freq 72
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

c code to validate CRC

const uint8_t crcTable[256] = { 0, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8,
        0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9,
        0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x2, 0x51, 0x4c, 0x6b, 0x76, 0x87,
        0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b,
        0x6, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x4, 0x19, 0xa2,
        0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0xe, 0x29, 0x34, 0x67,
        0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde,
        0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0xc, 0x11, 0x42,
        0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c,
        0x61, 0x46, 0x5b, 0x8, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d,
        0x30, 0x17, 0xa, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26,
        0x3b, 0x1c, 0x1, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba,
        0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x3,
        0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5,
        0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x7, 0x1a, 0x6c,
        0x71, 0x56, 0x4b, 0x18, 0x5, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0,
        0xed, 0xca, 0xd7, 0x35, 0x28, 0xf, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd,
        0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c,
        0x91, 0xb6, 0xab, 0x10, 0xd, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2,
        0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e,
        0x33, 0x14, 0x9, 0x7f, 0x62, 0x45, 0x58, 0xb, 0x16, 0x31, 0x2c, 0x97,
        0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4 };


uint8_t TLE5010CRC(uint8_t *buf, uint8_t len) {
    const uint8_t *ptr = buf;
    uint8_t _crc = 0xFB;//0xFF if u want to pass all 6 bytes(zero and command included)

    while (len--)
        _crc = crcTable[_crc ^ *ptr++];

    return ~_crc;
}

usage

SpiSend([0x00, 0x8c]);
uint8_t tle_data[5] = SpiRecive();

crc = TLE5010CRC(tle_data, 4);

if(crc != tle_data[4]) {'crc mismatch'}
x = ((int16_t)((data[1] << 8) | data[0]));
y = ((int16_t)((data[3] << 8) | data[2]));

        if(
        (x != 32767) && (x != -32768) 
        && (y != 32767) && (y != -32768)
        && (x != 0) && (x != 0)
        )
        {
        //process data here, atan2 it for example
        
        }

Releases

No releases published

Packages

No packages published