This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

28377s 的SPI 例程GPIO使用自发自收,未使用GPIO,是否配置有误?另外配置SPI和GPIO使用查询发送数据,示波器没有数据且无时钟信号。

问题:28377的例程中SPI的GPIO使用为GPIO16 GPIO17 GPIO18 GPIO19 ,但是实际上SPI使用的都是这几个。调试过程中我使用了SPIA,设置GPIO58 、59、60、61。使用的是查询方式发送数据,SPITXBUF寄存器的值为我设定的值,但是使用示波器没有时钟信号和数据信号。

    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;   // Enable pull-up on GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;   // Enable pull-up on GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;   // Enable pull-up on GPIO18 (***)
    GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;   // Enable pull-up on GPIO19 (SPISTEA)

    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO18 (***)
    GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO19 (SPISTEA)

    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // Configure GPIO18 as ***
    GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA

SPI配置

SpiaRegs.***.all =0x004F;   //CLKPOLARITY=1,16bit           

 SpiaRegs.***.all =0x0006;    //CLK_PHASE=0,master       

  SpiaRegs.SPIBRR.all =0x001F;
    SpiaRegs.***.all =0x00CF;     //CLKPOLARITY=1,Reset,16bit     

    SpiaRegs.SPIPRI.bit.FREE = 1;       

主函数

void main(void)
{
   Uint16 sdata;  // send data
   Uint16 rdata;  // received data

   InitSysCtrl();

   InitSpiaGpio();

   DINT;

   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;
   
   InitPieVectTable();
 
   spi_init();    // init SPI

   sdata = 0x1011;
   for(;;)
   {    
     spi_xmit(sdata);
     DELAY_US(100000L);
   }
}  

  • GPIO16 GPIO17 GPIO18 GPIO19关于SPI的配置屏蔽了么?

  • 我使用修改后是屏蔽了的。能不能看出来哪里有问题。

  •     GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO16 (SPISIMOA)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO17 (SPISOMIA)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO18 (SPICLKA)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO19 (SPISTEA)

        GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
        GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // Configure GPIO17 as SPISOMIA
        GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // Configure GPIO18 as SPICLKA
        GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA

    你的mux和滤波设置有做eallow保护吗?另外GPIO58到GPIO61是高速SPI口,你设置内部input qualification是没用的

  • eallow写了保护,没粘过来(抱歉)!你说的高速SPI口,不是可以通过HS_MODE = 0不使能高速SPI模式,我已经配置成不使用高速SPI模式!能不能说具体点为什么设置内部input qualification没有用。这个问题调了几天了,非常感谢。

  • NOTE: High-speed SPI and AUXCLKIN use a different signal path that does not support inversion or
    qualification. For more details on high-speed SPI pins, see Section 6.6.

    TRM的GPIO那一章有这句话,就是只要这四个GPIO mux成SPI就没有input qualification功能,不管你是不是禁止了HS _MODE

  • 那我需要使用这个gpio该怎么使用呢?
  • 你是要把这四个GPIO变成SPI还是只是GPIO功能?没有太明白你的意思

  • spi功能
  • 你可以用这四个GPIO作为SPI口用,但是和其他GPIO有区别的是,这四个是高速SPI口,所以只要你mux成SPI,和普通SPI口不同的是,gpio input qualification就会无效,但是SPI功能是正常的

  • 我遇到了相同的问题,请教一下后来怎么解决的?
  • 您好,我也遇到了SPI没有反应的问题,我用的是SPIB口,配置如下:

    GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPCPUD.bit.GPIO65 = 0; // Enable pull-up on GPIO18 (SPICLKA)
    GpioCtrlRegs.GPCPUD.bit.GPIO66 = 0; // Enable pull-up on GPIO19 (SPISTEA)

    GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3; // Asynch input GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPCQSEL1.bit.GPIO64 = 3; // Asynch input GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPCQSEL1.bit.GPIO65 = 3; // Asynch input GPIO18 (SPICLKA)
    GpioCtrlRegs.GPCQSEL1.bit.GPIO66 = 3; // Asynch input GPIO19 (SPISTEA)

    GpioCtrlRegs.GPBGMUX2.bit.GPIO63 = 3;
    GpioCtrlRegs.GPCGMUX1.bit.GPIO64 = 3;
    GpioCtrlRegs.GPCGMUX1.bit.GPIO65 = 3;
    GpioCtrlRegs.GPCGMUX1.bit.GPIO66 = 3;

    GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3;
    GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3;
    GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3;
    GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 3;

    发送数据是没有反应,使用命令职位SC端 GpioDataRegs.GPCCLEAR.bit.GPIO66 = 1,观察寄存器时发现也没有变化,目前还不知是怎么回事,非常感谢您的帮助。

  • 您好,我也遇到了相同的问题,不知您是否已经解决了

  • 我现在也遇到了相同的问题,我使用的CPU是28069,求教

  • 破案了

    要加一排寄存器的配置

    如下:

      EALLOW;
     /* Enable internal pull-up for the selected pins */
     // Pull-ups can be enabled or disabled by the user.
     // This will enable the pullups for the specified pins.
     // Comment out other unwanted lines.
         GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;   // Enable pull-up on GPIO16 (SPISIMOA)
     //  GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;    // Enable pull-up on GPIO5 (SPISIMOA)
         GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;   // Enable pull-up on GPIO17 (SPISOMIA)
     //  GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;    // Enable pull-up on GPIO3 (SPISOMIA)
         GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;   // Enable pull-up on GPIO18 (***)
         GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;   // Enable pull-up on GPIO19 (SPISTEA)
     /* Set qualification for selected pins to asynch only */
     // This will select asynch (no qualification) for the selected pins.
     // Comment out other unwanted lines.
         GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO16 (SPISIMOA)
     //  GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3;  // Asynch input GPIO5 (SPISIMOA)
         GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO17 (SPISOMIA)
     //  GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3;  // Asynch input GPIO3 (SPISOMIA)
         GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // Asynch input GPIO18 (***)
         GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // Asynch input GPIO19 (SPISTEA)
     /* Configure SPI-A pins using GPIO regs*/
     // This specifies which of the possible GPIO pins will be SPI functional pins.
     // Comment out other unwanted lines.
         GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
     //  GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 2;  // Configure GPIO5 as SPISIMOA
         GpioCtrlRegs.GPBGMUX2.bit.GPIO59= 3; // Configure GPIO17 as SPISOMIA
     //  GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2;  // Configure GPIO3 as SPISOMIA
         GpioCtrlRegs.GPBGMUX2.bit.GPIO60 =3; // Configure GPIO18 as ***
         GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA

         GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // Configure GPIO16 as SPISIMOA
     //  GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 2;  // Configure GPIO5 as SPISIMOA
         GpioCtrlRegs.GPBMUX2.bit.GPIO59= 3; // Configure GPIO17 as SPISOMIA
     //  GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2;  // Configure GPIO3 as SPISOMIA
         GpioCtrlRegs.GPBMUX2.bit.GPIO60 =3; // Configure GPIO18 as ***
         GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // Configure GPIO19 as SPISTEA

         EDIS;
    也就是要加这个GPBGMUX2的寄存器配置才能用。