[CW32F003系列] 用SPI可变位数实现模拟非标串口

[复制链接]
 楼主| zhanan 发表于 2025-4-21 21:24 | 显示全部楼层 |阅读模式
做了一个项目,单片机控制700个步进电机,每个步进电机有3bit数据,每次需要连续发送2100bit数据。
步进电机离单片机有十几米远,需要抗干扰能力强的通讯方式,所以选择485通讯。
但是标准串口都是8bit的,可发送两个3bit,有2bit空闲,有点可惜。
看了CW32的SPI,位数可变,最大16位,并且可以单工只发,用来做一个非标串口非常不错,一帧数据可以发送4个步进电机数据12bit。
实际又加了一个控制位,最高位为0表示数据,为1表示命令,共13位,再加上起始位0和停止位1,共15位。
没用晶振,用HSI振荡器即可满足波特率精度要求,3M波特率啊,CW32F003主频24M。
 楼主| zhanan 发表于 2025-4-21 21:26 | 显示全部楼层
SPI初始化:
  GPIOC->AFRL = 0x0300; // PC2复用SPI_MOSI输出
  SPI->CR1 = 0x7A54; // 单工只发15位,高位先发,3M波特率
  SPI->DR =0xFFFF; // 发送后MOSI高电平,模拟串口空闲时输出高电平
 楼主| zhanan 发表于 2025-4-21 21:27 | 显示全部楼层
发送程序:  
// SPI模拟串口发送13位数据,高位先发
// 注意这是阻塞式,非阻塞可用中断实现。
void spi_tx(u16 data)
{
  while((SPI->ISR & 0x01)==0); // 等上次的发完
  SPI->DR = (data<<1)+1; // 加上停止位发送
}
 楼主| zhanan 发表于 2025-4-21 21:28 | 显示全部楼层
程序中调用:
void fsbjdjsj(u8 nms) // 发送步进电机数据
{

  spi_tx(0x1811); // 发送跳行信号(同步信号)

  ...数据整理

  for
  {
    spi_tx(data[i]); // 连续发送步进电机数据
  }
  ...
}
coody 发表于 2025-4-22 21:03 | 显示全部楼层
串口就可以了,8个电机数据24bits,刚好放在3个字节中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

194

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

11

主题

194

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部