ATmega16都DM9000c的ID
我在网上买了一个DM9000c的网络通信模块,想用ATmega16先来读下DM9000c的ID,可是老读不出来.代码是参考网店老板给的代码,具体的代码如下:
#include<iom16v.h>
#include<macros.h>
#define PWRST_SET (PORTA=PORTA | 0x01) //复位端口 PA0
#define CS_SET (PORTA=PORTA | 0x02) //片选端口 PA1
#define CMD_SET (PORTA=PORTA | 0x04) //数据/命令 PA2
#define IOW_SET (PORTA=PORTA | 0x08) //写数据 PA3
#define IOR_SET (PORTA=PORTA | 0x10) //读数据 PA4
#define PWRST_CLR (PORTA=PORTA & 0xFE) //复位端口 PA0
#define CS_CLR (PORTA=PORTA & 0xFD) //片选端口 PA1
#define CMD_CLR (PORTA=PORTA & 0xFB) //数据/命令 PA2
#define IOW_CLR (PORTA=PORTA & 0xF7) //写数据 PA3
#define IOR_CLR (PORTA=PORTA & 0xEF) //读数据 PA4
void mdelay (int m)
{
int i;
for (;m > 0; m--)
for (i = 0; i < 1000; i++);
}
void port_init(void) //ATmega16引脚的初始化
{
DDRA=0xff; // 设置PA为输出,初始为高电平
PORTA=0xff;
DDRB=0xff; // 设置PB为输出,初始为高电平
PORTB=0xff;
DDRC=0xff; // 设置PC为输出,初始为高电平
PORTC=0xff;
DDRD=0xff; // 设置PD为输出,初始为高电平
PORTD=0xff;
}
void dm9000_write (unsigned char reg, unsigned char date)
{
DDRD=0xff;
PORTD = reg;
CS_CLR;
CMD_CLR;
IOR_SET;
IOW_CLR;
mdelay(1);
CS_SET;
IOW_SET;
mdelay(2);
DDRD=0xff;
PORTD = date;
CS_CLR;
CMD_SET;
IOR_SET;
IOW_CLR;
mdelay(1);
CS_SET;
IOW_SET;
}
unsigned char dm9000_read (unsigned char reg)
{
unsigned char date = 0;
DDRD=0xff;
PORTD = reg;
CS_CLR;
CMD_CLR;
IOR_SET;
IOW_CLR;
CS_SET;
IOW_SET;
DDRD=0x00;
PORTD = 0xff;
CS_CLR;
CMD_SET;
IOW_SET;
IOR_CLR;
date = PORTD;
PORTD = date;
CS_SET;
IOR_SET;
return date;
}
void main (void)
{
unsigned int date = 0;
port_init();
PORTB=0x00;
PWRST_CLR;
mdelay(5000);
PWRST_SET;
mdelay(5000);
PWRST_CLR;
mdelay(5000);
PWRST_SET;
mdelay(5000);
PORTB=0xff;
mdelay(5000);
date = dm9000_read (0x28);
if (date == 0x46)
date = dm9000_read (0x29);
else
while(1);
if (date == 0x0A)
date = dm9000_read (0x2A);
else
while(1);
if (date == 0x00)
date = dm9000_read (0x2B);
else
while (1);
if (date == 0x90)
{
PORTB=0x00;
while(1);
}
else
while (1);
} 感觉可能是读写时序上的问题,可是不知道怎么改,有哪位知道吗?
找找DM9000c datasheet 先好好研读一下 有看过了!上面读写时序是ns级的,不知道有11.05926兆的晶振是否可以。
那一条指令的时间都超过80ns了 我用的是11.05926的晶振,网上有人讲是可以的。请问楼上的知道怎么改吗?
页:
[1]