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

📄 example_dps2812m_eeprom.c

📁 代码是北京合众达公司提供的TMS320F2812的例子程序
💻 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 + -