|
最近到手一块板子,上面有ADM6993 加华邦的W78LE58(51),没事干就写了下SMI管理口的程序,发现读地址1的数不对,只有1,3地址是不为0的,其他读出来的都是0,6993是3口以太网芯片,愿意帮我的话网上可以下一下资料看,在帮我看看程序谢谢。如果那位写过这个程序那就奉献一下参考一下也非常感谢。
它这个接口类似于I2C,只是帧结构不一样而已。
=>regad=0x01:rdata=0x3C4D1954:
=>[H:00111100:01001101:00011001:01010100:L]..地址1打出来得值
=>regad=0x03:rdata=0x00011F00:
=>[H:00000000:00000001:00011111:00000000:L]..地址3打出来得值
=>regad=0x04:rdata=0x00000000:
=>[H:00000000:00000000:00000000:00000000:L]..从地址4以后打出来的值都是0
=>regad=0x0D:rdata=0x00000000:
=>[H:00000000:00000000:00000000:00000000:L]
而且也写不进去,下面上一下我的读写程序。那位用过这个芯片的大哥指教指教看看。万分感谢。
//****************************************
EX. <35”1”s><01><01><00000><00100><10><001 0000000 000001 0001000001000000>帧结构
long unsigned int SMI_read(uint ad)//ADM6993 SMI read
{
uchar a,d;long unsigned int recdata;
SDC=1;
SDIO=1;
delay(50);
for(a=0;a<35;a++){
SDC=0;
delay(20);
SDIO=1;
SDC=1;
delay(20);
}
SDC=0;
delay(20);
//start.2
SDIO=0;//.0
SDC=1;
delay(20);
SDC=0;
delay(20);
SDIO=1;//.1
SDC=1;
delay(20);
SDC=0;
delay(20);
//Opcode(read[10]).2
SDIO=1;//.1
SDC=1;
delay(20);
SDC=0;
delay(20);
SDIO=0;//.0
SDC=1;
delay(20);
SDC=0;
delay(20);
/*
//unused.3
SDIO=0;//.0
delay(20);
SDC=1;
delay(20);
SDC=0;
SDIO=0;//.0
SDC=1;
SDC=0;
SDIO=0;//.0
SDC=1;
SDC=0;*/
//eeprom ad.6
ad=ad<<6;
for(a=0;a<10;a++)
{
if(ad&0x8000)SDIO=1;
else SDIO=0;
delay(20);
SDC=1;
ad=(ad<<1);
delay(20);
SDC=0;
}
//EX. <35”1”s><01><01><00000><00100><10><001 0000000 000001 0001000001000000>
//TA.2
delay(50);
SDIO=0;//.0
delay(20);
SDC=1;
delay(20);
SDC=0;
//delay(20);
SDIO=0;//.1
delay(20);
SDC=1;
delay(20);
SDC=0;
delay(20);
//Register Data .32(16bit CMD&resdata)
for(a=0;a<32;a++)
{
SDC=1;
delay(20);
d=SDIO;
recdata=(recdata<<1)|d;
SDC=0;
delay(20);
}
/*for(a=0;a<16;a++)
{
SDC=1;
delay(20);
d=SDIO;
recdata=(recdata<<1)|d;
SDC=0;
delay(20);
}*/
return recdata;
SDC=0;//释放总线
SDIO=1;
}
//****************************************
EX. <35”1”s><01><01><00000><00100><10><001 0000000 000001 0001000001000000>帧结构
void SMI_write(uint ad,long unsigned int wridata)//ADM6993 SMI write
{
uchar a;
SDC=1;
SDIO=1;
delay(50);
for(a=0;a<35;a++){
SDC=0;
delay(20);
SDIO=1;
SDC=1;
delay(20);
}
SDC=0;
//start.2
SDIO=0;//.0
delay(20);
SDC=1;
delay(20);
SDC=0;
SDIO=1;//.1
delay(20);
SDC=1;
delay(20);
SDC=0;
//Opcode(write[01]).2
SDIO=0;//.1
delay(20);
SDC=1;
delay(20);
SDC=0;
SDIO=1;//.0
delay(20);
SDC=1;
delay(20);
SDC=0;
delay(20);
/*
//unused.3
SDIO=0;//.0
delay(20);
SDC=1;
delay(20);
SDC=0;
SDIO=0;//.0
SDC=1;
SDC=0;
SDIO=0;//.0
SDC=1;
SDC=0;*/
//eeprom ad.6
ad=ad<<6;
for(a=0;a<10;a++)
{
if(ad&0x8000)SDIO=1;
else SDIO=0;
delay(20);
SDC=1;
ad=(ad<<1);
delay(20);
SDC=0;
}
//EX. <35”1”s><01><01><00000><00100><10><001 0000000 000001 0001000001000000>
//TA.2
delay(50);
SDIO=1;//.1
delay(20);
SDC=1;
delay(20);
SDC=0;
//delay(20);
SDIO=0;//.0
delay(20);
SDC=1;
delay(20);
SDC=0;
delay(20);
//Register Data .32(16bit CMD&resdata)
for(a=0;a<32;a++)
{
if(wridata&0x80000000)SDIO=1;
else SDIO=0;
wridata=(wridata<<1);
delay(20);
SDC=1;
delay(20);
SDC=0;
}
/*for(a=0;a<16;a++)
{
if(wridata&0x80000000)SDIO=1;
else SDIO=0;
wridata=(wridata<<1);
delay(20);
SDC=1;
delay(20);
SDC=0;
}*/
//return recdata;
SDC=0;//释放总线
SDIO=1;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|