原理图见附件,
程序如下:
void main(void)
{
Uint16 sdata; // send data
Uint16 rdata; // received data
.................
spi_fifo_init(); // Initialize the Spi FIFO
spi_init(); // init SPI
// Step 5. User specific code:
// Interrupts are not used in this example.
sdata = 0x0000;
for(;;)
{
spi_xmit(sdata); // 传送数据
DELAY_US(5000);
// 等待直到接收到数据
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { } //监测RXFFST=1表示有接收数据
rdata = SpiaRegs.SPIRXBUF; //但是rdata 总是为0,执行此步后,RXFFST被清0
sdata++;
}
}
void spi_init()
{
SpiaRegs.SPICCR.all =0x0F; //0000 1111 禁用SPI环路,上升沿, 16位字符长度
SpiaRegs.SPICTL.all =0x07; //0000 0111 主控制,使能数据发送,中断使能
SpiaRegs.SPIBRR =100;
SpiaRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
SpiaRegs.SPICCR.bit.CLKPOLARITY=1; //CLK下降沿将输入数据锁存
// SpiaRegs.SPICCR.bit.CLKPOLARITY=0; //CLK上升沿将输入数据锁存
SpiaRegs.SPICTL.bit.CLK_PHASE=0; //无延时
//SpiaRegs.SPICTL.bit.CLK_PHASE=1; //延迟半个周期
}
void spi_xmit(Uint16 a)
{
SpiaRegs.SPITXBUF=a;
}
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x2044;
SpiaRegs.SPIFFCT.all=0x0;
}
此原理图还有一部分连接HC595和数码管,发送到数码管的数据可以正常显示,但是键盘输入却无法接收,监测
RXFFST=1,而且也会产生接收RXFFINT=1,但接收的数据rdata 总是为0,如果打开SPI环路返回,可正常接收数据;
关闭环路就接收为0,边沿和相位也相互调换过,还是不行,请高手指教,多谢!
SPI-165.rar
(16.4 KB)
|