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
}