⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read_flash.c

📁 dsp 5509a 存储器测试, SDRAM 测试程序,12Mx16=192/2=96Msdram 时钟
💻 C
字号:
#include  <std.h>
#include <string.h>
#include <stdio.h>
#include "read_flashcfg.h"

#define GPIO_DIR           (*(ioport volatile unsigned *)0x3400)
                         //General-purpose I/O Direction Register
#define GPIO_DATA          (*(ioport volatile unsigned *)0x3401)
                         //General-purpose I/O Data Registerint i = 0;


// DEVICE ID (CODE)
//1F = ATMEL Co.
// AT25F512A 0x1F65
// AT25F1024A 0x1F60
// AT25F2048A 0x1F63
// AT25F4096A 0x1F64
// AT25FS010  0x1F66


// McBSP clock = 48M/200(0xc7+1)=0.24M is very low
//  25F1024   10,000 cycle  20M clock
//  25P1024  100,000 cycle  5V=2.1M clock   2.7-5V =1M clock  
// input clock frequency is 48M
// McBSP  clock 48M/(CLKGDV+1) CLKGDV=SRGR1.bit[7..0]
// Internal FSR=FSX
// Internal CLKR=CLKX
// Clock stop mode is disable
// DX delay enable off
// RINTM = 00
// RSYNCERR = 0 no err
// RFULL = 0    No receiver-full condition
// RRDY =0  Receiver not ready
// RRST =0  if you read a 0, the receiver is in its reset state
          // if you write a 0, you reset the receiver
// FREE = 0 ; The McBSP transmit and receive clocks are affected as detemined by SOFT bit
// SOFT =0 ; Hard stop. The McBSP transmit and receive clocks are stopped immediately
// XRDY =0 ; Transmitter not ready
// RFRLEN1 =7  (RPHASE=0 single-phase frame)   7+1=8 words = frame Length
// RWDLEN1=RWDLEN2=000b	= 8bits
// RFIG =1 ; Frame-sync ignore.
// RDATDLY = 01b ; 1-bit data delay 
// GSYNC =0; No clock synchronization
// CLKSP =1;  A rising edge on the CLKS pin
// SCLKME=0, CLKSM=1;   McBSP internal input clock
// XIOEN =0; CLKX FSX DX CLKS  are serial port pins
// RIOEN =0; CLKR FSR DR CLKS  are serial port pins
// CLKSSTAT =0; The signal on the CLKS is low
// DXSTAT =0; Drive the signal on the DX pin low
// DRSTAT =0; The signal on the DR pin is low
// FSXP =1; Transmit frame-sync pulses are active low
// FSRP =0; Receive frame-sync pulses are active high
// CLKXP=0; Transmit data is driven on the rising edge CLKX
// CLKRP=1; 
//


// main clock  12Mx16=192M

interrupt void MCBSP_rec(); //spi  intertupt serve of receive
void read_SPI();
void read_SPI_ID();

int mcbsp_init();


unsigned long addr=0;
unsigned char rev_end=0;
unsigned long display=0;
int i;
//int dathan[1024];
unsigned long source_offset=1;
unsigned int direct_offset=0;

Uint16 old_intm;
Uint16 rcvEventId, xmtEventId;




/*-----------------------------------------------------------------*/
Uint16 MCBSP_read8(MCBSP_Handle _MCBSP) {
  Uint16 val;
  MCBSP_ASSERT_HANDLE(_MCBSP,return 0xFFFFFFFF);
  val = _PREG_GET(((MCBSP_PrivateObj*)_MCBSP)->Drr1Addr);
  return (val & 0x00ff);
}
/*-----------------------------------------------------------------*/
void MCBSP_write8(MCBSP_Handle _MCBSP,Uint16 Val) {
MCBSP_ASSERT_HANDLE(_MCBSP,return);
_PREG_SET((((MCBSP_PrivateObj*)_MCBSP)->Dxr1Addr),(Val & 0xff));
}




main()
{  	
 	int ioport * EBCR;   
 //   unsigned int data; 

	EBCR=(int *)0x6c00;
	*EBCR=0x01;

        GPIO_DIR  = 0x0018;    //GPIO4 gpio3 Direction: output
        GPIO_DATA = 0x0018;    //GPIO4 gpio3 high
   
   // GPIO3  # GPIO4 = 1   condition 

   // data = GPIO_DATA;


    

	IRQ_globalEnable();
	mcbsp_init(); 


	display=0;
	asm("\tBCLR XF");  //   L1 on for D5509 

 	read_SPI_ID();

	asm("\tBSET XF");  //   L1 off for D5509 






/*  	for(;rev_end==0;)
    {


    	read_SPI(display);
    	display+=4;//读地址加,函数每次读出4个地址的数据,所以每调用一次地址加4
   	
   	
   	}
   	//读取的数据存放在SDRAM中,读完后在关闭中断开始整理数据,
   	//将两个字节合成一个字存放到DA的RAM中
   	//SPI读取的第一个数据为无效数据,所以下面处理取数从地址1开始而不是地址0
   	for(source_offset=1;source_offset<=131071;)//131071
     	{
   		*(int *)(0x200000+direct_offset)=(*(int *)(0x020000+source_offset)<<8)|\
   		                                   (*(int *)(0x020000+source_offset+1));
   		direct_offset++;
   		source_offset=source_offset+2;   		
   	}*/
        asm("\tBSET XF");   // L1 off
   	exit(0);
   	
}


int mcbsp_init()
{
	old_intm = IRQ_globalDisable();
    rcvEventId = MCBSP_getRcvEventId(hMcbsp0);
    IRQ_clear(rcvEventId);            
	IRQ_disable(rcvEventId);          
	IRQ_globalRestore(old_intm);
    MCBSP_start(hMcbsp0,
              MCBSP_XMIT_START | MCBSP_RCV_START |
              MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
                0x300u);
   MCBSP_ASSERT_HANDLE(hMcbsp0,return 11); 
   return 1;

}


void read_SPI_ID()//从FLASH读数据函数,每次读取4个数据,FLASH控制总线为SPI模式

{
  unsigned int data;
  unsigned  short int  ManCode, DeviceID;

        data = GPIO_DATA;
        data |= 0x0010;    //GPIO4=high, SPI no select   select sdram
        GPIO_DATA = data;
   
        data = GPIO_DATA;
        data &= 0xFfEf;    //GPIO4=LOW, SPI select
        GPIO_DATA = data;

		while (!MCBSP_xrdy(hMcbsp0));
		IRQ_disable(rcvEventId);

	    MCBSP_write8(hMcbsp0, 0x15);   //RDID
		
  	 	while (!MCBSP_xrdy(hMcbsp0));	
  	 	MCBSP_write8(hMcbsp0, 0x0);  
    

  	    while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, 0x0);  
	 	
  	    while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, 0x0);  


  	    while (!MCBSP_rrdy(hMcbsp0));
        ManCode=MCBSP_read8(hMcbsp0);  // this data is zero

 

		while (!MCBSP_xrdy(hMcbsp0));
	    MCBSP_write8(hMcbsp0, 0x15);   
		
  	 	while (!MCBSP_xrdy(hMcbsp0));	
  	 	MCBSP_write8(hMcbsp0, 0x0);  
   
  	    while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, 0x0);  
	 	
  	    while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, 0x0);  


  	    while (!MCBSP_rrdy(hMcbsp0));
        ManCode=MCBSP_read8(hMcbsp0);// this is Manufacture Code  0x1F=Atmel Co.



		while (!MCBSP_xrdy(hMcbsp0));
	    MCBSP_write8(hMcbsp0, 0x15);// RDID   
		
  	 	while (!MCBSP_xrdy(hMcbsp0));	
  	 	MCBSP_write8(hMcbsp0, 0x0);     
  	    while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, 0x0);  
	 	
  	    while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, 0x0);  

  	    while (!MCBSP_rrdy(hMcbsp0));
        DeviceID=MCBSP_read8(hMcbsp0);  //This is Device ID  AT25f1024A=0x60


        data = GPIO_DATA;
        data |= 0x0010;    //GPIO4=high, SPI no select   select sdram
        GPIO_DATA = data;


    *(int *)(0x200000) = ManCode * 0x100+DeviceID;  
    //  Manufacture and DeviceID put into SDRAM address=0x200000 


//		IRQ_enable(rcvEventId);
	 	
}



void read_SPI(RD_ADD)//从FLASH读数据函数,每次读取4个数据,FLASH控制总线为SPI模式
	unsigned long RD_ADD;
{
  unsigned int data; 
        data = GPIO_DATA;
        data &= 0xFfEf;    //GPIO4=LOW, SPI select
        GPIO_DATA = data;
   asm("\tBSET XF");
		while (!MCBSP_xrdy(hMcbsp0));
		IRQ_disable(rcvEventId);

	    MCBSP_write8(hMcbsp0, 0x15);// 0x03 read data;  0x15 RDID   
		
  	 	while (!MCBSP_xrdy(hMcbsp0));	
  	 	MCBSP_write8(hMcbsp0, RD_ADD>>16);  // high 8 bits address
    
  	    while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, RD_ADD>>8);  // middle 8 bits	 address
	 	
	 	while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, RD_ADD);    // low 8 bits address
	
	 	
    //    data = GPIO_DATA;
    //    data |= 0x0010;    //GPIO4=high, SPI select
    //    GPIO_DATA = data;	
    //    GPIO_DATA = data;
            		
	 	while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, 0x0);	   //first 8bits data

	 	while (!MCBSP_xrdy(hMcbsp0));  
	 	//IRQ_enable(rcvEventId);
	 	MCBSP_write8(hMcbsp0, 0x0);  // second 8bits data
	  	while (!MCBSP_xrdy(hMcbsp0));
	 	MCBSP_write8(hMcbsp0, 0x0);  // third 8bits data
	 	while (!MCBSP_xrdy(hMcbsp0)); 	
	 	MCBSP_write8(hMcbsp0, 0x0);  // forth 8bits data
	 	
        data = GPIO_DATA;
        data |= 0x0010;    //GPIO4=high, SPI no select   select sdram
        GPIO_DATA = data;


		IRQ_enable(rcvEventId);
	 	

}

//SPI接收中断函数
interrupt void MCBSP_rec()
{	
	
    *(int *)(0x020000+addr)=MCBSP_read8(hMcbsp0);
   	addr++;
   	if(addr==131071) // 131071
   	{
        asm("\tBSET XF");   // L1 off

		rev_end = 1;
		IRQ_disable(rcvEventId); 

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -