我在做nRF24E1和LPC2210通过SPI接口通信的实验。nRF24E1的SPI只能用作主SPI,所以LPC2210的SPI选作从模式。<br />nRF24E1的SPI通信的格式为:当把数据写入SPI_DATA寄存器时,数据的高位(MSB)先移出。原文是这样描述的:The 8 bits of SPI_DATA register are clock out on SDO with msb first.Simultaneously 8 bits from SDI are clocked into SPI_DATA register.时钟是高有效,原文描述为:Output data is shifted on negedge SCK,and input data is read on posedge SCK.<br />因此,我对LPC2210的S1PCR寄存器的配置如下:<br />S1PCR = (0 << 7)| //SPIE 禁能<br /> (0 << 6)| // LSBF MSB First<br /> (0 << 5)| //MSTR 从模式<br /> (0 << 4)| // CPOL SCK高有效<br /> (0 << 3); // CPHA 数据在SCK的第一个时钟沿采样。传输从SSEL信号激活时开始,并在SSEL信号无效时结束。<br />SPI1引脚配置如下:<br />PINSEL1 = (PINSEL1 & ~0x3fc) | 0x2a8; // 配置SPI1引脚<br />主SPI(nRF24E1)的读写函数没有问题,因为一直用它配置RF前端的。函数如下:<br />unsigned char SpiReadWrite(uint8 b)<br />{/*exif.5 internal spi module send or received 8bits,and is ready for a new command ,must be clear by software*/<br /> EXIF &= ~0x20; // Clear SPI interrupt, 1101 1111<br /> SPI_DATA = b; // Move byte to send to SPI data register<br /> while((EXIF & 0x20) == 0x00); /* Wait until SPI hs finished transmitting, when exif.5=0*/<br /> return SPI_DATA;<br />}<br />从机SPI(LPC2210)的读写函数如下:<br />void SendData (uint8 data)<br />{<br /> uint8 rValue1,rValue2;<br /> S1PDR = data;<br /> while(0 ==(S1PSR&0x80)); //等待SPIF置位,即等待数据发送完毕<br /> rValue1 = S1PSR; //以下两个语句是为了让SPIF清零<br /> rValue2 = S1PDR;<br />}<br />char RcvData(void)<br />{<br /> uint8 rValue1,rValue2;<br /> while(0 == (S1PSR&0x80));<br /> rValue1 = S1PSR;<br /> rValue2 = S1PDR;<br /> return (rValue2);<br />}<br />现在的问题是:1.从机SPI要向主机发送数据,从机先通过中断通知主机,主机响应中断后转入主SpiReadWrite()函数。可以看到主SPI接收到了从机发送的数据是正确的,但是从机接收到的数据却是不定的。SPI操作是移位操作,主机SPI接收到从机的数据的同时,从机也应该接收到主机的发送的数据,是不是这样的?要是这样,为什么从机接收到的不正确呢?<br />2.倘若我不管现在从SPI接收到的数据是否正确,第二步,我要用从SPI接收数据,即用RcvData()函数接收数据。可以看到主SPI确实发送数据了,而且可以保证主SPI在进入SpiReadWrite()函数之前,从SPI已经进入RcvData()函数,正在等待接收,即执行while(0 == (S1PSR&0x80));,而程序却死掉了。<br />我实验了好多方法,也没有成功,不知道问题出现在那里,如果有必要的话,我可以把全部程序都上载上来。<br />希望周工能帮忙,谢谢!!! |
|