TI中文支持网
TI专业的中文技术问题搜集分享网站

28377中利用内部SPI操作外部的EEPROM

我想通过28377d内部的SPI协议操作外部挂载的eeprom(SST25VF010),主要是有两个主要的函数,读某个地址的数据和向某个地址写数据

下面是我写的函数:

#include "F28x_Project.h" // Device Headerfile and Examples Include File
//EEPROM的po-code定义
#define WREN 0x06
#define WRITE 0x02
#define READ 0x03
#define RDSR 0x05
#define EEPROM_CS GpioDataRegs.GPADAT.bit.GPIO19

//相关函数的声明
void spi_init(void);
void spi_xmit(int a);

//发送与结束的变量
Uint16 Ret_var1=0;

/*****************************************SPI初始化函数********************************************************/
void spi_init(void)
{
//选用00模式
SpiaRegs.SPICCR.all=0x0008; //SPI复位,设置时钟为上升沿,8位字符长度
SpiaRegs.SPICTL.all=0x0002; // 使能主模式,标准相位
// 使能Talk,SPIINT屏蔽
SpiaRegs.SPIBRR.all =0x007F; //设置波特率
SpiaRegs.SPICCR.all=0x0098; //使SPI退出复位状态
//使能自测试模式
SpiaRegs.SPIPRI.bit.FREE = 1;
SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI
}

/*****************************************EEPROM的写函数*******************************************************/
void EEPROM_WRITE(Uint16 address,int Data)
{
int addrH,addrL;
addrH = 0;
addrL = 0;
addrH = (address>>8);
addrL = (address&0x00FF);

EEPROM_CS = 0;
DELAY_US(1);
spi_xmit(WREN); //写使能

EEPROM_CS = 1;
DELAY_US(1);
EEPROM_CS = 0;
DELAY_US(1);
spi_xmit(WRITE); //写入WRITE命令
spi_xmit(addrH); //写入高字节地址
spi_xmit(addrL); //写入低字节地址
spi_xmit(Data);

DELAY_US(1);
EEPROM_CS = 1;
DELAY_US(10);
}

/********************************************发送数据函数*******************************************/
void spi_xmit(int a) //0x05
{
SpiaRegs.SPITXBUF = a;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0){}
}

/*******************************************读EEPROM函数*******************************************/
void EEPROM_READ(Uint16 address)
{
int addrH,addrL;
addrH = 0;
addrL = 0;

addrH = (address>>8);
addrL = (address&0x00FF);

EEPROM_CS = 1;
DELAY_US(1);
EEPROM_CS = 0;
spi_xmit(READ);
spi_xmit(addrH);
spi_xmit(addrL);
spi_xmit(0);
DELAY_US(1);
EEPROM_CS = 1;

}

/**********************************************读取状态寄存器函数*************************************/
void STA_READ()
{
EEPROM_CS = 0;
DELAY_US(1);
spi_xmit(RDSR);
EEPROM_CS = 1;
DELAY_US(100);
}
/**********************************************开启FIFO函数*************************************/
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x2044;
SpiaRegs.SPIFFCT.all=0x0;
}
/************************************************主函数********************************************/
void main()
{
InitSysCtrl();
InitPieCtrl();
DINT;

IER=0x0000;
IFR=0x0000;
InitPieVectTable();
InitSpiaGpio();
spi_fifo_init();
spi_init();
STA_READ();
EEPROM_WRITE(0x0101,0x00AA);

while(1);

//DELAY_US(100);
//EEPROM_READ(0x0101);
}

程序不会在某个地址里面写数据,老是卡在 while(SpiaRegs.SPISTS.bit.INT_FLAG == 0){}

按道理说发送完数据或接受数据完后INT_FLAG会自动为1啊  ,那么现在哪里的问题呢?

Victor Zheng:

您好

SpiaRegs.SPIFFTX.all=0xE040  你用了FIFO但是你没有打开TXFFIENA。所以收不到TX FIFO Interrupt Flag和SpiaRegs.SPISTS.bit.INT_FLAG。请参考数据手册再看一下。

我想通过28377d内部的SPI协议操作外部挂载的eeprom(SST25VF010),主要是有两个主要的函数,读某个地址的数据和向某个地址写数据

下面是我写的函数:

#include "F28x_Project.h" // Device Headerfile and Examples Include File
//EEPROM的po-code定义
#define WREN 0x06
#define WRITE 0x02
#define READ 0x03
#define RDSR 0x05
#define EEPROM_CS GpioDataRegs.GPADAT.bit.GPIO19

//相关函数的声明
void spi_init(void);
void spi_xmit(int a);

//发送与结束的变量
Uint16 Ret_var1=0;

/*****************************************SPI初始化函数********************************************************/
void spi_init(void)
{
//选用00模式
SpiaRegs.SPICCR.all=0x0008; //SPI复位,设置时钟为上升沿,8位字符长度
SpiaRegs.SPICTL.all=0x0002; // 使能主模式,标准相位
// 使能Talk,SPIINT屏蔽
SpiaRegs.SPIBRR.all =0x007F; //设置波特率
SpiaRegs.SPICCR.all=0x0098; //使SPI退出复位状态
//使能自测试模式
SpiaRegs.SPIPRI.bit.FREE = 1;
SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI
}

/*****************************************EEPROM的写函数*******************************************************/
void EEPROM_WRITE(Uint16 address,int Data)
{
int addrH,addrL;
addrH = 0;
addrL = 0;
addrH = (address>>8);
addrL = (address&0x00FF);

EEPROM_CS = 0;
DELAY_US(1);
spi_xmit(WREN); //写使能

EEPROM_CS = 1;
DELAY_US(1);
EEPROM_CS = 0;
DELAY_US(1);
spi_xmit(WRITE); //写入WRITE命令
spi_xmit(addrH); //写入高字节地址
spi_xmit(addrL); //写入低字节地址
spi_xmit(Data);

DELAY_US(1);
EEPROM_CS = 1;
DELAY_US(10);
}

/********************************************发送数据函数*******************************************/
void spi_xmit(int a) //0x05
{
SpiaRegs.SPITXBUF = a;
while(SpiaRegs.SPISTS.bit.INT_FLAG == 0){}
}

/*******************************************读EEPROM函数*******************************************/
void EEPROM_READ(Uint16 address)
{
int addrH,addrL;
addrH = 0;
addrL = 0;

addrH = (address>>8);
addrL = (address&0x00FF);

EEPROM_CS = 1;
DELAY_US(1);
EEPROM_CS = 0;
spi_xmit(READ);
spi_xmit(addrH);
spi_xmit(addrL);
spi_xmit(0);
DELAY_US(1);
EEPROM_CS = 1;

}

/**********************************************读取状态寄存器函数*************************************/
void STA_READ()
{
EEPROM_CS = 0;
DELAY_US(1);
spi_xmit(RDSR);
EEPROM_CS = 1;
DELAY_US(100);
}
/**********************************************开启FIFO函数*************************************/
void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x2044;
SpiaRegs.SPIFFCT.all=0x0;
}
/************************************************主函数********************************************/
void main()
{
InitSysCtrl();
InitPieCtrl();
DINT;

IER=0x0000;
IFR=0x0000;
InitPieVectTable();
InitSpiaGpio();
spi_fifo_init();
spi_init();
STA_READ();
EEPROM_WRITE(0x0101,0x00AA);

while(1);

//DELAY_US(100);
//EEPROM_READ(0x0101);
}

程序不会在某个地址里面写数据,老是卡在 while(SpiaRegs.SPISTS.bit.INT_FLAG == 0){}

按道理说发送完数据或接受数据完后INT_FLAG会自动为1啊  ,那么现在哪里的问题呢?

user3989448:

void spi_xmit(int a)

{

SpiaRegs.SPITXBUF = a << 8 ;

while(SpiaRegs.SPISTS.bit.INT_FLAG == 0){}

}

SpiaRegs.SPITXBUF是左对齐

赞(0)
未经允许不得转载:TI中文支持网 » 28377中利用内部SPI操作外部的EEPROM
分享到: 更多 (0)