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

📄 dataflash.c

📁 一些linux和uboot的学习笔记
💻 C
字号:
#include "AT91SAM9261.h"#define MCK_SPI		(198656000/2)/* SPI CLOCK */#define AT91C_SPI_CLK 		 33000000/* AC characteristics *//* DLYBS = tCSS= 250ns min and DLYBCT = tCSH = 250ns */#define DATAFLASH_TCSS		(0xf << 16)	/* 250ns min (tCSS) <=> 12/48000000 = 250ns */#define DATAFLASH_TCHS		(0x0<< 24)	/* 250ns min (tCSH) <=> (64*1+SCBR)/(2*48000000) */#define START_ADDR 0x23f00000/***dataflash cmd**//* READ COMMANDS */#define DB_CONTINUOUS_ARRAY_READ   	0xE8		/* Continuous array read */#define DB_BURST_ARRAY_READ        	0xE8		/* Burst array read */#define DB_PAGE_READ               	0xD2		/* Main memory page read */#define DB_BUF1_READ               	0xD4		/* Buffer 1 read */#define DB_BUF2_READ               	0xD6		/* Buffer 2 read */#define DB_STATUS                  	0xD7		/* Status Register *//* PROGRAM and ERASE COMMANDS */#define DB_BUF1_WRITE              	0x84		/* Buffer 1 write */#define DB_BUF2_WRITE              	0x87		/* Buffer 2 write */#define DB_BUF1_PAGE_ERASE_PGM     	0x83		/* Buffer 1 to main memory page program with built-In erase */#define DB_BUF1_PAGE_ERASE_FASTPGM 	0x93		/* Buffer 1 to main memory page program with built-In erase, Fast program */#define DB_BUF2_PAGE_ERASE_PGM     	0x86		/* Buffer 2 to main memory page program with built-In erase */#define DB_BUF2_PAGE_ERASE_FASTPGM 	0x96		/* Buffer 1 to main memory page program with built-In erase, Fast program */#define DB_BUF1_PAGE_PGM           	0x88		/* Buffer 1 to main memory page program without built-In erase */#define DB_BUF1_PAGE_FASTPGM       	0x98		/* Buffer 1 to main memory page program without built-In erase, Fast program*/#define DB_BUF2_PAGE_PGM           	0x89		/* Buffer 2 to main memory page program without built-In erase */#define DB_BUF2_PAGE_FASTPGM       	0x99		/* Buffer 1 to main memory page program without built-In erase, Fast program*/#define DB_PAGE_ERASE              	0x81		/* Page Erase */#define DB_BLOCK_ERASE             	0x50		/* Block Erase */#define DB_PAGE_PGM_BUF1           	0x82		/* Main memory page through buffer 1 */#define DB_PAGE_FASTPGM_BUF1       	0x92		/* Main memory page through buffer 1, Fast program */#define DB_PAGE_PGM_BUF2           	0x85		/* Main memory page through buffer 2 */#define DB_PAGE_FastPGM_BUF2       	0x95		/* Main memory page through buffer 2, Fast program *//* ADDITIONAL COMMANDS */#define DB_PAGE_2_BUF1_TRF         	0x53		/* Main memory page to buffer 1 transfert */#define DB_PAGE_2_BUF2_TRF         	0x55		/* Main memory page to buffer 2 transfert */#define DB_PAGE_2_BUF1_CMP         	0x60		/* Main memory page to buffer 1 compare */#define DB_PAGE_2_BUF2_CMP          0x61		/* Main memory page to buffer 2 compare */#define DB_AUTO_PAGE_PGM_BUF1      	0x58		/* Auto page rewrite throught buffer 1 */#define DB_AUTO_PAGE_PGM_BUF2      	0x59		/* Auto page rewrite throught buffer 2 */void spi_rx_init();extern void UartSendst( char *pt);extern void UartSend(char data);int head = 0;char  data[100];int counter = 0; char* rec_data= 0;int read_df_id(){     AT91PS_SPI pSPI0 = AT91C_BASE_SPI0 ;      unsigned int flag = 0;	       int send_data[2] ; 	       send_data[0] = (0x9f 		  |0x00    );      send_data[1] = 0;      pSPI0 -> SPI_PTCR = AT91C_PDC_RXTDIS;      pSPI0 -> SPI_RPR = (unsigned int )send_data;      pSPI0 -> SPI_RCR = 5;      pSPI0 -> SPI_PTCR = AT91C_PDC_TXTDIS;      pSPI0 -> SPI_TPR = (unsigned int )rec_data;      pSPI0 -> SPI_TCR = 5;      pSPI0 -> SPI_PTCR = AT91C_PDC_RXTEN;      pSPI0 -> SPI_PTCR |= AT91C_PDC_TXTEN;      while( !(flag & AT91C_SPI_RXBUFF) )      {	    flag = pSPI0 ->SPI_SR;        }      return rec_data[0]; 		        }int spi_send_test(){     AT91PS_SPI pSPI0 = AT91C_BASE_SPI0 ;     char read = 0;     int i = 0;     unsigned int flag = 0;     int addr = 0; //    for(i = 0; i<5; i++)     {	              pSPI0 ->  SPI_TDR = (0x0<<16)|0x9f;         while( !(flag  & AT91C_SPI_TDRE) )	 {	     flag = pSPI0 -> SPI_SR;	 }	//  AT91C_BASE_SPI0 -> SPI_MR &= ~AT91C_SPI_MSTR;        /* read = (char)pSPI0 -> SPI_RDR;         UartSendst( &read );*/     }     for(i=0;i<10000;i++)     {	     asm("nop");     }     for(i=0; i<3; i++)     {  	// pSPI0 -> SPI_MR |= AT91C_SPI_MSTR;	             pSPI0 ->  SPI_TDR =(0x0<<16)|0X00;         while( !(flag  & AT91C_SPI_TDRE) )         {	     flag = pSPI0 -> SPI_SR;         }	//  AT91C_BASE_SPI0 -> SPI_MR &= ~AT91C_SPI_MSTR;     }	      for(i=0;i<10000;i++)     {	     asm("nop");     }      pSPI0 ->  SPI_TDR =  AT91C_SPI_LASTXFER |(0x0<<16)|0X00;      while( !(flag  & AT91C_SPI_TDRE) )         {	     flag = pSPI0 -> SPI_SR;         }	     //for(i=0; i<4; i++)       {  	 //pSPI0 -> SPI_MR |= AT91C_SPI_MSTR;	             pSPI0 ->  SPI_TDR =(0x0<<16)|0X00d7;         while( !(flag  & AT91C_SPI_TDRE) )         {	     flag = pSPI0 -> SPI_SR;         }     }	     for(i=0;i<10000;i++)     {	     asm("nop");     }//     for(i=0; i<1; i++)       {  	 //pSPI0 -> SPI_MR |= AT91C_SPI_MSTR;	             pSPI0 ->  SPI_TDR =  AT91C_SPI_LASTXFER |(0x0<<16)|0X00;         while( !(flag  & AT91C_SPI_TDRE) )         {	     flag = pSPI0 -> SPI_SR;         }     }	      for(i=0;i<10000;i++)     {	     asm("nop");     }          addr = (0x8000/528)<<10 | 0x8000%528;     rec_data =(char *)START_ADDR;      pSPI0 -> SPI_TDR = 0xe8;     while( !(flag  & AT91C_SPI_TDRE) )     {	     flag = pSPI0 -> SPI_SR;     }          pSPI0 -> SPI_TDR = (addr & 0x00ff0000)>>16;     while( !(flag  & AT91C_SPI_TDRE) )     {	     flag = pSPI0 -> SPI_SR;     }     pSPI0 -> SPI_TDR = (addr & 0x0000ff00)>>8;     while( !(flag  & AT91C_SPI_TDRE) )     {	     flag = pSPI0 -> SPI_SR;     }     pSPI0 -> SPI_TDR = (addr & 0x000000ff);     while( !(flag  & AT91C_SPI_TDRE) )     {	     flag = pSPI0 -> SPI_SR;     }     for(i=0; i<4; i++)     {         pSPI0 ->  SPI_TDR =(0x0<<16)|0X00;         while( !(flag  & AT91C_SPI_TDRE) )         {             flag = pSPI0 -> SPI_SR;         }     }     for(i=0;i<0x7ffff;i++)     {         pSPI0 ->  SPI_TDR =(0x0<<16)|0X00;         while( !(flag  & AT91C_SPI_TDRE) )         {             flag = pSPI0 -> SPI_SR;         }     }     pSPI0 ->  SPI_TDR =  AT91C_SPI_LASTXFER |(0x0<<16)|0X00;     while( !(flag  & AT91C_SPI_TDRE) )     {         flag = pSPI0 -> SPI_SR;     }     return 0;     }void spi_rx_int(){     int flag = 0;     flag = AT91C_BASE_SPI0->SPI_SR;               if(flag & AT91C_SPI_RDRF)     {         if(head < 14)	 {               data[head++] = (char)( (AT91C_BASE_SPI0->SPI_RDR) & 0XFF);	 }         else	 {	                //    UartSendst("\n");               //    UartSend(data);               *rec_data =  (char)( (AT91C_BASE_SPI0->SPI_RDR) & 0XFF);	        rec_data++;		counter++;         }      }       if(flag & AT91C_SPI_OVRES  )     {	  UartSendst("over RDR!!!\n");     }      if(flag & AT91C_SPI_TDRE )     {      //    AT91C_BASE_SPI0 -> SPI_MR &= ~AT91C_SPI_MSTR;	           }	     }int dataflash_init(){      AT91PS_SPI pSPI0 = AT91C_BASE_SPI0 ;      unsigned int dataflash_io = 0;      unsigned int swap_val = 0;      int dataflash_status = 0;      int i = 0;	      char read = 0;            dataflash_io = (AT91C_PA0_SPI0_MISO 		       |AT91C_PA1_SPI0_MOSI	               |AT91C_PA2_SPI0_SPCK 	               |AT91C_PA3_SPI0_NPCS0 	               );     AT91C_BASE_PIOA -> PIO_ASR = dataflash_io;     AT91C_BASE_PIOA -> PIO_BSR = 0;     AT91C_BASE_PIOA -> PIO_PDR = dataflash_io;     AT91C_BASE_PMC -> PMC_PCER =  1 << AT91C_ID_SPI0;       pSPI0 -> SPI_CR = AT91C_SPI_SWRST;     pSPI0 -> SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PCS | AT91C_SPI_PS_VARIABLE | AT91C_SPI_PCSDEC/* |AT91C_SPI_LLB*/  ;     pSPI0 -> SPI_CSR[0] = (AT91C_SPI_NCPHA | /*AT91C_SPI_CPOL  |*/ AT91C_SPI_CSAAT | (AT91C_SPI_DLYBS & DATAFLASH_TCSS) | (AT91C_SPI_DLYBCT & DATAFLASH_TCHS) | (3 << 8));     swap_val = pSPI0 -> SPI_MR;      swap_val &= 0xfff0ffff ;     swap_val |= 0X0<<16;     pSPI0 -> SPI_MR = swap_val;      spi_rx_init();     pSPI0 -> SPI_CR = AT91C_SPI_SPIEN   ;     counter = 0;      for(i=0; i<100; i++)     {         data[i] = 33;	          }     spi_send_test();     UartSendst("output data !\n");     for(i=0; i<16; i++)     {           UartSend(data[i]);     }     read = counter & 0xff;	     UartSend( read );     read = (counter>>8) & 0xff;     UartSend( read);     read = (counter>>16) & 0xff;     UartSend( read );     read = (counter>>24) & 0xff;     UartSend( read);     rec_data = (char *)START_ADDR;     for(i=0; i<50; i++)     {           UartSend(rec_data[i]);     }	      //    pSPI0 -> SPI_CSR[0] =  (AT91C_SPI_NCPHA |  AT91C_SPI_CSAAT |  (AT91C_SPI_DLYBS & DATAFLASH_TCSS) | (AT91C_SPI_DLYBCT & DATAFLASH_TCHS) | (3 << 8));     AT91C_BASE_AIC->AIC_IDCR = 0x1 << AT91C_ID_SPI0;//     dataflash_status = read_df_id();     UartSendst("now run the file!good luck!\n");	     asm("ldr pc, =0x23f00000");     return dataflash_status ;}void spi_rx_init(){    AT91PS_AIC pAic = AT91C_BASE_AIC;	    unsigned int mask ;    int irq_id = AT91C_ID_SPI0;    mask = 0x1 << irq_id ;    pAic->AIC_IDCR = mask;    pAic->AIC_SMR[irq_id] = ((6&0xf)<<4|(7 & 0x7) );    pAic->AIC_SVR[irq_id] = (unsigned int) spi_rx_int;    pAic->AIC_ICCR = mask ;     pAic->AIC_IECR = 0x1 << irq_id ;        AT91F_SPI_EnableIt(AT91C_BASE_SPI0,AT91C_SPI_RDRF | AT91C_SPI_OVRES /*|AT91C_SPI_MODF|AT91C_SPI_TDRE*/) ;}

⌨️ 快捷键说明

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