找回密码
 立即注册
查看: 243|回复: 14

有没有用IO模拟做SPI从机的

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-04 11:06:19

13

主题

67

回帖

1095

积分

金牌会员

积分
1095
发表于 2025-7-30 07:24:50 | 显示全部楼层 |阅读模式
看到IO模拟SPI或IIC的,不过都是做主机的,有没有用来做从机的,
用中断方式接收到时钟信号,不知道来不来得及?
回复

使用道具 举报 送花

3

主题

2031

回帖

910

积分

等待验证会员

积分
910
发表于 2025-7-30 07:28:00 | 显示全部楼层
关于使用IO模拟SPI从机的问题,目前在嵌入式开发中确实存在一定的技术挑战,但并非不可实现。以下是对该问题的专业分析与建议:

首先,从技术原理来看,SPI协议本身是一种同步串行通信协议,通常由主设备(Master)控制时钟信号(SCLK),并由从设备(Slave)响应数据传输。标准的SPI通信需要主设备提供时钟信号,从设备根据该时钟进行数据采样和发送。因此,在硬件层面,通常是由主设备驱动SCLK,而从设备则被动地接收和发送数据。

然而,当使用通用IO口(GPIO)模拟SPI时,若希望将该IO口配置为SPI从机,则需具备接收并解析主设备发送的SCLK信号的能力,并据此进行数据处理。这种情况下,是否可行取决于以下几个关键因素:

1. 时钟信号的稳定性与精度  
   SPI通信对时钟信号的稳定性和精度要求较高。如果主设备提供的SCLK频率较高或存在抖动,使用软件模拟可能难以保证时序的准确性,从而导致数据错误或通信失败。

2. 中断响应速度  
   使用中断方式检测SCLK变化是常见的做法。但在高频率下,中断响应时间可能成为瓶颈。例如,若SCLK频率达到数MHz,而系统中断处理延迟较大,可能导致无法及时捕获时钟边沿,进而影响数据采集。

3. 软件实现复杂度  
   通过IO模拟SPI从机需要编写较为复杂的代码逻辑,包括:
检测SCLK上升/下降沿;
在相应时刻读取MISO引脚的数据;
根据接收到的数据进行响应;
处理可能的时序冲突或错误。

4. 实际应用场景的适用性  
   对于低速应用(如kHz级别),使用IO模拟SPI从机是可行的。但在高速场景中,建议优先考虑专用的SPI硬件模块,以确保通信的可靠性和稳定性。

综上所述,虽然理论上可以通过IO模拟实现SPI从机功能,但其可行性受制于系统性能、时钟精度及软件实现复杂度等因素。在实际开发中,若对通信速率要求不高,可尝试采用此方法;若对实时性或稳定性有较高要求,则建议使用硬件SPI接口。

此外,也可以考虑结合DMA或定时器辅助机制,提升IO模拟的效率与可靠性。最终方案应根据具体应用场景进行权衡与优化。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-04 11:06:19

13

主题

67

回帖

1095

积分

金牌会员

积分
1095
发表于 2025-7-31 08:38:30 | 显示全部楼层
这次人工智能的处理算是不错的
AI8051在200K的时钟频率不知能不能扛住
假定INT0上升沿中断,上升沿到中断开始执行大概是多长时间
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-04 11:06:19

13

主题

67

回帖

1095

积分

金牌会员

积分
1095
发表于 2025-8-1 22:29:48 | 显示全部楼层
我测试了一下,INT0中断,信号上升沿到中断开始执行约400ns@40M,估计这个频率下,SPI能跑200K
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:161
  • 最近打卡:2025-08-23 08:11:44

775

主题

1万

回帖

1万

积分

管理员

积分
18735
发表于 2025-8-1 23:41:10 | 显示全部楼层
STC8/STC32/AI8051U, 都有硬件 SPI/I2C, 做从机很常用
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:626
  • 最近打卡:2025-08-24 05:32:32

24

主题

531

回帖

1599

积分

荣誉版主

积分
1599
发表于 2025-8-2 05:25:42 | 显示全部楼层
用IO模拟做SPI从机,可以跑到2.5M波特率。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-04 11:06:19

13

主题

67

回帖

1095

积分

金牌会员

积分
1095
发表于 2025-8-2 14:54:22 | 显示全部楼层
社区*** 发表于 2025-8-2 05:25
用IO模拟做SPI从机,可以跑到2.5M波特率。

实测吗?我用分析仪看,INT0中断后让P43=P32,P43的信号滞后P32约350ns
想请教一下,如果我想让256个位数据右移一位,大约需要多长时间,怎么编程效率高
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:626
  • 最近打卡:2025-08-24 05:32:32

24

主题

531

回帖

1599

积分

荣誉版主

积分
1599
发表于 2025-8-3 12:27:26 | 显示全部楼层
回楼上,几年前用STC8H做的一个产品,做从机 接收2.5MHZ的串口信号,再发送相同波特率的数据信号。
用IO模拟做SPI从机也一样。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-04 11:06:19

13

主题

67

回帖

1095

积分

金牌会员

积分
1095
发表于 2025-8-3 17:01:58 | 显示全部楼层
社区*** 发表于 2025-8-3 12:27
回楼上,几年前用STC8H做的一个产品,做从机 接收2.5MHZ的串口信号,再发送相同波特率的数据信号。
用IO模 ...

我想通过类似SPI的接口获取数据,它的时钟频率在150K。再通过RS485发送出去?
高手可否给个思路?IO中断么?
这个事情的成功概率大么?用IRC做1M左右的通讯成功率高吗?

点评

做从机 SPI,IO中断是必须的。 如果有51汇编基础,编程应该不难。  详情 回复 发表于 2025-8-4 07:34
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-04 11:06:19

13

主题

67

回帖

1095

积分

金牌会员

积分
1095
发表于 2025-8-3 21:11:48 | 显示全部楼层
volatile uint8_t aIn[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint8_t *ptr8;

uint16_t *ptr16;
uint32_t *ptr32;

//16bit

      P42 = 0;
      ptr16[7] <<= 1;   
      if (ptr8[13] & 0x80)
      {
        ptr16[7] |= 0x1;
      }
      else
      {
        ptr16[7] &= 0xfffe;  
      }

      ptr16[6] <<= 1;   
      if (ptr8[11] & 0x80)
      {
        ptr16[6] |= 0x1;
      }
      else
      {
        ptr16[6] &= 0xfffe;  
      }

      ptr16[5] <<= 1;   
      if (ptr8[9] & 0x80)
      {
        ptr16[5] |= 0x1;
      }
      else
      {
        ptr16[5] &= 0xfffe;  
      }

      ptr16[4] <<= 1;   
      if (ptr8[7] & 0x80)
      {
        ptr16[4] |= 0x1;
      }
      else
      {
        ptr16[4] &= 0xfffe;  
      }

      ptr16[3] <<= 1;   
      if (ptr8[5] & 0x80)
      {
        ptr16[3] |= 0x1;
      }
      else
      {
        ptr16[3] &= 0xfffe;  
      }

      ptr16[2] <<= 1;   
      if (ptr8[3] & 0x80)
      {
        ptr16[2] |= 0x1;
      }
      else
      {
        ptr16[2] &= 0xfffe;  
      }   
      
      ptr16[1] <<= 1;   
      if (ptr8[1] & 0x80)
      {
        ptr16[1] |= 0x1;
      }
      else
      {
        ptr16[1] &= 0xfffe;  
      }  

      ptr16[0] <<= 1;   

      P42 = 1;

//32bit

      P42 = 0;
      ptr32[3] <<= 1;   
      if (ptr8[11] & 0x80)
      {
        ptr32[3] |= 0x1;
      }
      else
      {
        ptr32[3] &= 0xfffffffe;  
      }

      ptr32[2] <<= 1;   
      if (ptr8[7] & 0x80)
      {
        ptr32[2] |= 0x1;
      }
      else
      {
        ptr32[2] &= 0xfffffffe;  
      }   
      
      ptr32[1] <<= 1;   
      if (ptr8[3] & 0x80)
      {
        ptr32[1] |= 0x1;
      }
      else
      {
        ptr32[1] &= 0xfffe;  
      }  

      ptr32[0] <<= 1;   



      P42 = 1;



我用上面的程序来测试移位速度,通过分析仪观察P42信号,发现32bit的速度比较快,执行时间约为1.6us@40M,高手帮忙看看怎么编程可以更快些。






回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-24 14:59 , Processed in 0.125813 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表