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

📄 eeprom.c

📁 用5509烧写at25系列eeprom的程序
💻 C
字号:
/******************************************************************************/
/*  Copyright 2004 by SEED Electronic Technology LTD.                         */
/*  All rights reserved. SEED Electronic Technology LTD.                      */
/*  Restricted rights to use, duplicate or disclose this code are             */
/*  granted through contract.                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*----------------------------------------------------------------------------*/
/* DESCRIPTION:  															  */
/*   																		  */
/* This is an example for EERPOM of C5509										  */
/*----------------------------------------------------------------------------*/
/* MODULE NAME... SPI EEPROM write and read 										  */
/* FILENAME...... boot.c    												  */
/* DATE CREATED.. Mon 03/5/2004	    										  */
/* COMPONENT..... 															  */
/* PREREQUISITS.. 															  */
/*----------------------------------------------------------------------------*/
/* DESCRIPTION:																  */  
/*   																		  */
/* this example is that write the SPI EEPROM  		  */
/*----------------------------------------------------------------------------*/

#include <stdio.h>
#include <csl.h>
#include <csl_pll.h>
#include <csl_mcbsp.h>
#include <csl_gpio.h>
#include <csl_irq.h>
#include <csl_chip.h>

#define SPI_WRITE 	  0x02000000
#define SPI_READ  	  0x03000000
#define SPI_WRITE_EN  0x06
#define SPI_WRITE_DI  0x04
#define SPI_WRITE_REG 0x0100
#define SPI_READ_REG  0x0500


/*锁相环的设置*/
PLL_Config  myConfig      = {
  0,    //IAI: the PLL locks using the same process that was underway 
                //before the idle mode was entered
  1,    //IOB: If the PLL indicates a break in the phase lock, 
                //it switches to its bypass mode and restarts the PLL phase-locking 
                //sequence
  2,    //PLL multiply value; multiply 12 times
  0             //Divide by 2 PLL divide value; it can be either PLL divide value 
                //(when PLL is enabled), or Bypass-mode divide value
                //(PLL in bypass mode, if PLL multiply value is set to 1)
};


MCBSP_Handle hMcbsp;
Uint32 data_read[0x100] = {0};

Uint32 SPI_ReadSignal(Uint32 address);
void SPI_WrieSignal(Uint32 address,Uint32 data);
void SPI_Erase();

void main(void)
{
    Uint32 EEPROM_data = 0;
    Uint32 data=0;
    Uint32 i = 0;
    Uint32 EPROM_address = 0;
    FILE *fp;

    /* Initialize CSL library - This is REQUIRED !!! */
    /*初始化CSL库*/
    CSL_init();
    /*EMIF为全EMIF接口*/
    CHIP_RSET(XBSR,0x0a01);
	/*禁止所有中断*/
	IRQ_globalDisable(); 
    /*确定方向为输出*/
    GPIO_RSET(IODIR,0xFF);
	/*设置系统的运行速度为144MHz*/
    PLL_config(&myConfig);
  	
/* 	for(i = 600; i<700;i++)
  	{
  		SPI_WrieSignal(i,0xFF); 
  	} */
  	
  	
  	/*写入数据*/
  	fp=fopen("./input.dat","rb");
  	EPROM_address=0;
  	if(fp == NULL)exit(0);
  	for(i = 0; i<4384;i++)                   //3600为input.dat文件的字节数,根据实际情况修改
  	{
  		EEPROM_data=fgetc(fp);
  		if(EEPROM_data<58)
	  		{EEPROM_data=EEPROM_data-48;}
	  	else
	  		{EEPROM_data=EEPROM_data-55;}    //字符转换
  		
  		if((i/8)>1)                          //前16个字符不要
  		{
	  		if(((i%8)==2) || ((i%8)==3))	 //"0x"后的数有效
	  		{
		  		if((i%8)==2) {data=EEPROM_data<<4;}
		  		else
		  		{
			  		data=data+EEPROM_data;
			  		SPI_WrieSignal(EPROM_address,data);
			  		if(data != SPI_ReadSignal(EPROM_address))
			  			{
			  				exit(0);
			  			}
			  		EPROM_address++;
			  		data=0;
			  	}
		  	}
		  	if(((i%8)==4) || ((i%8)==5))
	  		{
		  		if((i%8)==4) {data=EEPROM_data<<4;}
		  		else
		  		{
			  		data=data+EEPROM_data;
			  		SPI_WrieSignal(EPROM_address,data);
			  		if(data != SPI_ReadSignal(EPROM_address))
			  			{
			  				exit(0);
			  			}
			  		EPROM_address++;
			  		data=0;
			  	}
		  	}
	  	}
  	}
  	fclose(fp);  
  	
  	/*读取数据*/
  	EPROM_address=0;
  	fp=fopen("./output.dat","w");
  	if(fp == NULL)exit(0);
  	for(i = 0; i<2416;)
  	{	
		EEPROM_data = SPI_ReadSignal(EPROM_address);
		fputc(EEPROM_data,fp);	
  		EPROM_address++;
  		i++;
  	} 
  	fclose(fp);
  	for(;;)
  	{puts("end");}    	   	    	   
}

/*********************************************************************************/
/*		EEPROM write enable and write disable  									 */
/*********************************************************************************/
/*两次操作之间的延时*/
void SPIEND_Delay()
{
	Uint32 j =0;
	for(j= 0;j<0x20;j++)
	{}
}
/*读写使能与禁止初始化,数据长度为8位*/
void SPI_writecominit(MCBSP_Handle hMcbsp)
{
   /****************************************************************/
   /* Place port in reset - setting XRST & RRST to 0               */
   /****************************************************************/
   /*进行发送复位*/
   MCBSP_FSETH(hMcbsp, SPCR2, XRST,0);
   /*进行接收复位*/
   MCBSP_FSETH(hMcbsp, SPCR1, RRST,0); 
   /*进行分频器复位*/
   MCBSP_FSETH(hMcbsp, SPCR2, GRST,0);
   /****************************************************************/
   /* Set values of all control registers                          */
   /****************************************************************/
   /*设置SPCR1寄存器,SPI时钟停止模式*/
   MCBSP_FSETH(hMcbsp, SPCR1,CLKSTP,0x3);
   /*设置XCR1寄存器,单数据相,发送数据长度为8位*/
   MCBSP_FSETH(hMcbsp, XCR1, XFRLEN1,0x0);
   MCBSP_FSETH(hMcbsp, RCR1, RFRLEN1,0x0);
   MCBSP_FSETH(hMcbsp, XCR1, XWDLEN1,0x0);
   MCBSP_FSETH(hMcbsp, RCR1, RWDLEN1,0x0);
   /*设置XCR2寄存器,发送数据延时一个位*/
   MCBSP_FSETH(hMcbsp, XCR2, XDATDLY,0x1);
   MCBSP_FSETH(hMcbsp, RCR2, RDATDLY,0x1);
   /*设置PCR寄存器,设置BLCK为输出,即MCBSP为Master;
   		            设置BFSX为输出,并且其极性为低有效
   		            设置CLKXP为高*/
   MCBSP_FSETH(hMcbsp, PCR,CLKXP, 0x0);
   MCBSP_FSETH(hMcbsp, PCR,CLKRP, 0x1);
   MCBSP_FSETH(hMcbsp, PCR,CLKXM, 0x1);
   MCBSP_FSETH(hMcbsp, PCR,FSXM, 0x1);
   MCBSP_FSETH(hMcbsp, PCR,FSXP, 0x1);
   /*设置SRGR2,确定时钟来源为内部的CPU

⌨️ 快捷键说明

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