fyq2000wx 发表于 2021-10-27 16:51:18

STC15W4K56S4的SPI口无法切换到第二组管脚

STC15W4K56S4的SPI口无法切换到第二组管脚,示波器看不到时钟信号,但是切换到第一第三组都正常,用的官方库实例。同样的代码在STC15F2K60S2上测试却没有这个问题。
原因查找中。
void        SPI_config(void)
{
        SPI_InitTypeDef                SPI_InitStructure;
        SPI_InitStructure.SPI_Module    = 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_1Edge;          //数据边沿   SPI_CPHA_1Edge,SPI_CPHA_2Edge
        SPI_InitStructure.SPI_Interrupt = ENABLE;                          //中断允许   ENABLE,DISABLE
        SPI_InitStructure.SPI_Speed   = SPI_Speed_128;                  //SPI速度    SPI_Speed_4, SPI_Speed_16, SPI_Speed_64, SPI_Speed_128
//        SPI_InitStructure.SPI_IoUse   = SPI_P12_P13_P14_P15; //IO口切换   SPI_P12_P13_P14_P15, SPI_P24_P23_P22_P21, SPI_P54_P40_P41_P43
        SPI_InitStructure.SPI_IoUse   = SPI_P24_P23_P22_P21;
//        SPI_InitStructure.SPI_IoUse       = SPI_P54_P40_P41_P43;
        SPI_Init(&SPI_InitStructure);
       
        SPI_TxRxMode = SPI_Mode_Slave;
}

NJ8888 发表于 2021-10-27 20:45:34

我试过同样spi程序,stc15可以工作,iap15早期版本可以工作,后期版本卡死在等待发送完成地方

小李非刀 发表于 2021-10-27 23:36:46

测试过,没有问题

fyq2000wx 发表于 2021-10-28 11:19:13

解决了,不同型号的15系列芯片管脚特性不一样,要配置为准双向输出口。
voidSPI_Config(u8 SPI_io, u8 SPI_speed)
{
        SPI_SS_SEL = SPI_io;        //保存SPI的SS脚的编号, 0-->P1.2, 1-->P2.4, 2-->P5.4
       
        SPCTL = (SSIG << 7) + (SPEN << 6) + (DORD << 5) + (MSTR << 4) + (CPOL << 3) + (CPHA << 2) + (SPI_speed & 3);        //配置SPI

        if(SPI_io == 1)
        {
                P_SW1 = (P_SW1 & ~0x0c) | (1<<2);        //切换到P2.4(SS) P2.3(MOSI) P2.2(MISO) P2.1(SCLK)
                P2n_standard(0x1E);                                        //设置为准双向口
        }
        else if(SPI_io == 2)
        {
                P_SW1 = (P_SW1 & ~0x0c) | (2<<2);        //切换到P5.4(SS) P4.0(MOSI) P4.1(MISO) P4.3(SCLK)        
                P5n_standard(0x10);                                        //设置为准双向口
                P4n_standard(0x0B);                                        //设置为准双向口
        }
        else
        {
                P_SW1 &= ~(3<<2);                                        //切换到P1.2(SS) P1.3(MOSI) P1.4(MISO) P1.5(SCLK)        
                P1n_standard(0x3C);                                        //设置为准双向口
        }
}

上面代码是深圳梁工给的。

关于卡死在那个等待的地方我也碰到,待后再测试一下。

rifjft 发表于 2021-10-28 16:57:51

fyq2000wx 发表于 2021-10-28 11:19
解决了,不同型号的15系列芯片管脚特性不一样,要配置为准双向输出口。
voidSPI_Config(u8 SPI_io, u8 SP ...

{:lol:}不要以为一家公司出的产品,特性都一样
芯片资料还是要看的……
就像东芝的步进电机驱动芯片,大部分都是低端采样的,也有几款是高端采样。有些客户直接都当成低端采样的来用,结果是通电没有输出……

小李非刀 发表于 2021-10-29 13:17:09

我一般都习惯自己初始化寄存器、IO,不依赖上电默认模式,移植方便。
对应STC,15系列和8系列的SPI程序我都是通用的。

fyq2000wx 发表于 2021-11-4 16:46:33

突然看到:
//
//   注意:      STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
//               高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//   相关IO:   P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
//               P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
//
                                                                                                                       
页: [1]
查看完整版本: STC15W4K56S4的SPI口无法切换到第二组管脚