参照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模式,是不是就是用来解决这个问题的?