用过enc28j60的大神希望能来给我一些帮助。
第一次使用以太网模块ENC28J60,现在遇到了一些困惑的问题。我的主控芯片是PIC24FJ128GA010,外接ENC28J60的小模块,自己用杜邦线连接的,手动模拟SPI。
spi.c是自己写的,代码如下,感觉应该没有什么问题。
#include <p24FJ128GA010.h>
#include "uipbuff.h"
#include "enc28j60.h"
#include "spi.h"
void WriteByte(u8_t temp){
_TRISG3=0;
_TRISG1=0;
u8_t i;
for(i=0;i<8;i++){
SCKN=0; delay_us(500);
SI = temp & 0x80;
SCKN=1; delay_us(500);
temp <<=1;
}
SCKN=0;
}
u8_t ReadByte(void){
_TRISG3=0;
_TRISF1=1;
u8_t i,dat1;
SCKN=0;dat1=0;
for(i=0;i<8;i++){
SCKN=1; delay_us(500);
dat1 <<=1;
if(SO==1) dat1++;
SCKN=0; delay_us(500);
}
return dat1;
}
enc28j60的初始化读写寄存器缓冲区等等都是挪用网上通用的enc28j60.c 文件。部分预处理都自己根据自己的实际情况做了相应的修正了。编译也没有报错,程序也能下的进去,但是问题是这样的,
初始化完成后,用enc28j60Read(ECON1);读取ECON1寄存器数值再用LCD显示出来是0xFA。再尝试读取其他寄存器都是0xFA.我很不解,如果spi时序出问题应该读出0x00或者ff吧,为何会出现0xFA,我尝试不初始化,什么都不做直接读取,读出来就是0x00。
甚至我强制写入enc28j60Write(ECON1,0x11);后再读取还是读出来0xFA.
void main() {
_TRISA14=0; //Set CS I/O Mode
lcd_init();
enc28j60_init();
u8_t test1;
enc28j60Write(ECON1,0x11);
test1=enc28j60Read(ECON1);
write_u8lcd(test1);
while(1);
}
|