最近规划了一批要做的项目,有几个都需要用到步进电机,所以准备设计一款串联式闭环步进电机驱动器。
由于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); }
|