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

📄 i2c-test.c

📁 在DSP上实现I2C的时序
💻 C
字号:
#include "DSP281x_Device.h"

#define Uint16 unsigned int
#define Uchar	short
#define SCL		GpioDataRegs.GPBDAT.bit.GPIOB14	
#define SDA		GpioDataRegs.GPBDAT.bit.GPIOB15	
#define DELAY delay_ms(20000)

void GPIO_select(void);
void delay_ms(int x);
void delay_s(int x);
Uint16 I2C_bb(void);
void I2C_init(void);
void I2C_start(void);
void I2C_stop(void);
Uint16 I2C_ackRead(void);
void I2C_ackWrite(void);
void I2C_ackNo(void);
void I2C_writedata(Uchar ch);
Uchar I2C_readdata(void);
void I2C_writeByte(Uchar addrH,Uchar addrL,Uchar data);
Uchar I2C_readByte(Uchar addrH,Uchar addrL);
void I2C_writePage(Uchar addrH,Uchar addrL,Uchar* src,Uint16 length);
void I2C_readPage(Uchar addrH,Uchar addrL,Uchar* recv,Uint16 length);

Uchar result1,result2;
Uchar ch1=0xD0,ch2=0xE7;
Uchar send[32]={0x00,0xED,0xBF,0xC0,0xB0,0xA0,0x90,0x80,0x70,0x60,0x50,0x40,0x30,0x20,0x10,0x00,
					0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,};
Uchar recv[32];

void main(void)
{
	InitSysCtrl();
	GPIO_select();
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	
	/*初始化PIE中断*/
	InitPieCtrl();
	
	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
	I2C_init();
	I2C_writeByte(0x00,0x00,ch1);
	if(ch1==I2C_readByte(0x00,0x00))
	{
		result1=1;
	}
	else
		result1=0;
	I2C_writePage(0x00,0x00,send,32);
	delay_s(5000);
	I2C_readPage(0x00,0x00,recv,32);
	I2C_writeByte(0x00,0x20,ch2);
	if(ch2==I2C_readByte(0x00,0x20))
		result2=1;
	else
		result2=0;
	for(;;)
	{};
	
	
}
void GPIO_select(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;
}
Uint16 I2C_bb(void)
{
	GpioMuxRegs.GPBDIR.bit.GPIOB14=0;
	GpioMuxRegs.GPBDIR.bit.GPIOB15=0;
	if (SCL==1 && SDA==1)
		return 0;
	else
		return 1; 
}

void I2C_init(void)
{
	SCL=0;
	DELAY;
	SDA=1;
	DELAY;
}
void I2C_start(void)
{
	SDA=1;
	DELAY;
	SCL=1;
	DELAY;
	SDA=0;
	DELAY;
	SCL=0;
	DELAY;
}
void I2C_stop(void)
{
	SDA=0;
	DELAY;
	SCL=1;
	DELAY;
	SDA=1;
	DELAY;
	SCL=0;
	DELAY;
}
Uint16 I2C_ackRead(void)
{
	Uint16 ack;
	EALLOW;
	GpioMuxRegs.GPBDIR.bit.GPIOB15=0;
	EDIS;
	DELAY;
	SCL=1;
	DELAY;
	ack=SDA;
	DELAY;
	SCL=0;
	DELAY;
	EALLOW;
	GpioMuxRegs.GPBDIR.bit.GPIOB15=1;;
	EDIS;
	return ack;	
}
void I2C_ackWrite(void)
{
	SDA=0;
	DELAY;
	SCL=1;
	DELAY;
	SCL=0;
	DELAY;
}
void I2C_ackNo(void)
{
	SDA=1;
	DELAY;
	SCL=1;
	DELAY;
	SCL=0;
	DELAY;
}

void I2C_writedata(Uchar ch)
{
	Uchar i;
	for(i=0;i<8;i++)
	{
	    if((ch<<i)&0x80)SDA=1;   /*判断发送位 一位一位地发送*/
        else SDA=0;        
		DELAY;
		SCL=1;
		DELAY;
		SCL=0;
		DELAY;		
	}
}

Uchar I2C_readdata()
{
   int i; 
   Uint16 data=0;  
   EALLOW;
   GpioMuxRegs.GPBDIR.bit.GPIOB15=0;
   EDIS;
   DELAY;  
   for(i=0;i<8;i++)
   {
    data=data<<1;
    DELAY;
    SCL=1;
    DELAY;
	if(SDA==1)data=data+1; /*读数据位,接收的数据位放入data中 */
	DELAY;
	SCL=0;
	DELAY;	
   }
   EALLOW; /*置数据线为输出方式*/
   GpioMuxRegs.GPBDIR.bit.GPIOB15 =1;  //SDA
   EDIS;            
   return (data);
}

void I2C_writeByte(Uchar addrH,Uchar addrL,Uchar data)
{

	I2C_start();
	I2C_writedata(0xA0);
	if(I2C_ackRead())
	{
		while(1);
	}		
	I2C_writedata(addrH);
	if(I2C_ackRead())
	{
		while(1);
	}	
	I2C_writedata(addrL);
	if(I2C_ackRead())
	{
		while(1);
	}	
	I2C_writedata(data);
	if(I2C_ackRead())
	{
		while(1);
	}	
	I2C_stop();
	
}

Uchar I2C_readByte(Uchar addrH,Uchar addrL)
{

	Uchar data=0;
	I2C_start();
	I2C_writedata(0xA0);
	if(I2C_ackRead())
	{
		while(1);
	}
	I2C_writedata(addrH);
	if(I2C_ackRead())
	{
		while(1);
	}
	I2C_writedata(addrL);
	if(I2C_ackRead())
	{
		while(1);
	}
	I2C_start();
	I2C_writedata(0xA1);
	if(I2C_ackRead())
	{
		while(1);
	}
	data=I2C_readdata();
	I2C_ackNo();
	DELAY;
	I2C_stop();
	return data;
	
}

void I2C_writePage(Uchar addrH,Uchar addrL,Uchar* src,Uint16 length)
{
	Uint16 i;
	I2C_start();
	I2C_writedata(0xA0);
	if(I2C_ackRead())
	{
		while(1);
	}		
	I2C_writedata(addrH);
	if(I2C_ackRead())
	{
		while(1);
	}	
	I2C_writedata(addrL);
	if(I2C_ackRead())
	{
		while(1);
	}
	for(i=0;i<length;i++)
	{
		I2C_writedata(src[i]);
		if(I2C_ackRead())
		{
			while(1);
		}	
	}
	I2C_stop();//发送停止条件启动内部写周期
}
void I2C_readPage(Uchar addrH,Uchar addrL,Uchar* recv,Uint16 length)
{
	Uint16 i;
	I2C_start();
	I2C_writedata(0xA0);
	if(I2C_ackRead())
	{
		while(1);
	}
	I2C_writedata(addrH);
	if(I2C_ackRead())
	{
		while(1);
	}
	I2C_writedata(addrL);
	if(I2C_ackRead())
	{
		while(1);
	}
	I2C_start();
	I2C_writedata(0xA1);
	if(I2C_ackRead())
	{
		while(1);
	}
	for(i=0;i<length-1;i++)
	{
		recv[i]=I2C_readdata();
		I2C_ackWrite();		
	}
	recv[length-1]=I2C_readdata();
	I2C_ackNo();
	I2C_stop();
	
}

void delay_ms(int x)
{
	unsigned int i;
	for(i = 0; i <= x; i++)
	{
		asm("NOP");
	}
}
void delay_s(int x)
{
	Uint16 i;
	for(i=0;i<x;i++)
	{
		DELAY;
	}
}

⌨️ 快捷键说明

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