打印
[AVR单片机]

AD7490和ATMEGA88PA通信

[复制链接]
1989|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
albertfg|  楼主 | 2013-10-22 22:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 albertfg 于 2013-10-22 22:48 编辑

最近在用AD7490,跟ATmega88PA通信,程序如下,想循环依次转换0-11通道,但是转换结果总是会漏通道或者有的通道出现两三次,不知什么原因?还望各位大侠批评指正~!
WEAK/TRI —— This bit selects the state of the DOUT line at the end of the current serial transfer. If it is set to 1, the
DOUT line will be weakly driven to the channel address bit ADD3 of the ensuing conversion. If this bit is
set to 0, then DOUT will return to three-state at the end of the serial transfer. See the Serial Interface
section for more details.划线句怎么理解呢,跟转换后输出三态有什么关系呢?

#define F_CPU 1843200UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_BAUD 9600UL
#include <avr/wdt.h>

#define uint unsigned int
#define uchar unsigned char
#define SHDN PORTB0
#define BUSY PORTB1
#define CS PORTB2
#define MOSI PORTB3
#define MISO PORTB4
#define SCK PORTB5

uchar volatile i;

void uart0_init(void)
{
        UCSR0B = _BV(RXEN0) | _BV(TXEN0) | _BV(RXCIE0); //允许接收和发送,接收中断使能
        UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); //8位数据位,一位停止位
        UBRR0H = (F_CPU / F_BAUD / 16 - 1) / 256;
        UBRR0L = (F_CPU / F_BAUD / 16 - 1) % 256; //波特率:1200
}

void USART_Transmit(char data)
{
        //等待发送缓冲器为空
        while (!(UCSR0A & (1 << UDRE0)))
        ;
        //将数据放入缓冲器,发送出据
        UDR0 = data;
}

void SPI_Init()                                                                                //SPI初始化
{
        uint temp;
        PORTB=0x00;
        DDRB = _BV(SCK)|_BV(MOSI)|_BV(CS)|_BV(SHDN);//0x2D配置为输出
        PORTB = _BV(BUSY)|_BV(SHDN);//0x13
        SPCR=0x50;
        // SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
        /*SPCR &= ~(_BV(SPIE)|_BV(DORD)|_BV(CPOL)|_BV(CPHA));                                // 0101 0011
        SPCR |= (_BV(SPE)|_BV(MSTR)|_BV(SPR1)|_BV(SPR0));        */                        //0X53 SPI使能,配置为主机,时钟为fock/128分频
        SPSR |=_BV(SPI2X);                                                                                        //没有倍频
        
        temp=SPSR;//清除SPIF标志位。
        temp=SPDR;
}

uint AD_RW(uchar CMD1)
{
        uchar temp;
        unsigned char AD_Result_High;
        unsigned char AD_Result_Low;
        PORTB &= ~_BV(PORTB2);
        
        SPDR=CMD1;                   //传输控制位,启动AD转换!选中电压通道
        while (!(SPSR & (1 << SPIF)))
        {
        };     //等待控制位传输完成
        temp=SPSR;        //清SPIF位
        //                temp=SPDR;
        
        AD_Result_High = SPDR;              //存储高8位
        SPDR=0X50;
        while (!(SPSR & (1 << SPIF)))
        {
        };     //等待控制位传输完成
        
        temp=SPSR;        //清SPIF位
        //temp=SPDR;

        AD_Result_Low = SPDR;               //存储低8位
        PORTB|=_BV(PORTB2);
        USART_Transmit(AD_Result_High);   //串口发送
        
        USART_Transmit(AD_Result_Low);

}

int main(void)
{
        uchar ADC_Addr[16]={0x83,0x87,0x8B,0x8f,0x93,0x97,0x9b,0x9f,
                                                0xa3,0xa7,0xab,0xAf,0xb3,0xb7,0xbb,0xbf};
        PORTB |=  _BV(PORTB2);
        SPI_Init();
        
        PORTD = 0XFF;
        uchar temp;
        
        uart0_init();
        
        DDRC = 0XFF;
        PORTC = 0XFF;
        PORTC = 0XFF;

        unsigned long COUNTER = 0;
        wdt_enable(WDTO_8S);

        unsigned long loopcount = 0UL;
        #define LOOPCOUNT 10000UL
        //    sei();
        SPDR=0xFF;                   //传输控制位,启动AD转换!选中电压通道
        while (!(SPSR & (1 << SPIF)))
        {
        };     //等待控制位传输完成
        temp=SPSR;        //清SPIF位
        temp=SPDR;
        SPDR=0xFF;                   //传输控制位,启动AD转换!选中电压通道
        while (!(SPSR & (1 << SPIF)))
        {
        };     //等待控制位传输完成
        temp=SPSR;        //清SPIF位
        temp=SPDR;
        
                SPDR=0x83;                   //传输控制位,启动AD转换!选中电压通道
                while (!(SPSR & (1 << SPIF)))
                {
                };     //等待控制位传输完成
                temp=SPSR;        //清SPIF位
                temp=SPDR;
                SPDR=0x50;                   //传输控制位,启动AD转换!选中电压通道
                while (!(SPSR & (1 << SPIF)))
                {
                };     //等待控制位传输完成
                temp=SPSR;        //清SPIF位
                temp=SPDR;
        
        _delay_ms(100);
        while(1)
                        {                for(i=0;i<12;i++)
                                                {        USART_Transmit(0x55);
                                                        USART_Transmit(0x7A);
                                                        USART_Transmit(0x0E);
                                                        USART_Transmit(0x60);
                                                        USART_Transmit(0x00);
                                                        USART_Transmit(0x01);
                                                        USART_Transmit(0x6E);
                                                        USART_Transmit(0xAB);
                                                        USART_Transmit(0x00);
                                                        USART_Transmit(0x01);
                                                        AD_RW(ADC_Addr);
                                                        USART_Transmit(0x02);
                                                        USART_Transmit(0x03);
                                                        USART_Transmit(0x00);
                                                        USART_Transmit(0x00);
                                                        wdt_reset();
                                                        _delay_ms(100);
                                                }        
                                                }                                                                                       
        
                        
}
               

相关帖子

沙发
qin552011373| | 2013-10-24 13:31 | 只看该作者
弱驱动地址

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝