搜索
bottom↓
回复: 4

ATEMGA128-16读写外部32KRAM-70NS的完整测试程序!!

[复制链接]

出0入0汤圆

发表于 2006-8-19 14:11:18 | 显示全部楼层 |阅读模式
地址分配

0X0000-0X10FF 内部4KRAM

0X1100-0X7FFF 外部32KRAM



系统频率16M ,BAUD=9600,下面对程序对0/1/2/2+1等待状态下,RAM进行测试,全部通过!!



//ICC-AVR application builder : 2006-8-14 16:03:08

// Target : M128

// Crystal: 16.000Mhz



//1.debug rs232

//



#include<iom128v.h>

#include<macros.h>

#include<stdio.h>

#include<string.h>



//MCU时钟频率

#define F_CPU   16000000

//默认的系统BAUD

#define baud    115200

      

#define MCUBAUD9600 1  



//declare memory mapped variables

#define txbuf1_head 0x1100

//外部RAM大小0X7FFF-0X1100=0X6EFF=28415byte



extern volatile unsigned char txbuf1[28415];



//define mappings

void mapping_init(void)

{



asm(

  ".area memory(abs)
"

  ".org 0x1100
"

  " _txbuf1:: .blkb 28415
"

  ".text
"

);



}

//定义外部RAM地址

#define ext_PORT1 ((volatile unsigned char *)0x1100)

//定义一个指针指向外部RAM首地址

unsigned char *p=(unsigned char *)ext_PORT1;

//RAM测试的读写数据

unsigned char testramtable[4]={0x00,0x55,0xaa,0x00};



void Delay(void)

{

}

void Delay1ms(void)

{         

unsigned int  i;



for(i=0;i<=(unsigned int)(16*143-2);i++);

}



void Delayxms(unsigned char ms)

{       

unsigned char i;



for(i=0;i<=ms;i++)Delay1ms();



}





//unsigned char  readram(unsigned int iaddr);

void port_init(void);

void watchdog_init(void);

void uart1_init(void);

//void writeram(unsigned int iaddr, unsigned char ctemp);

void RAM_TEST(unsigned char );

void test_net(void);

//void sendstring1(unsigned int * txbuf);

char char2hex(char t1)

{

if((t1>=00) &&(t1<=0x09))t1=t1+0x30;//'0'--'9'

else

{



if((t1>=0x0a)&&(t1<=0x0f))//'A'--'F'

t1=t1-0x0a+0x61;

}

return t1;

}



void sendinthex1(int c)

{

char temph=0,templ=0;

char t1=0,t2=0;



temph=c/256;

templ=c%256;



t1=(c/256)/16;

//t1=t1>>8;

UDR1 = char2hex(t1);

while(!(UCSR1A & 0x40));

UCSR1A |=0x40;



t1=(c/256)%16;

UDR1 = char2hex(t1);

while(!(UCSR1A & 0x40));

UCSR1A |=0x40;



t2=(c%256)/16;//templ&0xf0;

//t2=t2>>8;

UDR1 = char2hex(t2);

while(!(UCSR1A & 0x40));

UCSR1A |=0x40;



t2=(c%256)%16;//templ&0x0f;

UDR1 = char2hex(t2);

while(!(UCSR1A & 0x40));

UCSR1A |=0x40;



}



void sendchar1(char c) // 发送

{

UDR1 = c;

while(!(UCSR1A & 0x40));

UCSR1A |=0x40;

}



void sendint1( int c) // 发送

{

UDR1 = (c&0xff00)>>8;

while(!(UCSR1A & 0x40));

UCSR1A |=0x40;



UDR1 = c&0xff;

while(!(UCSR1A & 0x40));

UCSR1A |=0x40;





}





void sendstring1(unsigned char * txbuf) // 发送

{

unsigned int j;

for (j = 0; *txbuf; j++, txbuf++)sendchar1(*txbuf);

//for(;*txbuf!='/0';txbuf++)



}



void port_init(void)

{

//PA AD0-AD7  地址

//PC AD8-AD15

PORTA = 0xFF;

DDRA  = 0xFF;



PORTC = 0xFF; //m103 output only

DDRC  = 0x00;



//PB4 NETRST O



PORTB = 0xFF;

DDRB  = 0x10;



PORTD = 0xFF;

DDRD  = 0x00;

// PE0 RXD0

// PE1 TXD0

// PE4 NET_IRQ  i

// PE5 INFRA_IRQ  i

//

PORTE = 0xFF;

DDRE  = 0x00;



PORTF = 0xFF;

DDRF  = 0x00;



PORTG = 0x1F;

DDRG  = 0x00;

}



//Watchdog initialisation

// prescale: 2048K cycles

void watchdog_init(void)

{

WDR(); //this prevents a timout on enabling

//WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs

/* reset WDT */



/* Write logical one to WDTOE and WDE */

//WDTCR |= (1<<WDTOE) | (1<<WDE);

WDTCR=0X18;   //现在把WDTCH给关掉了

/* Turn off WDT */

WDTCR = 0x00;

//WDTCR=0X17;



}

//UART0 initialisation

// desired baud rate:115200

// actual baud rate:111111 (3.7%)

// char size: 8 bit

// parity: Disabled

/*

void uart0_init(void)

{

UCSR0B = 0x00; //disable while setting baud rate

UCSR0A = 0x00;

UCSR0C = 0x06;



// UBRRL = (fosc / 16 / (baud + 1)) % 256;

// UBRRH = (fosc / 16 / (baud + 1)) / 256;



UBRR0L = (F_CPU / 16 / (baud + 1)) % 256;//0x03;//0x08; //set baud rate lo

UBRR0H = (F_CPU / 16 / (baud + 1)) / 256;//0x00; //set baud rate hi

UCSR0B = 0x18;//0x98;

}

*/

//UART1 initialisation

// desired baud rate:115200

// actual baud rate:111111 (3.7%)

// char size: 8 bit

// parity: Disabled

void uart1_init(void)

{



#ifdef MCUBAUD9600

// UBRRL = (fosc / 16 / (baud + 1)) % 256;

// UBRRH = (fosc / 16 / (baud + 1)) / 256;

UCSR1B = 0x00; //disable while setting baud rate

UCSR1A = 0x00;

UCSR1C = 0x06;

UBRR1L = 0x67; //set baud rate lo

UBRR1H = 0x00; //set baud rate hi

UCSR1B = 0x18;

#else

//baud115200

UCSR1B = 0x00; //disable while setting baud rate

UCSR1A = 0x00;

UCSR1C = 0x06;

UBRR1L = (F_CPU / 16 / (baud + 1)) % 256;//0x03;//0x08; //set baud rate lo

UBRR1H = (F_CPU / 16 / (baud + 1)) / 256;//0x00; //set baud rate hi

UCSR1B = 0x18;//0x98;

#endif

}

/*

#pragma interrupt_handler int0_isr:2

void int0_isr(void)

{

//external interupt on INT0

}

*/





//call this routine to initialise all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

XDIV  = 0x00; //xtal divider

port_init();

  mapping_init();

watchdog_init();

uart1_init();



//External RAM will reside between 8000h - FFFFh.

//There will be 2 wait states for both read and write.



// MCUCR = 0x80;

//EICRA = 0x03; //extended ext ints

//EICRB = 0x00; //extended ext ints

//EIMSK = 0x01;

//TIMSK = 0x00; //timer interrupt sources

//ETIMSK = 0x00; //extended timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialised









}







//测试RTL8019AS

void test_net(void)

{



}



//

void RAM_TEST(unsigned char umode)

{

unsigned int k=0;

unsigned int i=0,j=0;

unsigned char DATA,u;

// unsigned char *p=(unsigned char *)ext_PORT1;

// unsigned char *pointer=p;



sendstring1("init system ok!
");

sendstring1("now test system-ram  all is 32k !
");

for(u=0;u<4;u++)

{

   

        sendstring1("----now write  ram  ");

        sendinthex1(testramtable);

        sendstring1("
");

       

        i=0;

        do

        {        if(!umode)*(p+i)=testramtable;//testok

                        else  txbuf1=testramtable;

                        i++;

        }while(i<0x6f00);//while(i<0x6eff);//while(i>0x6eff);

       

        sendstring1("----write ok
");

        sendstring1("----now check write
");

       

       

         k=0x1100;

                i=0;

                do

                {

                          if(!umode)DATA = *(p+i);//test ok

                          else          DATA=txbuf1;

                          if(DATA!=testramtable)

                          {sendstring1("addr = ");

                          sendinthex1(k);

                  //sendstring1(" =");

                  //sendinthex1(DATA);

                          sendstring1("
");

                          }

                  k++;i++;

                }while(k<0x8000);//while(k<0x1110);

                //0x7fff);

               

sendstring1("---- test system-ram  end!
");

}

}



void main(void)

{



init_devices();



sendstring1("RAMTEST START !
");

sendstring1("-----POINTER  READ AND WRITE EXTERNAL 32K RAM----------
");

sendstring1("0 READ AND WRITE NO WAIT  PC7 RELEASED !
");

MCUCR = 0x80; // 允许外部并行扩展接口,忽略高位0X8000的等待时间

XMCRA = 0x40; //0x00 external memory

XMCRB = 0x01; // 释放PC7,作为通用I/O引脚使用

DDRC =  0xff; // PC7用于输出,(不影响PC0-PC6地址线)

PORTC = 0x00; // PC7输出0,(不影响PC0-PC6地址线)

RAM_TEST(0);



sendstring1("1 READ AND WRITE 1 WAIT  PC7 RELEASED !
");

MCUCR = 0x80; // 允许外部并行扩展接口,忽略高位0X8000的等待时间

XMCRA = 0x44; //0x00 external memory

XMCRB = 0x01; // 释放PC7,作为通用I/O引脚使用

DDRC =  0xff; // PC7,PC6用于输出,(不影响PC0-PC5地址线)

PORTC = 0x00; // PC7,PC6输出0,(不影响PC0-PC5地址线)

RAM_TEST(0);





sendstring1("2 READ AND WRITE 2 WAIT  PC7 RELEASED !
");

MCUCR = 0x80; // 允许外部并行扩展接口,忽略高位0X8000的等待时间

XMCRA = 0x48; //0x00 external memory

XMCRB = 0x01; // 释放PC7,作为通用I/O引脚使用

DDRC =  0xff; // PC7,PC6用于输出,(不影响PC0-PC5地址线)

PORTC = 0x00; // PC7,PC6输出0,(不影响PC0-PC5地址线)

RAM_TEST(0);





sendstring1("3 READ AND WRITE 2+1 WAIT  PC7 RELEASED !
");

MCUCR = 0x80; // 允许外部并行扩展接口,忽略高位0X8000的等待时间

XMCRA = 0x4C; //0x00 external memory

XMCRB = 0x01; // 释放PC7,作为通用I/O引脚使用

DDRC =  0xff; // PC7,PC6用于输出,(不影响PC0-PC5地址线)

PORTC = 0x00; // PC7,PC6输出0,(不影响PC0-PC5地址线)

RAM_TEST(0);

sendstring1("******POINTER  READ AND WRITE EXTERNAL 32K RAM*******
");



sendstring1("
-----BUFFER READ AND WRITE EXTERNAL 32K RAM----------
");

sendstring1("4  READ AND WRITE  NOWAIT PC7  NO RELEASED !
");

MCUCR = 0x80; // 允许外部并行扩展接口,忽略高位0X8000的等待时间

XMCRA = 0x40; //external memory

RAM_TEST(1);



sendstring1("5  READ AND WRITE  1 WAIT PC7  NO RELEASED !
");

MCUCR = 0x80; // 允许外部并行扩展接口,忽略高位0X8000的等待时间

XMCRA = 0x44; //external memory

RAM_TEST(1);



sendstring1("6  READ AND WRITE  2WAIT PC7  NO RELEASED !
");

MCUCR = 0x80; // 允许外部并行扩展接口,忽略高位0X8000的等待时间

XMCRA = 0x48; //external memory

RAM_TEST(1);



sendstring1("7  READ AND WRITE  2+1WAIT PC7  NO RELEASED !
");

MCUCR = 0x80; // 允许外部并行扩展接口,忽略高位0X8000的等待时间

XMCRA = 0x4A; //external memory

RAM_TEST(1);

sendstring1("
*******BUFFER READ AND WRITE EXTERNAL 32K RAM***********
");



sendstring1("---- RAM TEST OK!-----
");



//while(1){}



// sendstring1("now test rtl8019as!
");

// test_net();

//sendstring1("----test rtl8019as end!
");



}

出0入0汤圆

 楼主| 发表于 2006-8-21 08:27:36 | 显示全部楼层




出0入0汤圆

 楼主| 发表于 2006-8-21 08:38:27 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2006-8-21 08:39:10 | 显示全部楼层

出0入0汤圆

发表于 2006-8-26 21:54:08 | 显示全部楼层
不错..

顶一下.



直接把地址给指针就行了.比51更方便.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-10 07:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表