1. 硬件环境
- STM32开发板STM32F030C8Tx(淘宝比较多的开发板),我随便买了一个,Debug工具STlink-V2,也不贵。
-
TMC5160BOB
2. 软件环境
- IDE 工具 Visual Studio + GDB
- STM32CubeMX
3. 代码准备
- STM32 逻辑控制工程(官网Git Hub可下载ADI Trinamic · GitHub),如果打不开,我上传了之前下载的一份,版本可能会比较老,不过移植步骤是一样的。我目前也打不开Github了,尴尬,csdn下载地址【免费】TrinamicEvalSystemcodes资源-CSDN文库。
- Trinamic API(官网Git Hub可下载,上面连接中包含该API)
- 使用STM32CubeMx生成控制底层控制代码,主要是SPI的配置,系统和始终根据开发板晶振设置即可。
- 怎么使用Visual Studio + VisualGDB搭建开发环境,可以参考另外一篇文章
Visual Studio+VisualGDb
4. 开始移植
Visual Studio + VisualGDB加载好STM32工程后,将所需的控制工程EvalSystemcodes所用文件代码加入工程中,不需要的代码可以删除掉,最主要的就是把底层控制SPI的接口,替换成当前STM32中的SPI控制接口。
4.1 本例使用是TM5130的控制代码,和TM5160基本可以通用,只有个别寄存器有差别,主要是把这个寄存器读写接口换成自己的spi读写。
void tmc5130_readWriteArray(uint8_t channel, uint8_t *data, uint32_t length)
{
for (uint32_t i = 0; i < length; i++)
{
data[i] = spiReadWriteByte(channel, data[i], (i == (length - 1)) ? 1 : 0);
}
}
4.2 本例中STM32的SPI读写函数如下,spi配置见上面第三章。
uint8_t spiReadWriteByte(uint8_t channel, uint8_t data, uint8_t lastTransfer)
{
uint8_t retry = 0;
if (channel == 0)
{
LL_GPIO_ResetOutputPin(SPI1_CS_Motor_GPIO_Port, SPI1_CS_Motor_Pin);
LL_GPIO_SetOutputPin(SPI1_CS2_Motor_GPIO_Port, SPI1_CS2_Motor_Pin);
}
else
{
LL_GPIO_SetOutputPin(SPI1_CS_Motor_GPIO_Port, SPI1_CS_Motor_Pin);
LL_GPIO_ResetOutputPin(SPI1_CS2_Motor_GPIO_Port, SPI1_CS2_Motor_Pin);
}
if (!LL_SPI_IsEnabled(SPI1))
return 0;
while (!LL_SPI_IsActiveFlag_TXE(SPI1))
{
retry++;
if (retry > 200)return 0;
}
//LL_SPI_SetTransferDirection()
LL_SPI_TransmitData8(SPI1, data);
retry = 0;
while (LL_SPI_IsActiveFlag_BSY(SPI1))
{
retry++;
if (retry > 200)return 0;
}
retry = 0;
while (!LL_SPI_IsActiveFlag_RXNE(SPI1))
{
retry++;
if (retry > 200)return 0;
}
if (lastTransfer)
{
LL_GPIO_SetOutputPin(SPI1_CS_Motor_GPIO_Port, SPI1_CS_Motor_Pin);
LL_GPIO_SetOutputPin(SPI1_CS2_Motor_GPIO_Port, SPI1_CS2_Motor_Pin);
}
return LL_SPI_ReceiveData8(SPI1);
}