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

📄 dataflash.c

📁 这个是基于ARM7的相关驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        spiBuffer[0] = DF_OP_B2R;
    }
    else if (bufferSEL == DF_OP_B2W)
    {
        spiBuffer[0] = DF_OP_B1R;
    }
    spiBuffer[1] = 0;
    spiBuffer[2] = 0;       //addr MSB=0x00 -Max
    spiBuffer[3] = 0;       //addr LSB=0x00
    spiBuffer[4] = 0;       //Additional dummy
    spiBuffer[5] = 0;       //need this dummy?-datasheet not illuminate -Max
    
    IO0CLR |= 0x00000001 << DF_FLASH_CS;

    for (i = 0; i < 5; i++)
    {
        S0PDR = spiBuffer[i];
        while (!(S0PSR & 0x80));
    }
    
    for (i = 0; i < DF_PAGE_SIZE; i++)
    {
        S0PDR = spiBuffer[5];
        while (!(S0PSR & 0x80));
        *returnData++ = S0PDR;
    }
    
    IO0SET |= 0x00000001 << DF_FLASH_CS;
}

/*	
*******************************************************************************
* 函数功能: EEDATA单字节编程
* 说 明: 
*       1.  采用main memory page to buffer x transfer命令实现FLASH回读.
*       2.  采用main memory page program through buffer x命令实现编程.
*       3.  注意判断bufferSEL,防止与FPGA下载冲突.
*******************************************************************************
*/
void df_writeDF_EEData (INT16U page_addr, INT16U byte_addr, INT8U data)
{
    INT8U spiBuffer[10], i;
    union {
        INT8U byte[2];
        INT16U word;
    } temp[2];
    
    // 等待DataFlash有效
    while (!(IO0PIN & (0x00000001 << 24)));
    
    // main memory page to buffer x transfer命令
    df_mmpToBuffer (page_addr);
    
    // 等待DataFlash有效
    while (!(IO0PIN & (0x00000001 << 24)));
    
    // main memory page program through buffer x命令
    if (bufferSEL == DF_OP_B1W)         //FPGA下载准备使用buffer1,则操作EEDATA使用buffer2
    {
        spiBuffer[0] = DF_OP_MMPB2;
    }
    else if (bufferSEL == DF_OP_B2W)
    {
        spiBuffer[0] = DF_OP_MMPB1;
    }
    
    #ifdef _AT45DB081B      //Max 20060425
    temp[0].word = page_addr << 1; 
    #endif
    
    #ifdef _AT45DB321D
    temp[0].word = page_addr << 2; 
    #endif 

    temp[1].word = byte_addr;
    spiBuffer[1] = temp[0].byte[HIGH_ORDER];
    spiBuffer[2] = temp[0].byte[LOW_ORDER] | temp[1].byte[HIGH_ORDER];
    spiBuffer[3] = temp[1].byte[LOW_ORDER];
    spiBuffer[4] = data;
    
    IO0CLR |= 0x00000001 << DF_FLASH_CS;

    for (i = 0; i < 5; i++)
    {
        S0PDR = spiBuffer[i];
        while (!(S0PSR & 0x80));
    }
    
    IO0SET |= 0x00000001 << DF_FLASH_CS;
}

/*	
*******************************************************************************
* 函数功能: EEPROM数据单字节读取
* 说 明: 
*       1.  输入:
            page_addr--EEPROM数据字节绝对页地址.
            byte_addr--EEPROM数据字节绝对字节地址.
            输出:
            EEPROM数据字节.
            
*       2.  基本方法:
            a)等待FLASH有效,发送"main memory page to buffer x transfer"命令把相
            应页的内容拷贝到BUFFER中;
            b)等待FLASH有效,发送"buffer x read"命令读取BUFFER中的相应字节.
            
*       3.  注意:
*******************************************************************************
*/
INT8U df_readDF_EEData (INT16U page_addr, INT16U byte_addr)
{
    INT8U spiBuffer[10], i;
    union {
        INT8U byte[2];
        INT16U word;
    } temp;
    
    // 等待DataFlash有效
    while (!(IO0PIN & (0x00000001 << 24)));
    
    // a)
    df_mmpToBuffer (page_addr);
    
    // 等待DataFlash有效
    while (!(IO0PIN & (0x00000001 << 24)));
    
    // b)
    if (bufferSEL == DF_OP_B1W)             //FPGA下载准备使用buffer1,则使用buffer2
    {
        spiBuffer[0] = DF_OP_B2R;
    }
    else if (bufferSEL == DF_OP_B2W)
    {
        spiBuffer[0] = DF_OP_B1R;
    }
    spiBuffer[1] = 0;
    temp.word = byte_addr;
    spiBuffer[2] = temp.byte[HIGH_ORDER];   //for AT45DB081/AT45DB161B is all ok -Max
    spiBuffer[3] = temp.byte[LOW_ORDER];
    spiBuffer[4] = 0;       //Additional dummy
    spiBuffer[5] = 0;       //need this dummy?-datasheet not illuminate -Max
    
    IO0CLR |= 0x00000001 << DF_FLASH_CS;

    for (i = 0; i < 6; i++)
    {
        S0PDR = spiBuffer[i];
        while (!(S0PSR & 0x80));
    }
    i = S0PDR;
    
    IO0SET |= 0x00000001 << DF_FLASH_CS;
    
    return (i);
}


/*	
*******************************************************************************
* 函数功能: 读取FLASH PAGE到BUFFER
* 说 明: 
*       1.  采用main memory page to buffer x transfer命令实现FLASH回读.
*       2.  注意判断bufferSEL,防止与FPGA下载冲突.
*******************************************************************************
*/
void df_mmpToBuffer (INT16U page_addr)
{
    INT8U spiBuffer[10], i;
    union {
        INT8U byte[2];
        INT16U word;
    } temp;
    
    // main memory page to buffer x transfer命令
    if (bufferSEL == DF_OP_B1W)         //FPGA下载准备使用buffer1,则操作EEDATA使用buffer2
    {
        spiBuffer[0] = DF_OP_MMPB2_T;
    }
    else if (bufferSEL == DF_OP_B2W)
    {
        spiBuffer[0] = DF_OP_MMPB1_T;
    }

    #ifdef _AT45DB081B      //Max 20060425
    temp.word = page_addr << 1;  
    #endif
    
    #ifdef _AT45DB321D    
    temp.word = page_addr << 2;
    #endif 
    
//    temp.word = page_addr << 1;
    spiBuffer[1] = temp.byte[HIGH_ORDER];
    spiBuffer[2] = temp.byte[LOW_ORDER];
    spiBuffer[3] = 0;
    
    IO0CLR |= 0x00000001 << DF_FLASH_CS;

    for (i = 0; i < 4; i++)
    {
        S0PDR = spiBuffer[i];
        while (!(S0PSR & 0x80));
    }
    
    IO0SET |= 0x00000001 << DF_FLASH_CS;
} 



/*******************************************************
//函数功能:实现从flashdata里读出相应页的数据。
*通过 main memery page read 命今。
*输入:存储数据的地址指针,所要读的页码page_addr
*输出:   无
*******************************************************
*/


INT8U  df_page_read( INT8U *returnData,INT16U page_addr)
{
    INT8U spiBuffer[10];
	INT16U i;
   	INT8U *p ;
    union {
        INT8U byte[2];
        INT16U word;
    } temp;
     
    temp.word=page_addr<<2;
   
    p = returnData ;
    
    while (!(IO0PIN & (0x00000001 << DF_FLASH_RD)));    // 等待DataFlash有效
    
 /*                                              //读取dataflash的状态寄存器,并判断是否为闲。
    do
      {
      spiBuffer[0] = DF_OP_SRR;
       IO0CLR |= 0x00000001 << DF_FLASH_CS;
       S0PDR = spiBuffer[0];
       while (!(S0PSR & 0x80));                //等待传输完成
       status=S0PDR;
       IO0SET |= 0x00000001 << DF_FLASH_CS;
       status>>=7;
     }
     while(status==0);
  */      
                                              // 传送读整页命令
    spiBuffer[0] = DF_OP_MMPR;
    spiBuffer[1] = temp.byte[HIGH_ORDER];
    spiBuffer[2] = temp.byte[LOW_ORDER];       
    spiBuffer[3] = 0;                         //addr MSB=0x00
    spiBuffer[4] = 0;                         //Additional dummy
    spiBuffer[5] = 0;                         //need this dummy?-datasheet not illuminate -Max
    spiBuffer[6] = 0;
    spiBuffer[7] = 0;
	
    IO0CLR |= 0x00000001 << DF_FLASH_CS;

    for ( i=0;i<8;i++)
    {
        S0PDR = spiBuffer[i];
        while (!(S0PSR & 0x80));
    }
 //     *p++ = S0PDR;                  //传到所指定的存储单元
    for (i = 0; i < DF_PAGE_SIZE; i++)
    {
        S0PDR = spiBuffer[5];
        while (!(S0PSR & 0x80));
	 spiBuffer[4] = S0PDR ;
        *p++ = S0PDR;
    }
		
    IO0SET |= 0x00000001 << DF_FLASH_CS;
    return 0;
} 

⌨️ 快捷键说明

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