TI中文支持网
TI专业的中文技术问题搜集分享网站

在lab05b中增加SPI通信功能

参照controlsuite中的例程,测试自循环模式下可以正常工作。

在此程序基础上,做了些修改。以实现SPI外部通信模式。

现需要将28069与FPGA通过SPI通信,读取数据。

SPI配置为主模式。28069需要连续发送两个字。

部分程序如下:

void spi_init()
{ SpibRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
// 复位,上升沿输出下降沿输入;自循环模式禁止
SpibRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
//SpibRegs.SPIBRR =0x0059; //1M
SpibRegs.SPIBRR =0x002c; //2M
//SpibRegs.SPICCR.all =0x009F; // Relinquish SPI from Reset 自循环模式
SpibRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset
SpibRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}

void spi_xmit(uint16_t a)
{
SpibRegs.SPITXBUF=a;
}

void spi_fifo_init(){
// Initialize SPI FIFO registers
SpibRegs.SPIFFTX.all=0xE040;
SpibRegs.SPIFFRX.all=0x2044;
SpibRegs.SPIFFCT.all=0x0;
}

while(!(gMotorVars.Flag_enableSys));

// Enable the Library internal PI. Iq is referenced by the speed PI now
CTRL_setFlag_enableSpeedCtrl(ctrlHandle, true);

// loop while the enable system flag is true
while(gMotorVars.Flag_enableSys)
{

// Transmit data
spi_xmit(sdata);
// Wait until data is received
while(SpibRegs.SPIFFRX.bit.RXFFST !=1) { }
// Check against sent data
rdata_1 = SpibRegs.SPIRXBUF;
//for(delay=0;delay<500;delay++);
spi_xmit(0x000f);
// Wait until data is received
while(SpibRegs.SPIFFRX.bit.RXFFST !=1) { }
// Check against sent data
rdata_2 = SpibRegs.SPIRXBUF;
for(delay=0;delay<500;delay++);

示波器抓到的波形如下,分别为CLK和CS信号。

这里希望在发送两个字的过程中,CS一直保持低电平。

不会像图中CS信号在发送完一个字后,有一个高电平的跳变。

这里该如何实现。

谢谢

Young Hu:

您好,可以采用三线制的SPI,将CS用GPIO替代,发送前拉低GPIO,发送后再拉高GPIO。

参照controlsuite中的例程,测试自循环模式下可以正常工作。

在此程序基础上,做了些修改。以实现SPI外部通信模式。

现需要将28069与FPGA通过SPI通信,读取数据。

SPI配置为主模式。28069需要连续发送两个字。

部分程序如下:

void spi_init()
{ SpibRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
// 复位,上升沿输出下降沿输入;自循环模式禁止
SpibRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
//SpibRegs.SPIBRR =0x0059; //1M
SpibRegs.SPIBRR =0x002c; //2M
//SpibRegs.SPICCR.all =0x009F; // Relinquish SPI from Reset 自循环模式
SpibRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset
SpibRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}

void spi_xmit(uint16_t a)
{
SpibRegs.SPITXBUF=a;
}

void spi_fifo_init(){
// Initialize SPI FIFO registers
SpibRegs.SPIFFTX.all=0xE040;
SpibRegs.SPIFFRX.all=0x2044;
SpibRegs.SPIFFCT.all=0x0;
}

while(!(gMotorVars.Flag_enableSys));

// Enable the Library internal PI. Iq is referenced by the speed PI now
CTRL_setFlag_enableSpeedCtrl(ctrlHandle, true);

// loop while the enable system flag is true
while(gMotorVars.Flag_enableSys)
{

// Transmit data
spi_xmit(sdata);
// Wait until data is received
while(SpibRegs.SPIFFRX.bit.RXFFST !=1) { }
// Check against sent data
rdata_1 = SpibRegs.SPIRXBUF;
//for(delay=0;delay<500;delay++);
spi_xmit(0x000f);
// Wait until data is received
while(SpibRegs.SPIFFRX.bit.RXFFST !=1) { }
// Check against sent data
rdata_2 = SpibRegs.SPIRXBUF;
for(delay=0;delay<500;delay++);

示波器抓到的波形如下,分别为CLK和CS信号。

这里希望在发送两个字的过程中,CS一直保持低电平。

不会像图中CS信号在发送完一个字后,有一个高电平的跳变。

这里该如何实现。

谢谢

ming chen3:

回复 Young Hu:

手册中的FIFO模式,是不是就是用来解决这个问题的?

赞(0)
未经允许不得转载:TI中文支持网 » 在lab05b中增加SPI通信功能
分享到: 更多 (0)