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

📄 adt75i2c.txt

📁 用C语言模拟I2C时序功能
💻 TXT
字号:
#include "DSP2812_Device.h"
#define SCL	GpioDataRegs.GPADAT.bit.GPIOA0
#define SDA	GpioDataRegs.GPADAT.bit.GPIOA1
#define Uchar short
void IIC_Start(void);
void IIC_Stop(void);
void IIC_AckS(void);
void IIC_Ack(void);
void IIC_Nack(void);
void IIC_SendByte(Uint16 ch);
Uchar IIC_ReadByte(void);

void WriteDevice(Uchar addr,Uchar data);
Uchar ReadDevice();

void Delay_s(int x);
void Delay(int x);
Uint16 i,m=0,a,F0;


void main(void)
{
 InitSysCtrl();
 DINT;
 IER=0x0000;
 IFR=0x0000;
 
 InitPeripherals();
 InitPieVectTable();
 
 InitGpio();	
 //EINT;   // Enable Global interrupt INTM
 //ERTM;
 
 WriteDevice(0x01,0x20);//向配置寄存器中写数据,配置为单步模式
while(1)
 {
  m=m+1;
  a=ReadDevice();//读温度数值寄存器中的温度值
  Delay_s(500);
 }

}

void IIC_Start(void)//起始位
{
 SDA=1;
 SCL=1;
 Delay(50);//延时时间约为4US
 SDA=0;
 Delay(50);
 SCL=0;
 Delay(50);
}
void IIC_Stop(void)//由主机向从机发送终止位
{
 SDA=0;
 SCL=1;
 Delay(50);
 SDA=1;
 Delay(50);//确保终止信号和起始信号有一定的空闲时间
 SCL=0;
 Delay(50);
} 
void IIC_ReadAck(void)//读取从机应答位
{
	EALLOW;
	GpioMuxRegs.GPADIR.bit.GPIOA1=0;//SDA为输入引脚
	EDIS;
	SCL=1;
	Delay(50);
	F0=0;
	if(SDA==1)
	 {  
	   F0=1;
	 }
	SCL=0;
        Delay(10);
	EALLOW;
	GpioMuxRegs.GPADIR.bit.GPIOA1=1;//SDA为输出引脚
	EDIS;
}


void IIC_Ack(void)//应答标志
{
 SDA=0;
 Delay(20);
 SCL=1;   //SCL为高电平时,SDA上的数据保持稳定
 Delay(50);
 SCL=0;
 Delay(50);
}
void IIC_Nack(void)//主机发出的无应答标志
{
	SDA=1;
	Delay(50);
	SCL=1;
	Delay(50);
	SCL=0;
	Delay(50);
}
void IIC_SendByte(Uint16 ch)//向IIC总线发送数据
{
 int i;
 for(i=0;i<8;i++)
 {
  if(ch&0x80)
   {
    SCL=0;
    Delay(50);
    SDA=1;
    SCL=1;
    Delay(50);
    SCL=0;
    Delay(50);
    SDA=0;
   }
  else
   {
    SCL=0;
    Delay(50);
    SDA=0;
    SCL=1;
    Delay(50);
    SCL=0;
    Delay(50);
   }
  ch=ch<<1;
 }
}
Uchar IIC_ReadByte()//从IIC总线读取数据
{
 int i;
 Uint16 data=0;
 EALLOW;
 GpioMuxRegs.GPADIR.bit.GPIOA1=0;//SDA为输入引脚
 EDIS;
 for(i=0;i<8;i++)
 {
  SCL=1;
  Delay(50);
  if(SDA==1)
  {
   data=data+1;
  }
  data=data<<1;
  SCL=0;
  Delay(50);
 }
 EALLOW;
 GpioMuxRegs.GPADIR.bit.GPIOA1=1;
 EDIS;
 return data;//返回data值是为了保存读取的值,把读取的温度值保存起来,
              //以供LED显示和进行PID运算
}
void WriteDevice(Uchar addr,Uchar data)
{
 IIC_Start();
 IIC_SendByte(0x90);
 IIC_ReadAck();//如果应答位为1,则主控制器不动作,认为从控制器坏了。
 if(F0==1) return;    //如果应答位为0,则主控制器继续发送数据
 IIC_SendByte(addr);//送高字节地址
 if(F0==1) return;
 IIC_SendByte(data);
 if(F0==1) return;
 IIC_Stop();
}
Uchar ReadDevice()//本程序只需要读温度数据寄存器即可
{
 Uint16 DATA,T;
 IIC_Start();
 IIC_SendByte(0x91);//开始时,对器件寻址(写数据)
 IIC_ReadAck();
 if(F0==1) return;
 DATA=IIC_ReadByte();
 IIC_Ack();
 T=IIC_ReadByte();
 IIC_Nack(); //根据IIC总线的时序可知,读数据时,最后是非应答位,即应答位为高电平。
              //相反,写数据时,最后是应答位,即应答位是低电平 
 IIC_Stop(); //一定要注意看时序图
 DATA=DATA<<8;
 DATA=DATA+T;
 return(DATA);
 
}



void Delay(int x)
{
	unsigned int i;
	for(i=0; i<=x;i++)
	{
		asm("NOP");
	}
}
void Delay_s(int x)
{
 unsigned int i,j;
 for(i=0;i<500;i++)
  {
   for(j=0;j<x;j++)
    {
     
    }
  }
}

⌨️ 快捷键说明

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