[讨论] 我要用DSP控制LM75

haijingsea   2011-7-27 11:12 楼主
用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);   
        }  
     }
}

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复