aisiyi 发表于 2012-11-19 10:51:53

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);
                       
}

aisiyi 发表于 2012-11-19 10:53:58

感觉可能是读写时序上的问题,可是不知道怎么改,有哪位知道吗?

NemoGu 发表于 2012-11-19 10:59:06

找找DM9000c datasheet 先好好研读一下

aisiyi 发表于 2012-11-19 11:01:37

有看过了!上面读写时序是ns级的,不知道有11.05926兆的晶振是否可以。

NemoGu 发表于 2012-11-19 11:23:50

那一条指令的时间都超过80ns了

aisiyi 发表于 2012-11-19 14:37:15

我用的是11.05926的晶振,网上有人讲是可以的。请问楼上的知道怎么改吗?
页: [1]
查看完整版本: ATmega16都DM9000c的ID