找回密码
 立即注册
楼主: 小书童@456

8A8K64D4使用硬件SPI作为从机,MISO引脚电平变化发生在采集跳变沿之后问题

[复制链接]
已绑定手机

1

主题

8

回帖

39

积分

新手上路

积分
39
发表于 2024-12-27 16:22:19 | 显示全部楼层
乘风*** 发表于 2024-12-25 16:36
主机用的什么芯片?如果也是STC芯片的话烧录附件例子到主机与从机板子进行收发试试。 ...

这份代码试了试,目前结果是这样的。

由于我手里没有开发板,只有公司成品。目前成品的SPI是用的P1.2 P1.3 P1.4 P1.5 引脚。所以我把这里边的代码SPI引脚使用部分做了下改动,具体改动如下:

主机程序:

void SPI_init(void)
{
       
       
    SPI_SS = 1;
    SPCTL = 0xd4;    //使能 SPI 主机模式进行待机
//    AUXR1 = (AUXR1 & ~(3<<2)) | (1<<2);  //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P7.4 P7.5 P7.6 P7.7, 3: P3.5 P3.4 P3.3 P3.2
          AUXR1 = (AUXR1 & ~(3<<2)) ;  //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P7.4 P7.5 P7.6 P7.7, 3: P3.5 P3.4 P3.3 P3.2
    IE2 |= ESPI;     //使能 SPI 中断
    SPSTAT = SPIF + WCOL;   //清0 SPIF和WCOL标志

    SPI_TimeOut = 0;
    B_SPI_Busy = 0;
    SPI_Cnt = 0;
}


从机程序:

void SPI_init(void)
{
    SPI_SS = 1;
    SPCTL = 0x44;  //使能 SPI 从机模式进行待机
//    AUXR1 = (AUXR1 & ~(3<<2)) | (1<<2);  //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P7.4 P7.5 P7.6 P7.7, 3: P3.5 P3.4 P3.3 P3.2
          AUXR1 = (AUXR1 & ~(3<<2));  //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P7.4 P7.5 P7.6 P7.7, 3: P3.5 P3.4 P3.3 P3.2
    IE2 |= ESPI;   //使能 SPI 中断
    SPSTAT = SPIF + WCOL;   //清0 SPIF和WCOL标志
    SPDAT = 0x55;  //设置回复的第一个字节数据

    SPI_TimeOut = 0;
    B_SPI_Busy = 0;
    B_SPI_Send = 0;
    SPI_Cnt = 0;
}


这样将两份程序分别下进去后,然后通过主机的串口一直发送数据0x56,从机会返回0x55,我通过逻辑分析仪抓到的波形如下:
截图202412271554089384.jpg

可以看到这个时钟的波形不太规整,主机程序控制的MOSI引脚是在上升沿产生变化的,而从机控制的MISO引脚是有的时候在上升沿有的时候在上升沿过一点。
这个时候我怀疑是不是这个SPI速率太快导致从机反应没那么快的问题导致的,于是我将主机和从机代码的SPI速率都设置为SYSclk/16
截图202412271600239710.jpg


主机程序:

void SPI_init(void)
{
       
       
    SPI_SS = 1;
//    SPCTL = 0xd4;    //使能 SPI 主机模式进行待机
    SPCTL = 0xd6;    //使能 SPI 主机模式进行待机
//    AUXR1 = (AUXR1 & ~(3<<2)) | (1<<2);  //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P7.4 P7.5 P7.6 P7.7, 3: P3.5 P3.4 P3.3 P3.2
          AUXR1 = (AUXR1 & ~(3<<2)) ;  //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P7.4 P7.5 P7.6 P7.7, 3: P3.5 P3.4 P3.3 P3.2
    IE2 |= ESPI;     //使能 SPI 中断
    SPSTAT = SPIF + WCOL;   //清0 SPIF和WCOL标志

    SPI_TimeOut = 0;
    B_SPI_Busy = 0;
    SPI_Cnt = 0;
}


从机程序:

void SPI_init(void)
{
    SPI_SS = 1;
//    SPCTL = 0x44;  //使能 SPI 从机模式进行待机
          SPCTL = 0x46;  //使能 SPI 从机模式进行待机
//    AUXR1 = (AUXR1 & ~(3<<2)) | (1<<2);  //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P7.4 P7.5 P7.6 P7.7, 3: P3.5 P3.4 P3.3 P3.2
          AUXR1 = (AUXR1 & ~(3<<2));  //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P7.4 P7.5 P7.6 P7.7, 3: P3.5 P3.4 P3.3 P3.2
    IE2 |= ESPI;   //使能 SPI 中断
    SPSTAT = SPIF + WCOL;   //清0 SPIF和WCOL标志
    SPDAT = 0x55;  //设置回复的第一个字节数据

    SPI_TimeOut = 0;
    B_SPI_Busy = 0;
    B_SPI_Send = 0;
    SPI_Cnt = 0;
}



还是主机通过串口发送0x56,通过逻辑分析仪抓到的波形如下:
截图202412271618153331.jpg

此时可以看到主机的mosi引脚都是在上升沿变化的,而从机的MISO引脚是在下降沿过了一点点变化的。
放大下降沿的时候改变miso引脚部分如下:
截图202412271621063681.jpg

可以看到此时现象与我一开始反馈现象一致,都是在采集沿过了不到0.1us就产生了变化。

截图202412271553042534.jpg
截图202412271559452897.jpg
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

39

积分

新手上路

积分
39
发表于 2024-12-27 16:48:00 | 显示全部楼层
乘风*** 发表于 2024-12-25 16:36
主机用的什么芯片?如果也是STC芯片的话烧录附件例子到主机与从机板子进行收发试试。 ...




将主机和从机代码SPI频率设置成SYSclk/2之后其他不变,进行同样的操作得到的波形如下



截图202412271646033117.jpg



此时波形就完全乱了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-12-30 09:07:34 | 显示全部楼层
从机第一个字节返回0x55是正确的:
截图202412300905489628.jpg
至于回复触发时间应该是这颗芯片就这么设计的。
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

39

积分

新手上路

积分
39
发表于 2024-12-30 10:06:12 | 显示全部楼层
乘风*** 发表于 2024-12-30 09:07
从机第一个字节返回0x55是正确的:

至于回复触发时间应该是这颗芯片就这么设计的。 ...

第一个回复字节是0x55是正确,因为在spi初始化的时候往SPDAT放了0x55,第一个输出的spi字节就是0x55。现在我纳闷的是我用了你发给我的例程和官网发布的例程现象都是在spi速率设置为系统时钟/4的时候。从机spi回复的波形都是对的(CPOL=0 CPHA=1  MOSI和MISO引脚都是在时钟信号上升沿改变电平,然后在时钟信号下降沿采集数据)。但是当spi速率设置为系统时钟/16的时候。从机spi回复的波形都是错的(CPOL=0 CPHA=1  MOSI引脚都是在时钟信号上升沿改变电平,然后在时钟信号下降沿采集数据。MISO引脚都是在时钟信号下降沿改变电平)。这就说明此时SPI的通信有问题了。  目前还是不知道怎么解决这个问题,唉。。。。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-12-31 11:29:27 | 显示全部楼层
早期的芯片设计,SPI从机模式检测到SCLK采样信号,三个(从机)系统时钟后MISO就输出下一个位。
截图202412311125459424.jpg
20210831之后对SPI进行更改:
CPOL = 0,  CPHA = 1,  SPR = SYSclk / 16
按照这种设置数据在CLK下降沿采样,MISO获取的信号,下降沿采样点在数据位信号靠近中间位置:
截图202412311126301406.jpg
MOSI信号下降沿采样点在数据位信号中间:
截图202412311127544365.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:20 , Processed in 0.137424 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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