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