用2812的I/O口模拟I2C总线与LM75通信,程序显示结果一直不对
找不到原因 以下是我的程序 请哪位高手指教以下
#include "DSP28_Device.h"
#define true 1
#define false 0
#define uint unsigned int
#define int8 unsigned char
#define SDA_OUT GpioMuxRegs.GPFDIR.bit.GPIOF6=1
#define SDA_IN GpioMuxRegs.GPFDIR.bit.GPIOF6=0
#define SCL_OUT GpioMuxRegs.GPFDIR.bit.GPIOF7=1
#define SCL_IN GpioMuxRegs.GPFDIR.bit.GPIOF7=0
#define SDA_DAT GpioDataRegs.GPFDAT.bit.GPIOF6
#define SCL_DAT GpioDataRegs.GPFDAT.bit.GPIOF7
int8 ack;
//int8 Temp[2]={0};
int8 Temp,Temp1;
int8 Addr=0x90; //器件地址
int8 DispSegTab[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x63,0x80};
int8 DispWeiTab[]={ 0x08,0x04,0x02,0x01,0x80,0x40,0x20,0x10};
int8 DispBuff[8] = {16,16,16,16,16,16,16,16};//默认显示0
int8 DisplayNum =100;
////////////////////////////////////////////////////////////////////////////
//I2C开始位 //
//调用方式:void I2CStart(void) 函数说明:私有函数,I2C专用
////////////////////////////////////////////////////////////////////////////
void delay_us(uint i)//延时US
{
uint index;
index=i*13;
while(index--);
}
void delay_ms(uint i)
{
uint index,j;
for(j=0;j<1650;j++)
{
index=i*15;
while(index--);
}
}
void I2CStart(void)
{
EALLOW;
SDA_OUT;
SCL_OUT;
EDIS;
delay_us(1);
SDA_DAT=1;
delay_us(1);
SCL_DAT=1;
delay_us(5);
SDA_DAT=0;
delay_us(5);
SCL_DAT=0;
delay_us(2);
}
////////////////////////////////////////////////////////////////////////////
//I2C停止位 //
// 调用方式:void I2CStop(void) 函数说明:私有函数,I2C专用
////////////////////////////////////////////////////////////////////////////
void I2CStop(void)
{
EALLOW;
SDA_OUT;
SCL_OUT;
EDIS;
delay_us(1);
SDA_DAT=0;
delay_us(1);
SCL_DAT=1;
delay_us(5);
SDA_DAT=1;
delay_us(4);
}
////////////////////////////////////////////////////////////////////////////
//调用方式:void I2CSendByte(uint8 ch)
//函数说明:私有函数,I2C专用
////////////////////////////////////////////////////////////////////////////
void I2CSendByte(int8 ch)
{
int8 i;
int8 errortime=225;
EALLOW;
SDA_OUT;
SCL_OUT;
EDIS;
delay_us(1);
for(i=0; i<8; i++)
{
SCL_DAT=0;
delay_us(2);
if(ch&0x80)
SDA_DAT=1;
else
SDA_DAT=0;
ch<<= 1;
delay_us(2);
SCL_DAT=1;
delay_us(5);
}
SCL_DAT=0;
EALLOW;
SDA_IN;
EDIS;
delay_us(3);
while(SDA_DAT)
{
errortime--;
if(errortime==0)
{
ack=0;
I2CStop();
}
}
ack=1;
SCL_DAT=0;
delay_us(2);
}
////////////////////////////////////////////////////////////////////////////
// 调用方式:uint8 I2CReceiveByte(void)
// 函数说明:私有函数,I2C专用,主机接收一个字节数据
////////////////////////////////////////////////////////////////////////////
int8 I2CReceiveByte(void)
{
int8 recch=0;
int8 c;
EALLOW;
SDA_OUT;
SCL_OUT;
EDIS;
EALLOW;
SDA_IN;
EDIS;
delay_us(1);
for(c=0; c<8; c++)
{
delay_us(1);
SCL_DAT=0;
delay_us(5);
SCL_DAT=1;
delay_us(2);
recch<<=1;
if(SDA_DAT==1)
recch++;
delay_us(2);
}
delay_us(2);
SCL_DAT=0;
delay_us(5);
SCL_DAT=1;
delay_us(5);
SCL_DAT=0;
return(recch);
}
////////////////////////////////////////////////////////////////////////////
// 调用方式:bit SendAck(void)
// 函数说明:私有函数,I2C专用,主机发送应答信号
////////////////////////////////////////////////////////////////////////////
void SendAck(int8 a)
{
EALLOW;
SDA_OUT;
SCL_OUT;
EDIS;
delay_us(1);
if(a==0) SDA_DAT=0;
else SDA_DAT=1;
delay_us(3);
SCL_DAT=1;
delay_us(5);
SCL_DAT=0;
delay_us(2);
}
int8 ReadTemp( int8 addr, int8 sub_addr, int8 s, int8 s1, int8 num)
{
int8 i;
I2CStart();//启动总线
I2CSendByte(addr);//发送从机地址
if(ack==0)
{
return(0);
I2CStop();
}
I2CSendByte(sub_addr);//发送温度寄存器地址
if(ack==0)
{
return(0);
I2CStop();
}
//if (!WaitAck()) //如果从机没有应答,则跳出本次读程序
// {
//I2CStop();
// return 1;
// }
// I2CSendByte(sub_addr);//发送温度寄存器地址
// if (!WaitAck())
// {
//I2CStop();
// return 1;
// }
I2CStart();
I2CSendByte(addr+1);
if(ack==0)
{
return(0);
I2CStop();
}
/* for(i=0;i
{
*s=I2CReceiveByte();
SendAck(0);
s++;
} */
s=I2CReceiveByte();
SendAck(0);
s1=I2CReceiveByte();
SendAck(1);
I2CStop();
return(0);
}
int8 I2C_Init()
{
EALLOW;
SDA_OUT;
EDIS;
SDA_DAT=1;
delay_us(5);
SCL_DAT=1;
delay_us(5);
I2CStart();//启动总线
I2CSendByte(Addr);//发送从机地址
if(ack==0)
{
return(0);
I2CStop();
}
I2CSendByte(0x03);
if(ack==0)
{
return(0);
I2CStop();
}
I2CSendByte(0xfa);
if(ack==0)
{
return(0);
I2CStop();
}
//I2CSendByte(Addr);//发送从机地址
//if (!WaitAck()) //如果从机没有应答,则跳出本次读程序
//{
// I2CStop();
//return 1;
//}
//I2CSendByte(0x03);//发送过热关断寄存器地址
//if(ack==0) return(0);
//if (!WaitAck())
//{
//I2CStop();
//return 1;
//}
//I2CSendByte(0xFA);//发送过热关断寄存器上限值
//if(ack==0) return(0);
//if (!WaitAck())
//{
//I2CStop();
//return 1;
//}
I2CStop();
return 1;
}
////////////////////////////////////////////////////////////////////////////
// 函数:main()
////////////////////////////////////////////////////////////////////////////
void main()
{
int8 bai,shi,ge;
int i;
I2C_Init();
InitSysCtrl(); //系统控制初始化
InitGpio(); //初始化GPIO
DINT; //禁止全局中断
InitPieCtrl();
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除所有CPU中断标志
InitPieVectTable(); //为PIE中断向量表中的所有中断向量配置对应向量的入口地址
EALLOW;
GpioMuxRegs.GPAMUX.all=0x0000;
GpioMuxRegs.GPBMUX.all=0x0000;
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6=0;
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7=0;
GpioMuxRegs.GPADIR.all=0x00ff; //"=1" is output; "=0" is input;
GpioMuxRegs.GPBDIR.all=0x00ff;
GpioMuxRegs.GPFDIR.bit.GPIOF6=0;
GpioMuxRegs.GPFDIR.bit.GPIOF7=0;
EDIS;
while(1)
{
while(ReadTemp(Addr,0x00,Temp,Temp1,2)) ReadTemp(Addr,0x00,Temp,Temp1,2);//读取当前温度值,如果前一次读取失败则继续读取
//printf("temperature is %d.%d c\n",Temp[0],DispBuff[7]);
//ReadTemp(Addr,0x00,Temp,2);
DisplayNum=Temp;
bai=DisplayNum/100;
shi=(DisplayNum%100)/10;
ge=DisplayNum%10;
DispBuff[4]=bai;
DispBuff[5]=shi;
DispBuff[6]=ge;
//DispBuff[7]=(Temp[1]&0x80)?5:0;
for(i=7;i>=0;i--)
{
GpioDataRegs.GPBDAT.all=DispWeiTab;
if(i==6)
GpioDataRegs.GPADAT.all=DispSegTab[DispBuff]|0x80;
else
{
if((i==0||i==4)&&DispBuff==0)
GpioDataRegs.GPADAT.all=0x00;
else
GpioDataRegs.GPADAT.all=DispSegTab[DispBuff];
}
delay_ms(5);
}
}
}