搜索
bottom↓
回复: 15

请问 谁有MEGA16的SPI驱动AD7705的程序,参考下,我写的程序读出的都是0xff

[复制链接]

出0入0汤圆

发表于 2007-3-7 13:36:13 | 显示全部楼层 |阅读模式
请问 谁有MEGA16的SPI驱动AD7705的程序,参考下,我写的程序读出的都是0xff

谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2007-3-8 10:57:45 | 显示全部楼层
自己顶下

出0入0汤圆

发表于 2007-3-8 11:02:54 | 显示全部楼层
你怎么不把自己写的拿出来看有什么问题!我这里有份但不方便贡献,同事写的.

出0入0汤圆

发表于 2007-3-8 11:07:08 | 显示全部楼层
哦!忘记跟你说一件事了.AD7705的时序不与SPI下有不一样的.不能直接用SPI下驱动,你最好自己写个底层的函数.

出0入0汤圆

 楼主| 发表于 2007-3-8 11:39:20 | 显示全部楼层
#include <iom16v.h>

#include <macros.h>

#define uchar unsigned char

#define uint unsigned int

#define Add_key  PINC

uint value;

uint temp,temp1,temp2;

//**********************短延时程序50us**************************//

void delay50us(uint t)

{

    uint j;               

    for(;t>0;t--)                       

        for(j=0;j<70;j++)       

            ;

}

//**********************短延时程序5us**************************//

void delay5us(uint t)

{

    uint j;               

    for(;t>0;t--)                       

        for(j=0;j<7;j++)       

            ;

}

//**********************长延时程序50ms**************************//

void delay50ms(uint t)

{

        uint i;

        for(;t>0;t--)

                for(i=0;i<52642;i++)

                        ;                                                                 

}

//**************************端口初始化*************************//

void IO_Init(void)

{

DDRC=0x00;

PORTC=0x00;

//DDRB = (1<<DDB5)|(1<<DDB7)|(1<<DDB4)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);

//DDRB=0xb7;

DDRB=0b10110111;   //PB3\PB6输入

PORTB=0b1111111;

}

void spi_init(void)

{

SPCR = 0x7f; //使能SPI,LSB先发送,主机,SCK空闲高,模式三

SPSR = 0x00; //setup SPI



}



//******************SPI写寄存器函数*******************************//

void WriteToReg_ADC(uint byteword)

{

  PORTB=PORTB&0xef;    //使能SPI器件

  while((PINB&0x08)==1)

   {;}  //等待DRDY脚变低,PB3引脚为低

  SPDR=byteword;       //发送数据

  while(!(SPSR & (1<<SPIF)));//等待发送完毕

  PORTB=PORTB|0x10;    //禁止SPI器件

  delay5us(10);

}

//******************SPI读数据寄存器函数*******************************//

void Read_ADC16BitValue(void)

{   

   

        PORTB=PORTB&0xef;   //使能SPI器件

        SPDR=0xFF;

   while(!(SPSR & (1<<SPIF)));  

    temp1=SPDR;  

    SPDR=0xFF;

   while(!(SPSR & (1<<SPIF)));

    temp2=SPDR;

    PORTB=PORTB|0x10;     //禁止SPI器件

        temp=temp1*256+temp2;       

        delay5us(10);

}

//**************************AD初始化*************************//

void ADC_Init(void)

{ //先从通讯寄存器开始初始化

WriteToReg_ADC(0x20);       //通道1,下一个写时钟寄存器

WriteToReg_ADC(0x01);       //写时钟寄存器设置更新速率为200hz

WriteToReg_ADC(0x10);       //通道1,下一个写设置寄存器

WriteToReg_ADC(0x7c);       //增益1、自校准

delay50us(100);              //延时

}

void main(void)

{

        //uchar value;

        IO_Init();

        spi_init();

        ADC_Init();

        while(1)

        {

        //while(PINB&0x08);

        WriteToReg_ADC(0x38);       //下一操作为读数据寄存器1

        //while(PORTB&0x08);

        Read_ADC16BitValue();//读取

    value=temp;

       

        }

}

出0入0汤圆

 楼主| 发表于 2007-3-8 11:40:10 | 显示全部楼层
直接spi驱动,

出0入0汤圆

 楼主| 发表于 2007-3-8 11:43:11 | 显示全部楼层
资料上说,是兼容的

出0入0汤圆

发表于 2007-3-8 12:08:02 | 显示全部楼层
while((PINB&0x08)==1) {;}

这里等待变低有错.你这句话很有可能起不到实际作用.

出0入0汤圆

 楼主| 发表于 2007-3-8 14:47:47 | 显示全部楼层
得要判断,才能继续写数据吧

出0入0汤圆

发表于 2007-3-8 15:32:02 | 显示全部楼层
写寄存器的时候不需要判断.但是读AD转换值的时候要判断.且如果PINB是0x08呢,是进不了循环的.一样起不了等待变低的作用.最简单是while((PINB&0x08)==0x08) {;} .www.mculib.com上有中文的AD7705的资料.
-----此内容被lzy_于2007-03-08,15:48:43编辑过

出0入0汤圆

 楼主| 发表于 2007-3-8 16:36:04 | 显示全部楼层
现在把程序修改了,读数据之前判断,还是老样子,晕死了,怀疑SPI没有正常工作,

出0入0汤圆

发表于 2007-3-8 16:50:05 | 显示全部楼层
有一点我没试过.在AD7705的手册上末尾部分有个时序图.在他的图上数据输入和数据输出都是在CLK脉冲信号上升沿有效的.



void write(unsigned char cc)//写一字节进AD7705

{

        unsigned char i;

       

        for(i=0;i<8;i++){

                if((cc<<i)&0x80) din_1;

                else din_0;                                       

                sck_0;

                sck_0;

                sck_0;

                sck_1;//上升沿输入数据

        }



}



unsigned char read(void)//对主机来讲。SPI是上升沿输出,下降沿输入

{

        unsigned char i,cc;

       

        cc=0;

        for(i=0;i<8;i++){

                sck_0;

                sck_0;

                sck_0;

                sck_0;

                sck_1;       

                cc=cc<<1;        //上升输出

                if(dout)cc=cc+1;

        }

       

        return cc;

}

其中初始话部分

        write(0x20);        //写,正常工作,选定时钟寄存器

        write(0x01);        //输出跟新频率25Hz



        write(0x10);        //选择设置寄存器

        write(0x44);       



        while(drdy);

        write(0x38);

        x=read()*256+read();

        for(x=0;x<10000;x++);

        while(drdy);

        write(0x38);

        x=read()*256+read();

这是我同事写的.

出0入0汤圆

 楼主| 发表于 2007-3-8 17:24:05 | 显示全部楼层
多谢!  加班看看,

出0入0汤圆

发表于 2009-8-31 16:34:48 | 显示全部楼层
初学7705,资料全英文,看一下午没什么收获,11楼的程序刚看了下,挺好的,至少很简洁,但din_0,din1,sck_0,sck_1,dout 是什么意思呢,呵呵大虾可否贴张电路图?不胜感激!!

出0入0汤圆

发表于 2013-5-31 00:19:39 | 显示全部楼层
有些指令不搞不明白呵,

出0入0汤圆

发表于 2013-8-19 21:07:29 | 显示全部楼层
学习中
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 16:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表