最近在调试PIC24FJ256GB106与ENC28J60的SPI通讯时,发现一个莫名其妙的问题,百思不得其解。从改以太网芯片上确实采用了SPI的模式0的方式,PIC单片机用的是查询模式来操作SPI。以下为SPI3的初始化代码
void spi3_init(void)
{
SPI3STATbits.SPIEN = 0 ;
SPI3_CS=1;
TRISBbits.TRISB2=0; //cs select for output i/o
IFS5bits.SPI3IF = 0; // clear interrupt flag
IEC5bits.SPI3IE = 0; // disable interrupt
SPI3CON1 = 0x013f; // select mode
SPI3CON2 =0;
SPI3STAT = 0x8000; // enable the peripheral
SPI3STATbits.SPIEN = 1 ;
} // SPI3 init
//-----------------------------------------------------------------------------------------
UI8_T spi3_read_write_byte(UI8_T transmit)
{
UI8_T data;
SPI3BUF=transmit;
//while(!SPI3STATbits.SPIRBF);
while ((SPI3STATbits.SPITBF == 0) || (SPI3STATbits.SPIRBF == 1));
data= SPI3BUF;
return data;
}
//------------------------------------------------------------------------------------------
在使用 spi3_read_write_byte函数对ENC28J60的EIE寄存器写入0xAA,且发出读回命令时,分别抓取SPI3的DO,DI的数据波形均正确,但是SPI3BUF的寄存器读到得数据一致为零。
CH1: SPI3的clock
CH2:SPI3的DO
CH1: SPI3的clock
CH2:SPI3的DI
从上面的波形上看,数据是正确送出,且正确返回到了DI但是就是数据拿不回来,确实令人费解。
用户1362017 2014-10-8 12:55
用户377235 2014-8-22 22:25
请问这个问题解决了吗?可否告知一下解决方法。我也遇到一样的问题了。谢谢。