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

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

[复制链接]
已绑定手机

1

主题

8

回帖

39

积分

新手上路

积分
39
发表于 2024-12-24 18:48:07 | 显示全部楼层 |阅读模式
在论坛找了一圈没发现有何帖子跟我这现象类似的。现在不知道是哪配置出错了还是有啥我没注意的事项,想来求救于各位大神了!!!

我遇到的问题是:
1.使用8A8K64D4作为SPI从机。
2.主机设置的是SPI模式3,即时钟空闲电平为高电平,在上升沿采集数据,下降沿输出数据。
3.主程序里跑的是空循环,在SPI中断程序里只对SPDAT进行取值,不赋值。(采集和输出寄存器都是SPDAT寄存器)
这样SPI主机对单片机发啥,在下个数据时钟周期内,单片机应该就会回复啥。
4.程序运行之后发现8A8K64D4在输出的时候,是在时钟信号上升沿刚过大约不到0.1us开始跳变的(感觉像是设置成上升沿输出下降沿采集了),正常的应该在下降沿进行跳变,在上升沿进行采集。

截图202412241755456281.jpg
这个图是整体发送和接收通过逻辑分析仪得出来的电平


截图202412241852105623.jpg
这个图是把前两个数据放大后的。图中可以看到MOSI引脚先输出了0x50,在下一个数据的时候MISO回复了0X50。但是问题就出现在这,MOSI的引脚是在下降沿跳变上升沿采集的,而MISO引脚不放大的话看起来像是上升沿跳变下降沿采集(与MOSI引脚不同)

截图202412241856526181.jpg
放大之后可知大约上升沿之后0.1us MISO引脚发生改变(正常情况应该在下降沿的时候才改变)




想问下各位大神,我是哪配置错了或者是有哪疏忽了?


使用单片机型号:STC8A8K64D4
SPI空闲电平为高电平,在上升沿采集数据,下降沿输出数据。

SPI设置为:

void        SPI_config(void)
{


    SPI_InitTypeDef     SPI_InitStructure;
    GPIO_Config(0x12, GPIO_PullUp);
    GPIO_Config(0x13, GPIO_PullUp);
    GPIO_Config(0x14, GPIO_OUT_PP);
    GPIO_Config(0x15, GPIO_PullUp);
    SPI_InitStructure.SPI_Enable    = ENABLE;               //SPI启动    ENABLE, DISABLE
    SPI_InitStructure.SPI_SSIG      = DISABLE;               //片选位     ENABLE, DISABLE
    SPI_InitStructure.SPI_FirstBit  = SPI_MSB;              //移位方向   SPI_MSB, SPI_LSB
    SPI_InitStructure.SPI_Mode      = SPI_Mode_Slave;       //主从选择   SPI_Mode_Master, SPI_Mode_Slave
    SPI_InitStructure.SPI_CPOL      = SPI_CPOL_High;         //时钟相位   SPI_CPOL_High,   SPI_CPOL_Low
    SPI_InitStructure.SPI_CPHA      = SPI_CPHA_2Edge;       //数据边沿   SPI_CPHA_1Edge,  SPI_CPHA_2Edge
    SPI_InitStructure.SPI_Speed     = SPI_Speed_4;          //SPI速度    SPI_Speed_4, SPI_Speed_16, SPI_Speed_64, SPI_Speed_128
    SPI_Init(&SPI_InitStructure);
    NVIC_SPI_Init(ENABLE,Priority_1);       //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
   
    SPI_SW(SPI_P12_P13_P14_P15);    //SPI_P12_P13_P14_P15,SPI_P22_P23_P24_P25,SPI_P74_P75_P76_P77,SPI_P35_P34_P33_P32
   
    SPI_SS = 1;

}




void SPI_ISR_Handler() interrupt SPI_VECTOR
{
        if(SPCTL & 0x10)        //主机模式
        {
                B_SPI_Busy = 0;
        }
        else                                                        //从机模式
        {
                if(SPI_RxCnt >= SPI_BUF_LENTH)                SPI_RxCnt = 0;
                SPI_RxBuffer[SPI_RxCnt++] = SPDAT;
                SPI_RxTimerOut = 5;
        }
        SPSTAT = SPIF + WCOL;        //清0 SPIF和WCOL标志

}



回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-24 19:00:56 | 显示全部楼层
截图202412241900527585.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

39

积分

新手上路

积分
39
发表于 2024-12-25 09:36:27 | 显示全部楼层

CPOL设置的为1,CPHA设置的也为1。  按理来说应该就是SCLK空闲时间为高电平,然后在上升沿采集数据。可是结果就是我上边发的那样。还是在上升沿附近改变的MISO的电平。

点评

异常时读出SPCTL看看  详情 回复 发表于 2024-12-25 09:42
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-12-25 09:42:41 | 显示全部楼层
小书*** 发表于 2024-12-25 09:36
CPOL设置的为1,CPHA设置的也为1。  按理来说应该就是SCLK空闲时间为高电平,然后在上升沿采集数据。可是 ...

异常时读出SPCTL看看
DebugLab
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

39

积分

新手上路

积分
39
发表于 2024-12-25 11:45:38 | 显示全部楼层
Debu*** 发表于 2024-12-25 09:42
异常时读出SPCTL看看

读出来是0x4C
回复 支持 反对

使用道具 举报 送花

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

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-12-25 14:37:16 | 显示全部楼层
从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:
截图202412251435119983.jpg
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

39

积分

新手上路

积分
39
发表于 2024-12-25 15:10:12 | 显示全部楼层
乘风*** 发表于 2024-12-25 14:37
从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:
...

是的,单独看逻辑分析仪的结果是没啥问题,但是仔细观察会发现主机在改变MOSI引脚电平的时候是在时钟信号下降沿的时候,但是单片机回复的时候改变MISO引脚电平是在时钟信号上升沿的时候(放大后可知是在上升沿后大于0.1us)。而设置的是SPI模式3,应该在下降沿的时候改变MISO引脚才对。                                  我的主机是在上升沿的时候采集数据,由于MOSI在上升沿会改变电平所以导致我的主机得到的消息不对。
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

39

积分

新手上路

积分
39
发表于 2024-12-25 15:14:27 | 显示全部楼层
乘风*** 发表于 2024-12-25 14:37
从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:
...

截图202412251514196979.jpg
回复 支持 反对

使用道具 举报 送花

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

39

主题

2006

回帖

6841

积分

论坛元老

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

SPI主从收发-串口打印.zip

18.91 KB, 下载次数: 24

回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

39

积分

新手上路

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

主机用的NXP 的6ULL   不是单片机  是跑LINUX的
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:32 , Processed in 0.232914 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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