📄 dataflash.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 + -