0%

ESP32使用HSPI读取磁编AS5048A

最近规划了一批要做的项目,有几个都需要用到步进电机,所以准备设计一款串联式闭环步进电机驱动器。

由于STM32价格飞涨,买二手拆机芯片都已经很贵了,所以未来一段时间如果不是必须使用stm32的情况下,都是暂时使用ESP32来代替,性能差不多的情况下价格低了一个数量级,完美的平替产品。

今天用esp32-cam模组验证了一下磁编传感器的通信,也遇到了些问题,这里记录一下。

ESP32 SPI介绍

  • ESP32有四个SPI外设,分别为SPI0、SPI1、HSPI和VSPI。
  • SPI0是专用于Flash的缓存,ESP32将连接的SPI Flash设备映射到内存中。
  • SPI1和SPI0 使用相同的硬件线,SPI1用于写入flash芯片。
  • HSPI和VSPI可以任意使用。

VSPI和HSPI的接口及引脚

VSPI和HSPI的默认引脚
| SPI | MOSI | MOSI | SCLK | SS |
| :— | :—-: | :—-: | :—-: | —: |
| VSPI | 23 | 19 | 18 | 5 |
| HSPI | 13 | 12 | 14 | 15 |

如果使用IO_MUX映射到其他引脚,会降低速率,默认引脚支持80M,映射后最高40M

SPI基本函数

初始化

1
2
SPI.begin();
SPI.begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_SS);

传输方式

1
SPI.setBitOrder(MSBFIRST);

设置频率

1
SPI.setFrequency(1000000);

设置时钟模式

1
SPI.setDataMode(SPI_MODE0);

接收/发送函数

1
2
3
byte ret = SPI.transfer(0x00);
word ret = SPI.transfer16(0x0000);
int ret = SPI.transfer32(0x00000000);

使用HSPI读AS5048A程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <SPI.h>

#define HSPI_MISO 12
#define HSPI_MOSI 13
#define HSPI_SCLK 14
#define HSPI_SS 15

static const int spiClk = 10000000;
SPIClass *hspi = NULL;

void setup() {
Serial.begin(115200);
hspi = new SPIClass(HSPI);

//hspi->begin();
hspi->begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_SS); //SCLK, MISO, MOSI, SS
pinMode(HSPI_SS, OUTPUT); //HSPI SS
}

void loop() {
delay(20);

word angle_register = 0x3fff | 0x8000;
hspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE1));
digitalWrite(HSPI_SS, LOW);
word ret = hspi->transfer16(angle_register);
digitalWrite(HSPI_SS, HIGH);
delayMicroseconds(50);
digitalWrite(HSPI_SS, LOW);
ret = hspi->transfer16(angle_register);
digitalWrite(HSPI_SS, HIGH);
hspi->endTransaction();

ret = ret & 0x3fff;
float ang = (float)(ret) / 16384.0f * 360.0f;
Serial.println(ang);
}