昆泰芯KTH7812磁编码器SPI通信

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];    //返回结果处理
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值