|
我在网上买了一个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);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|