分享

【转】单片机SPI接口和AD7799通信程序

 ZLM_图书馆 2014-07-04

sbit AD7799_CS=P1^4;
sbit AD7799_RDY=P1^6;

//SPCR    SPI控制寄存器

//SPSR    SPI状态寄存器

//SPDAT    SPI数据寄存器
void SPI_init(void)
{
    SPCR=0x5e;//SPI控制寄存器,中断禁止,SPI使能,高位在前,主机模式,时钟空闲时为高,后沿触发移位,时钟分频64
SPSR=0x00;//清中断标志位
}
/*--------------------------------------------
写AD7799寄存器函数
WriteData:要写的数据
----------------------------------------------*/
void WriteByteToAd7799(unsigned char WriteData)
{
    SPDAT= WriteData;
    while(~SPSR&0x80);        //等待数据发送完
    SPSR=0x00;                     //清中断标志位

}
/*--------------------------------------------
防止时序混乱,实现再同步
----------------------------------------------*/
void WaiteRDY(void)
{
    unsigned int count=0 ;
    while(AD7799_RDY)
    {    
        count++;
        if(count>20000)
        {
             //reset ad7799
            WriteByteToAd7799(0xff);

            WriteByteToAd7799(0xff);
                                      /*----------防止时序混乱,重新同步----------*/
            WriteByteToAd7799(0xff);

            WriteByteToAd7799(0xff);

            AD7799_init();
            break ;
        }
    }
}

/*--------------------------------------------
AD7799初始化函数
----------------------------------------------*/
void AD7799_init(void)
{
   AD7799_CS=0;
/*------------------------增益为128,通道0----------------------------------------*/
    WriteByteToAd7799(0x10); //写通信寄存器设置下一个操作为写配置寄存器

    WriteByteToAd7799(0x37); //增益为128

    WriteByteToAd7799(0x30); //通道0

/*------------------- 写模式寄存器初始化零值校准------------------------------------*/
    WriteByteToAd7799(0x08); //写通信寄存器设置下一个操作为写模式寄存器

    WriteByteToAd7799(0x80);

    WriteByteToAd7799(0x0A);

    WaiteRDY();              //Wait for RDY pin to go low to indicate end of calibration cycle*/
/*------------------写模式寄存器初始化全值校准-------------------------------------*/
    WriteByteToAd7799(0x08); //写通信寄存器设置下一个操作为写模式寄存器

    WriteByteToAd7799(0xA0);

    WriteByteToAd7799(0x0A);

    WaiteRDY();              // Wait for RDY pin to go low to indicate end of calibration cycle
/*------------------模式0,Continuous-Conversion Mode,Fadc=16.7HZ------------------*/
    WriteByteToAd7799(0x08);      //写通信寄存器设置下一个操作为写模式寄存器

    WriteByteToAd7799(0x00);

    WriteByteToAd7799(0x0A);

}
unsigned long ReadAd7799ConversionData(void)
{
    unsigned long ConverData;
    unsigned char ADSAT ;
    unsigned char ErrNUM=0;
    WaiteRDY();

    WriteByteToAd7799(0x40);     //写通信寄存器设置下一个操作为读状态STATUS寄存器

    WriteByteToAd7799(0xff);     //伪写通信寄存器,为读状态寄存器提供时钟

    ADSAT=SPDAT;                 //读取接收到的数据
    while((ADSAT&0x40)||(!(ADSAT&0x08)))      //出错或者读写异常
    {
         //reset ad7799
         WriteByteToAd7799(0xff);

         WriteByteToAd7799(0xff);
                                      /*----------防止时序混乱,重新同步----------*/
         WriteByteToAd7799(0xff);

         WriteByteToAd7799(0xff);

//-------------------------------------------------------------------------------------     
        AD7799_init();
       
        WaiteRDY();
        WriteByteToAd7799(0x40);     //写通信寄存器设置下一个操作为读状态STATUS寄存器

        WriteByteToAd7799(0xff);     //伪写通信寄存器,为读状态寄存器提供时钟

        ADSAT=SPDAT;                 //读取接收到的数据
       
        ErrNUM++;
        if(ErrNUM>5)break;
    }

    WriteByteToAd7799(0x58);        //写通信寄存器设置下一个操作为连续读数据寄存器

    WaiteRDY();
    /* Wait for RDY pin to go low to indicate end of calibration cycle*/
    if(!AD7799_RDY)
    {
        ConverData=0 ;
/*-----------------Read Conversion Result from AD7799's Data Register----------------*/

        WriteByteToAd7799(0xff);             //伪写通信寄存器,为读数据寄存器寄存器提供时钟
        ConverData=SPDAT;
        ConverData=ConverData<<8 ;

        WriteByteToAd7799(0xff);             //伪写通信寄存器,为读数据寄存器寄存器提供时钟
        ConverData=ConverData+SPDAT;
        ConverData=ConverData<<8 ;

        WriteByteToAd7799(0xff);             //伪写通信寄存器,为读数据寄存器寄存器提供时钟
        ConverData=ConverData+SPDAT;
       
    }
    if(ErrNUM>5)return(0);
    else return(ConverData);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多