我想通过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是左对齐