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

📄 main.c

📁 TMS320F2812GPIO模拟IIC总线驱动EEPROM 24C64
💻 C
字号:
#include "DSP28_Device.h"
#define uint unsigned int
#define uchar	short
#define SCL		GpioDataRegs.GPBDAT.bit.GPIOB14	
#define SDA		GpioDataRegs.GPBDAT.bit.GPIOB15	
#define SCL_OUT		(GpioMuxRegs.GPBDIR.bit.GPIOB14=1)
#define	SDA_OUT		(GpioMuxRegs.GPBDIR.bit.GPIOB15=1)
#define	SCL_IN		(GpioMuxRegs.GPBDIR.bit.GPIOB14=0)
#define	SDA_IN		(GpioMuxRegs.GPBDIR.bit.GPIOB15=0)
#define tip	20000
#define CtrlW	0xA0
#define	CtrlR	0xA1

void GPIO_Config(void);
void delay_ms(int x);
void delay_s(int x);
uint IIC_bb(void);
void IIC_init(void);
void IIC_start(void);
void IIC_stop(void);
uint IIC_ackRead(void);
void IIC_ackWrite(void);
void IIC_ackNo(void);
void IIC_write(uchar ch);
void IIC_writeByte(uchar control,uchar addrH,uchar addrL,uchar data);
uchar IIC_readByte(uchar control,uchar addrH,uchar addrL);
void IIC_writePage(uchar control,uchar addrH,uchar addrL,uchar* src,uint length);
void IIC_readPage(uchar control,uchar addrH,uchar addrL,uchar* dst,uint length);
uchar result1,result2;
uchar ch1=0xD0,ch2=0xE7;
uchar var_send[32]={0xF0,0xE0,0xD0,0xC0,0xB0,0xA0,0x90,0x80,0x70,0x60,0x50,0x40,0x30,0x20,0x10,0x00,
					0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,};
uchar var_recv[32];
void main(void)
{
	InitSysCtrl();
	GPIO_Config();
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	
	/*初始化PIE中断*/
	InitPieCtrl();
	
	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
	IIC_init();
	IIC_writeByte(CtrlW,0x00,0x00,ch1);
	if(ch1==IIC_readByte(CtrlR,0x00,0x00))
	{
		result1=1;
	}
	else
		result1=0;
	IIC_writePage(CtrlW,0x00,0x00,var_send,32);
	delay_s(5000);
	IIC_readPage(CtrlR,0x00,0x00,var_recv,32);
	IIC_writeByte(CtrlW,0x00,0x20,ch2);
	if(ch2==IIC_readByte(CtrlR,0x00,0x20))
		result2=1;
	else
		result2=0;
	for(;;)
	{};
	
	
}
void GPIO_Config(void)
{
	EALLOW;
	GpioMuxRegs.GPBMUX.bit.C5TRIP_GPIOB14=0;
	GpioMuxRegs.GPBMUX.bit.C6TRIP_GPIOB15=0;
	GpioMuxRegs.GPBDIR.bit.GPIOB14=1;
	GpioMuxRegs.GPBDIR.bit.GPIOB15=1;
	GpioMuxRegs.GPBQUAL.all=0x0000;
	EDIS;
}
uint IIC_bb(void)
{
	SCL_IN;
	SDA_IN;
	if (SCL==1 && SDA==1)
		return 0;
	else
		return 1; 
}
void delay_ms(int x)
{
	unsigned int i;
	for(i = 0; i <= x; i++)
	{
		asm("NOP");
	}
}
void delay_s(int x)
{
	uint i;
	for(i=0;i<x;i++)
	{
		delay_ms(tip);
	}
}
void IIC_init(void)
{
	SCL=0;
	delay_ms(tip);
	SDA=1;
	delay_ms(tip);
}
void IIC_start(void)
{
	SDA=1;
	delay_ms(tip);
	SCL=1;
	delay_ms(tip);
	SDA=0;
	delay_ms(tip);
	SCL=0;
	delay_ms(tip);
}
void IIC_stop(void)
{
	SDA=0;
	delay_ms(tip);
	SCL=1;
	delay_ms(tip);
	SDA=1;
	delay_ms(tip);
	SCL=0;
	delay_ms(tip);
}
uint IIC_ackRead(void)
{
	uint i;
//	SCL=0;
//	delay_ms(tip);
	EALLOW;
	SDA_IN;
	EDIS;
	delay_ms(tip);
	SCL=1;
	delay_ms(tip);
	i=SDA;
	delay_ms(tip);
	SCL=0;
	delay_ms(tip);
	EALLOW;
	SDA_OUT;
	EDIS;
	return i;	
}
void IIC_ackWrite(void)
{
	SDA=0;
	delay_ms(tip);
	SCL=1;
	delay_ms(tip);
	SCL=0;
	delay_ms(tip);
}
void IIC_ackNo(void)
{
	SDA=1;
	delay_ms(tip);
	SCL=1;
	delay_ms(tip);
	SCL=0;
	delay_ms(tip);
}
void IIC_write(uchar ch)
{
	uchar i;
//	SCL=0;
//	delay_ms(tip);
	for(i=7;i>=0;i--)
	{
		SDA= ((ch >> i) & 1);//先发送数据的高位
		delay_ms(tip);
		SCL=1;
		delay_ms(tip);
		SCL=0;
		delay_ms(tip);
	}
}
void IIC_writeByte(uchar control,uchar addrH,uchar addrL,uchar data)
{
	uint i;
	IIC_start();
	IIC_write(control);
	if(IIC_ackRead())
	{
		while(1);
	}		
	IIC_write(addrH);
	if(IIC_ackRead())
	{
		while(1);
	}	
	IIC_write(addrL);
	if(IIC_ackRead())
	{
		while(1);
	}	
	IIC_write(data);
	if(IIC_ackRead())
	{
		while(1);
	}	
	IIC_stop();
	
}
uchar IIC_readByte(uchar control,uchar addrH,uchar addrL)
{
	uchar i=8,j=0;
	uchar data=0;
	control=control&0xFE;
	IIC_start();
	IIC_write(control);
	if(IIC_ackRead())
	{
		while(1);
	}
	IIC_write(addrH);
	if(IIC_ackRead())
	{
		while(1);
	}
	IIC_write(addrL);
	if(IIC_ackRead())
	{
		while(1);
	}
	control=control|1;
	IIC_start();
	IIC_write(control);
	if(IIC_ackRead())
	{
		while(1);
	}
	
	for(i=0;i<8;i++)
	{
		SCL=1;
		delay_ms(tip);
		EALLOW;
		SDA_IN;
		EDIS;
		delay_ms(tip);
		j=SDA;
		data=data|(j<<(7-i));
		delay_ms(tip);
		SCL=0;
		delay_ms(tip);		
	}
	EALLOW;
	SDA_OUT;
	EDIS;
	IIC_ackNo();
	delay_ms(tip);
	IIC_stop();
	return data;
	
}
void IIC_writePage(uchar control,uchar addrH,uchar addrL,uchar* src,uint length)
{
	uint i;
	IIC_start();
	IIC_write(control);
	if(IIC_ackRead())
	{
		while(1);
	}		
	IIC_write(addrH);
	if(IIC_ackRead())
	{
		while(1);
	}	
	IIC_write(addrL);
	if(IIC_ackRead())
	{
		while(1);
	}
	for(i=0;i<length;i++)
	{
		IIC_write(src[i]);
		if(IIC_ackRead())
		{
			while(1);
		}	
	}
	IIC_stop();//发送停止条件启动内部写周期
}
void IIC_readPage(uchar control,uchar addrH,uchar addrL,uchar* dst,uint length)
{
	uint i,j;
	volatile uchar k=0,temp=0;
	control=control&0xFE;
	IIC_start();
	IIC_write(control);
	if(IIC_ackRead())
	{
		while(1);
	}
	IIC_write(addrH);
	if(IIC_ackRead())
	{
		while(1);
	}
	IIC_write(addrL);
	if(IIC_ackRead())
	{
		while(1);
	}
	control=control|1;
	IIC_start();
	IIC_write(control);
	if(IIC_ackRead())
	{
		while(1);
	}
	EALLOW;
	SDA_IN;
	EDIS;
	delay_ms(tip);
	for(j=0;j<8;j++)
	{
		SCL=1;
		delay_ms(tip);
		k=SDA;
		delay_ms(tip);
		temp=(k<<(7-j))|temp;
		SCL=0;
		delay_ms(tip);			
	}
	dst[0]=temp;
	for(i=1;i<length;i++)
	{
		EALLOW;
		SDA_OUT;
		EDIS;
		delay_ms(tip);
		IIC_ackWrite();
		EALLOW;
		SDA_IN;
		EDIS;
		delay_ms(tip);
		k=0;
		temp=0x00;
		for(j=0;j<8;j++)
		{
			SCL=1;
			delay_ms(tip);
			k=SDA;
			delay_ms(tip);
			temp=(k<<(7-j))|temp;
			SCL=0;
			delay_ms(tip);			
		}
		dst[i]=temp;
		
		
	}
	EALLOW;
	SDA_OUT;
	EDIS;
	IIC_ackNo();
	IIC_stop();
	
}

⌨️ 快捷键说明

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