问题: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 (SPICLKA)
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 (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
SPI配置
SpiaRegs.SPICCR.all =0x004F; //CLKPOLARITY=1,16bit
SpiaRegs.SPICTL.all =0x0006; //CLK_PHASE=0,master
SpiaRegs.SPIBRR.all =0x001F;
SpiaRegs.SPICCR.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);
}
}
Jason Wu4:
GPIO16 GPIO17 GPIO18 GPIO19关于SPI的配置屏蔽了么?
Smith John2:
回复 Jason Wu4:
我使用修改后是屏蔽了的。能不能看出来哪里有问题。
囧:
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是没用的
Smith John2:
回复 囧:
eallow写了保护,没粘过来(抱歉)!你说的高速SPI口,不是可以通过HS_MODE = 0不使能高速SPI模式,我已经配置成不使用高速SPI模式!能不能说具体点为什么设置内部input qualification没有用。这个问题调了几天了,非常感谢。
囧:
回复 Smith John2:
NOTE: High-speed SPI and AUXCLKIN use a different signal path that does not support inversion orqualification. For more details on high-speed SPI pins, see Section 6.6.
TRM的GPIO那一章有这句话,就是只要这四个GPIO mux成SPI就没有input qualification功能,不管你是不是禁止了HS _MODE
Smith John2:
回复 囧:
那我需要使用这个gpio该怎么使用呢?
囧:
回复 Smith John2:
你是要把这四个GPIO变成SPI还是只是GPIO功能?没有太明白你的意思
Smith John2:
回复 囧:
spi功能
囧:
回复 Smith John2:
你可以用这四个GPIO作为SPI口用,但是和其他GPIO有区别的是,这四个是高速SPI口,所以只要你mux成SPI,和普通SPI口不同的是,gpio input qualification就会无效,但是SPI功能是正常的
wenlin zhou:
我遇到了相同的问题,请教一下后来怎么解决的?