volatile unsigned long *spi_clkcon;
volatile unsigned long *spi_gpecon;
volatile unsigned long *spi_spsta0;
volatile unsigned long *spi_sppin0;
volatile unsigned long *spi_sppre0;
volatile unsigned long *spi_sptdat0;
volatile unsigned long *spi_sprdat0;
spi_clkcon = ioremap(0x4C00000C,4);
spi_gpecon = ioremap(0x56000040,4);
spi_spcon0 = ioremap(0x59000000,4);
spi_spsta0 = ioremap(0x59000004,4);
spi_sppin0= ioremap(0x59000008,4);
spi_sptdat0 =ioremap(0x59000010,4);
spi_sprdat0 =ioremap(0x59000014,4);
寄存器设置:
*spi_clkcon |= (1<<18);
*spi_spcon0=(0<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(0<<1)|(0<<0);
//polling,un-sck,slave,high,format A,nomal
*spi_sppin0=(0<<2)|(1<<1)|(0<<0);
//Multi Master error detect disable,reserved,release
*spi_gpecon=(*spi_gpecon&(~((3<<22)|(3<<24)|(3<<26)))) | (2<<22) | (2<<24) | (2<<26);
从机获取数据:
*spi_sptdat0=0xff;//往发送寄存器送数
while(!(*spi_spsta0&0x01));等待标志位置1
ADRXdata[0]= *spi_sprdat0;//从接受寄存器获取数据
在终端下看,主机发送数据正常。可主端启动spi后,从端发送标志位(spi_spsta0最低位)始终无法置1(while陷入死循环),也就无法接下来从接受寄存器获得数据。
这是什么原因呢?望高手指点! |