📄 example_dps2812m_eeprom.c
字号:
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
#include "Example_DPS2812M_EEPROM.h"
unsigned int Spi_VarTx[100];
unsigned int Spi_VarRx[100];
unsigned int i,j,i1;
interrupt void SPIRXINTA_ISR(void); // SPI
interrupt void SPITXINTA_ISR(void); // SPI
void InitSpi(void);
unsigned int Spi_TxReady(void);
unsigned int Spi_RxReady(void);
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/* 关中断 */
DINT;
IER = 0x0000;
IFR = 0x0000;
/* 初始化PIE控制寄存器 */
InitPieCtrl();
/* 初始化PIE参数表 */
InitPieVectTable();
/* 初始化外设寄存器 */
InitSpi();
for(i = 0; i < 100; i++)
{
Spi_VarRx[i] = 0;
Spi_VarTx[i] = i+0x1234;
Spi_VarTx[i] = Spi_VarTx[i] << 8;
}
i = 0;
j = 0;
//#if Spi_Int
// EALLOW; // This is needed to write to EALLOW protected registers
// PieVectTable.SPITXINTA = &SPITXINTA_ISR;
// PieVectTable.SPIRXINTA = &SPIRXINTA_ISR;
// EDIS; // This is needed to disable write to EALLOW protected registers
/* 设置IER寄存器 */
// IER |= M_INT6;
//#endif
/* 开中断 */
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
EEPROM_Write_Enable();
EEPROM_Read_Status();
for(i1 = 0; i1 < 100; i1++)
{
//EEPROM写使能
EEPROM_Write_Enable();
//
while((EEPROM_Read_Status()&0x02) != 0x02);
//
EEPROM_Write(i1,i1);
//
while((EEPROM_Read_Status()&0x01) == 0x01);
//
Spi_VarRx[i1] = EEPROM_Read(i1);
}
for(;;)
{
}
}
/*
interrupt void ISRSciaTx(void)
{
PieCtrl.PIEACK.bit.ACK6 = 1;
EINT;
}
interrupt void ISRSciaRx(void)
{
PieCtrl.PIEACK.bit.ACK6 = 1;
if(Spi_RxReady() == 1)
{
Spi_VarRx[j] = SpiaRegs.SPIRXBUF;
j++;
if(j == 100)
{
j = 0;
}
}
EINT;
}
*/
/*********************************************************************
函数名: void EEPROM_Write_Enable(void)
目的: EEPROM的写使能
输入: 无
输出: 无
*********************************************************************/
void EEPROM_Write_Enable(void)
{
// unsigned int i;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//发送SPI
SpiaRegs.SPITXBUF = WREN;
//
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
delay_time(60);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}
/*********************************************************************
函数名: void EEPROM_Write_Disable(void)
目的: EEPROM的写关闭
输入: 无
输出: 无
*********************************************************************/
void EEPROM_Write_Disable(void)
{
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//发送SPI
SpiaRegs.SPITXBUF = WRDI;
//
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
delay_time(100);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}
/*********************************************************************
函数名: unsigned int EEPROM_Read_Status(void)
目的: EEPROM的读状态
输入: 无
输出: 无
*********************************************************************/
unsigned int EEPROM_Read_Status(void)
{
unsigned int i,data;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//发送SPI
SpiaRegs.SPITXBUF = RDSR;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = 0xff;
for(i = 0; i < 100; i++);
//判断SPI发送准备好
while(Spi_RxReady() == 0);
//发送SPI
data = SpiaRegs.SPIRXBUF;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
//
return data;
}
/*********************************************************************
函数名: void EEPROM_Write_Status(unsigned int write_status)
目的: EEPROM的写状态
输入: write_status 写状态寄存器的控制字
输出: 无
*********************************************************************/
void EEPROM_Write_Status(unsigned int write_status)
{
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//发送SPI
SpiaRegs.SPITXBUF = WRSR;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = write_status;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
delay_time(100);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
//
for(i = 0; i < 100; i++);
}
/*********************************************************************
函数名: unsigned int EEPROM_Read(unsigned int address)
目的: EEPROM的读
输入: length 读EEPROM的8位BYTE长度
address 读EEPROM的首地址,16BIT
输出: 无
*********************************************************************/
unsigned int EEPROM_Read(unsigned int address)
{
unsigned int j;
unsigned int data;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//发送SPI
SpiaRegs.SPITXBUF = READ;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = address;
//for(i = 0; i < 10000; i++);
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = address << 8;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = 0x5500;
for(j = 0; j < 100; j++);
//判断SPI发送准备好
while(Spi_RxReady() == 0);
//发送SPI
data = SpiaRegs.SPIRXBUF;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
delay_time(50);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
//
return data;
}
/*********************************************************************
函数名: void EEPROM_Write(unsigned int address,unsigned int *data)
目的: EEPROM的写
输入: address 写地址
*data 写数据
输出: 无
*********************************************************************/
void EEPROM_Write(unsigned int address,unsigned int data)
{
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//发送SPI
SpiaRegs.SPITXBUF = WRITE;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = address & 0xff00;
//
//for(i = 0; i < 10000; i++);
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = (address << 8) & 0xff00 ;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//发送SPI
SpiaRegs.SPITXBUF = (data << 8) & 0xff00;
//判断SPI发送准备好
while(Spi_TxReady() == 0);
//
delay_time(50);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}
void delay_time(unsigned int data)
{
unsigned int i;
for(i = 0; i < data; i++);
}
//---------------------------------------------------------------------------
// InitSPI:
//---------------------------------------------------------------------------
// This function initializes the SPI(s) to a known state.
//
void InitSpi(void)
{
// Initialize SPI-A:
EALLOW;
GpioMuxRegs.GPFMUX.all = 0x0007;
GpioMuxRegs.GPFDIR.bit.GPIOF3 = 1;
EDIS;
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
/* 8 bit data */
SpiaRegs.SPICCR.all = 0x07;
SpiaRegs.SPICTL.all = 0x0E;
SpiaRegs.SPIBRR = 0x0e;
SpiaRegs.SPICCR.all = 0x87;
PieCtrlRegs.PIEIER6.bit.INTx1 = 1;
PieCtrlRegs.PIEIER6.bit.INTx2 = 1;
//tbd...
//tbd...
}
unsigned int Spi_TxReady(void)
{
unsigned int i;
if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)
{
i = 0;
}
else
{
i = 1;
}
return(i);
}
unsigned int Spi_RxReady(void)
{
unsigned int i;
if(SpiaRegs.SPISTS.bit.INT_FLAG == 1)
{
i = 1;
}
else
{
i = 0;
}
return(i);
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -