?? 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 + -