📄 adt75i2c.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 + -