小书童@456 发表于 2024-12-24 18:48:07

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

在论坛找了一圈没发现有何帖子跟我这现象类似的。现在不知道是哪配置出错了还是有啥我没注意的事项,想来求救于各位大神了!!!

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


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



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


放大之后可知大约上升沿之后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 = SPDAT;
                SPI_RxTimerOut = 5;
      }
      SPSTAT = SPIF + WCOL;      //清0 SPIF和WCOL标志

}



DebugLab 发表于 2024-12-24 19:00:56


小书童@456 发表于 2024-12-25 09:36:27

DebugLab 发表于 2024-12-24 19:00


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

DebugLab 发表于 2024-12-25 09:42:41

小书童@456 发表于 2024-12-25 09:36
CPOL设置的为1,CPHA设置的也为1。按理来说应该就是SCLK空闲时间为高电平,然后在上升沿采集数据。可是 ...

异常时读出SPCTL看看

小书童@456 发表于 2024-12-25 11:45:38

DebugLab 发表于 2024-12-25 09:42
异常时读出SPCTL看看

读出来是0x4C

乘风飞扬 发表于 2024-12-25 14:37:16

从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:

小书童@456 发表于 2024-12-25 15:10:12

乘风飞扬 发表于 2024-12-25 14:37
从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:
...

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

小书童@456 发表于 2024-12-25 15:14:27

乘风飞扬 发表于 2024-12-25 14:37
从逻辑分析仪采集的数据来看,主机发什么,下个字节收什么的目的达到了,返回的就是发送的数据:
...


乘风飞扬 发表于 2024-12-25 16:36:35

主机用的什么芯片?如果也是STC芯片的话烧录附件例子到主机与从机板子进行收发试试。

小书童@456 发表于 2024-12-25 17:55:12

乘风飞扬 发表于 2024-12-25 16:36
主机用的什么芯片?如果也是STC芯片的话烧录附件例子到主机与从机板子进行收发试试。 ...

主机用的NXP 的6ULL   不是单片机是跑LINUX的
页: [1] 2
查看完整版本: 8A8K64D4使用硬件SPI作为从机,MISO引脚电平变化发生在采集跳变沿之后问题