📄 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 <csl.h>
#include <stdio.h>
#include <csl_pll.h>
#include <csl_mcbsp.h>
#include <csl_gpio.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include"boot_dat.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
8, //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[0x3a2] = {0};
Uint32 eeprom_data[0x1bf] = {0};
Uint32 SPI_ReadSignal(Uint32 address);
void SPI_WrieSignal(Uint32 address,Uint32 data);
void main(void)
{
// Uint32 EEPROM_data = 0;
Uint32 i = 0;
Uint32 j = 0;
Uint32 n = 0;
Uint32 EPROM_address = 0;
/* 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 = 0; i<0x1bf;)
{
/*测试时,将数据写完后,断电后,重新上电打开CCS
将此行注释掉,直接读取数据,观察是否正确*/
eeprom_data[n+1]=flash_data[i] & 0xff;
eeprom_data[n]=((flash_data[i]>>8) & 0xff);
SPI_WrieSignal(EPROM_address, eeprom_data[n]);
if(i != (eeprom_data[n] & 0xFF))
{
for(j=0;j<20;j++){}
}
EPROM_address++;
SPI_WrieSignal(EPROM_address, eeprom_data[n+1]);
if(i != (eeprom_data[n+1] & 0xff))
{
for(j=0;j<20;j++){}
}
EPROM_address++;
n=n+2;
i++;
}
/* for(n=0;n<0x3a2;n++)
{
//读回写入的数据
EEPROM_data = SPI_ReadSignal(EPROM_address);
//保存读取的数据
data_read[n] = EEPROM_data;
EPROM_address++;
} */
for(j=0;j<=20;j++)
{}
}
/*********************************************************************************/
/* EEPROM write enable and write disable */
/*********************************************************************************/
/*两次操作之间的延时*/
void SPIEND_Delay()
{
Uint32 j =0;
for(j= 0;j<0x200;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 + -