[quote=引用 18 楼 天龙浩 的回复:] 可以分享下完整的STM32驱动TMC26x的代码吗???下载了你那个407驱动4个TMC的无法使用
可以分享下完整的STM32驱动TMC26x的代码吗???下载了你那个407驱动4个TMC的无法使用
请问 可以正常驱动电机了么,能否分享一下代码
各位大佬,我移植了你们的程序和按照协议重新写了,但是TMC2660写数据返回值都是乱七八糟的,电机也完全动不起来,请问这可能是什么问题??怎么判断SPI通讯成功??
1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
地址加偏移地址的方式,参考操作系统之类的教材。
是的,TMC260是20位帧传输格式的SPI 而STM32 好像只支持8&16位帧传输格式,所以,你没法直接用STM32的硬件SPI端口。 好在STM32速度足够快哈,所以编写一个软SPI驱动貌似也很简单嘛,就像我们编软串口、软I2C一样的弄。 仔细对照官方文档的时序,和下面表格的极限参数,驱动写出来应该很容易的。
[quote=引用 7 楼 tianxj001 的回复:] [quote=引用 3 楼 qq_20553613 的回复:] 1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
楼主可能理解我的意思了,我的意思不是动态位数发送;看tmc260的手册就知道,可以整字节发送,即发送3个字节(24位,从的我代码也可以看出来),高4位无效位tmc260会忽略的(很多非标准spi器件都会支持这个功能);目前,我用的tmc2660,兼容tmc260,stm32F1驱动,已在产品上使用。
[quote=引用 3 楼 qq_20553613 的回复:] 1、我用的是TMC2660,与TMC260兼容,TMC2660电流更大,而且价格还便宜;TMC260(2660)是20位控制寄存器,看手册就知道,控制器(单片机)可整字节发送,高位会自动忽略,把需要控制的控制字放在对应的位上发送即可,即是最少需要发送3个字节数据(stm32 spi设置为8位模式); 2、上关键代码,spi配置就不上了; static u32 tmc2660_spi_xfer(u8 spi_no,u32 write_data) { u8 send_buff[3],recv_buff[3]; u32 recv_data= 0; send_buff[0] = (write_data>>16)&0xff; send_buff[1] = (write_data>>8)&0xff; send_buff[2] = (write_data&0xff); spi_send_recv(&tmc2660_spi_dev[spi_no],send_buff,recv_buff,3); recv_data = recv_buff[0]<<16 | recv_buff[1]<<8 | recv_buff[2]; return (recv_data&0x0fffff); } 置于各个控制字则对照手册发送即可。
21,600
社区成员
21,708
社区内容
加载中
试试用AI创作助手写篇文章吧