STM32MXcube的SPI通讯读取AS5048A

AS5048A除了通过PWM向外传输数据外,还通过SPI口向外发送位置。手头的资料是寄存器SPI读写的版本,和HAL库简直不搭边,当然也因为水平限制看起来代码读的很累,尝试着将寄存器版本的库引入STM32MX生成的代码中,但是最终失败了,时间不等人,那就继续用HAL自带的库读写好了。其实最后完成了一看,HAL库真的是简单简洁,读起来很好。(寄存器运行的好像是要更快的,建议要求较高的地方还是采用寄存器方式)。

话不多说,上配置。在cube中配置好SPI通讯,注意CPOL的极性是Low。(水平还是太菜,没看懂这是什么意思,导致读出的结果范围不能到0):
在这里插入图片描述
然后写读取的函数如下:

#define Com_Ang     0xFFFF //读取角度命令

#define CS10        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET)
#define CS11        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET)//片选1号SPI使可读
uint16_t SPI_AS5048A_ReadData(void)
{
  uint16_t angle_value;
  command = Com_Ang;
  CS10;
  HAL_SPI_Transmit(&hspi1 ,(unsigned char *)&command ,1,100);
  CS11;
  CS10;
  HAL_SPI_TransmitReceive(&hspi1 ,(unsigned char *)&command ,(unsigned char *)&angleValue ,1 ,100 );
  CS11;
  angle_value = angleValue & 0x3FFF;
  return angle_value;
}

以上,就能读出来AS5048的SPI位置了。当然,得到的数据需要除以一个最大值0x3FFF再乘以三百六十度。

以上代码不包含校验,只是作为理想情况下的读出。Com_ang作为角度读出指令本应是0x3FFF,但是加上校验位和标志位,所以写入的时候应该是0xFFFF。AS5048是延迟输出的,就是读出的是上一次的位置,所以我在这里写两次读一次。后来一验证,你持续不断的读就可以了,不需要写两次读一次,反正读的就是上一次的值。但是,如果读的间隔太长,那还是建议写两次读一次的方式,毕竟这样读出来的值最接近当前位置。

头一次接触cube,磕磕绊绊的,搞了两天多。如果能对后来人有所帮助,那真是太好了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值