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

📄 24c02.c

📁 tms320F2812DSP读取 24C02的源代码,已经在DSP开发环境CCS2.2下测试通过。
💻 C
字号:

#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"

#define	  SetData	GpioDataRegs.GPFDAT.bit.GPIOF12 = 1
#define	  ClrData   GpioDataRegs.GPFDAT.bit.GPIOF12 = 0
#define	  SetClk	GpioDataRegs.GPFDAT.bit.GPIOF8 = 1
#define	  ClrClk	GpioDataRegs.GPFDAT.bit.GPIOF8 = 0
#define	  SetSDA	GpioDataRegs.GPADAT.bit.GPIOA3 = 1
#define	  ClrSDA	GpioDataRegs.GPADAT.bit.GPIOA3 = 0
#define	  SetSCL	GpioDataRegs.GPADAT.bit.GPIOA2 = 1
#define	  ClrSCL	GpioDataRegs.GPADAT.bit.GPIOA2 = 0

#define	  	WriteDeviceAddress 	0xa0
#define		ReadDeviceAddress 	0xa1

unsigned  int  *LedReg  = (unsigned int *)0x27FF;
unsigned  int  *Led8Lock = (unsigned int *)0x2BFF;
Uint16	LedCount = 0;
Uint16	SpiCount = 0;

void	SendData(Uint16	data);
Uint16	Read24c02(Uint16  *RamAddr, Uint16	RomAddress, Uint16 number);
Uint16	Write24c02(Uint16	*Wdata, Uint16	RomAddress, Uint16	number);

void main(void)
{
     Uint16   dat1[8];
     Uint16   dat[]={ 0x55,0x11,0x66,0x77,0x44,0x33,0x00,0x7};

	/*初始化系统*/
	InitSysCtrl();

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	/*初始化PIE*/
	InitPieCtrl();

	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	
	/*初始化外设*/
    InitPeripherals();
    
	InitGpio();
    
	*Led8Lock = 0X07;
	*LedReg = 0xFF;
	SendData(0xFF);
    Write24c02(dat,0x00,8);
	Read24c02(dat1,0x00,8);
	for(;;);

} 	

void	delay(Uint16  number)
{
	Uint16  j;
	for(j = 0;j < number;j++);
}	
void	SendData(Uint16 data)
{
	Uint16	i,Temp;
	Temp = 0x80;
	for	(i=0;i<8;i++)
		{
			if ((data & Temp)==0)	ClrData;
			else	SetData;
			Temp >>= 1;
			ClrClk;
			delay(10);
			SetClk;
		}
	*Led8Lock = 0x03;
	delay(10);	
	*Led8Lock = 0x07;
	SetData;		
}		

void	SDAIN(void)
{
     EALLOW;
  	 GpioMuxRegs.GPADIR.bit.GPIOA3 = 0;
     EDIS;
}

void	SDAOUT(void)
{
     EALLOW;
  	 GpioMuxRegs.GPADIR.bit.GPIOA3 = 1;
     EDIS;
}

void	IStart(void)
{
	SDAOUT();
	delay(50);
	SetSDA;
	SetSCL;
	delay(15);
	ClrSDA;
	delay(5);
	ClrSCL;
}

void	IStop(void)
{
	SDAOUT();
	delay(50);
	ClrSCL;
	ClrSDA;
	delay(15);
	SetSCL;
	delay(5);
	SetSDA;
}

void	IAck(void)
{
	SDAOUT();
	delay(50);
	ClrSDA;
	SetSCL;
	delay(15);
	ClrSCL;
	delay(5);
	SetSDA;
}
void	INAck(void)
{
	SDAOUT();
	delay(50);
	SetSDA;
	SetSCL;
	delay(15);
	ClrSCL;
}

Uint16	TestAck(void)
{
	Uint16	Temp;
	SDAOUT();
	delay(50);
	SetSDA;
	SetSCL;
	delay(15);
	SDAIN();
	Temp = 0x0008 & GpioDataRegs.GPADAT.all;
	ClrSCL;
	return Temp;
}

void	WriteByte(Uint16  data)
{
	Uint16	i;
	Uint16	Temp = 0x8000;
	data = data<<8;
	SDAOUT();
	delay(50);
	for(i=8;i!=0;i--)
	{
		if (Temp & data)	SetSDA;
		else	ClrSDA;
		SetSCL;
		delay(15);
		ClrSCL;
		data = data<<1;
	}
}

Uint16	ReadByte(void)
{
	Uint16	i,T;
	Uint16	Temp = 0x0000;
	SDAIN();
	delay(50);
	for (i=8;i!=0;i--)
	{
		SetSCL;
		Temp = Temp<<1;
		T = GpioDataRegs.GPADAT.all;
		T = T & 0x0008;
		if (T)	 Temp = Temp | 1;
		else	Temp = Temp | 0;
		delay(15);
		ClrSCL;
	}
	return Temp;
}

Uint16	Write24c02(Uint16	*Wdata, Uint16	RomAddress, Uint16	number)
{	
	IStart();
	WriteByte(WriteDeviceAddress);
	if(TestAck())	return 1;
	WriteByte(RomAddress);
	if(TestAck())	return 1;
	for(;number!=0;number--)
	{
		WriteByte(*Wdata);
		if(TestAck())	return 1;
		Wdata++;
	}
	IStop();
	delay(10000);
	return 0;
}

Uint16	Read24c02(Uint16  *RamAddr, Uint16	RomAddress, Uint16 number)
{
	IStart();
	WriteByte(WriteDeviceAddress);
	if(TestAck())	return  1;
	WriteByte(RomAddress);
	if(TestAck())	return	1;
	IStart();
	WriteByte(ReadDeviceAddress);
	if(TestAck())	return  1;
	while(number!=1)
	{
		*RamAddr = ReadByte();
		IAck();
		RamAddr++;
		number--;
	}
	*RamAddr = ReadByte();
	INAck();
	IStop();
	return 0;
}

//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -