1.简介
本篇文章介绍了昆泰芯KTH7812磁编码器的SPI通信,并给出对应实例代码。
KTH7812能够通过SPI读取绝对角度(最高 16 位分辨率绝对角度输出),读写寄存器,且其SPI通信速率快,最高能达到10MHz。
2.KTH7812的SPI通信
KTH7812使用四线SPI进行通信,其通信模式为 mode3(CPOL = 1 和 CPHA = 1)。需要注意的是KTH7812在进行SPI通信时会在下一帧返回当前帧的结果。
KTH7812的SPI支持读取角度、读取配置寄存器和写入配置寄存器等功能,相关指令如下
SPI读寄存器
在读寄存器指令的下一帧是返回的寄存器值,占据数据帧的高八位。
SPI写寄存器
在写寄存器指令的下一帧是新写入寄存器的值,占据数据帧的高八位。
SPI读取绝对角度
在读取角度指令的下一帧是返回的角度值,占据数据帧的全部16bit。
3.实例
以读取角度为例,基本逻辑是CS拉低,MOSI发送指令0x0000,MISO返回16位角度数据。
如需转换为0~360°角度输出可通过以下公式进行计算:
接下来是相应的代码实现,使用的是STM32F303,利用STM32CubeMX自动生成配置代码
SPI配置为:
void MX_SPI1_Init(void)
{
/* USER CODE BEGIN SPI1_Init 0 */
/* USER CODE END SPI1_Init 0 */
/* USER CODE BEGIN SPI1_Init 1 */
/* USER CODE END SPI1_Init 1 */
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; //CPOL = 1
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; //CPHA = 1
hspi1.Init.NSS = SPI_NSS_SOFT; //CS软件拉高拉低
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
使用SPI读取角度:
uint16_t Angle = 0;
void KTH78_SPI_TransmitReceive(uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
{
HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, pTxData, pRxData, 2, 0xFFFF);
HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_SET);
}
void KTH78_SPI_ReadAngle(void)
{
uint8_t spitx[2] = {0x00, 0x00}; //SPI指令
uint8_t spirx[2];
KTH78_SPI_TransmitReceive(spitx, spirx, 2);
KTH78_SPI_TransmitReceive(spitx, spirx, 2);
Angle = ((uint16_t)spirx[0] << 8) | spirx[1]; //返回结果处理
}