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