ADC CS5511AVR驅動程序:
電路如下圖:
/*************************************************************************
** AVR Studio V4.16 **
** WinAVR-20090313 **
** Created By SourceInsight V3.50 **
**************************************************************************
** Program By:Richard.Mo **
** E-mail:moxudong@yeah.net **
** File Name: _adc.h **
** Last Update:2010-09-05 13:08 **
** Modify Content: **
*************************************************************************/
#ifndef __ADC_H__
#define __ADC_H__
#include <avr/io.h>
#include <util/delay.h>
#define ADC_RES_PORT PORTC
#define ADC_RES_DIR DDRC
#define ADC_RES_DATA PINC
#define ADC_BIT_CLK PC0
#define ADC_BIT_DATA PC1
#define ADC_BIT_CS PC2
#define ADC_SET_CLK (ADC_RES_PORT |= (1 << ADC_BIT_CLK))
#define ADC_CLR_CLK (ADC_RES_PORT &= ~(1 << ADC_BIT_CLK))
#define ADC_SET_DATA (ADC_RES_PORT |= (1 << ADC_BIT_DATA))
#define ADC_CLR_DATA (ADC_RES_PORT &= ~(1 << ADC_BIT_DATA))
#define ADC_SET_CS (ADC_RES_PORT |= (1 << ADC_BIT_CS))
#define ADC_CLR_CS (ADC_RES_PORT &= ~(1 << ADC_BIT_CS))
#define ADC_BIT_VALUE (ADC_RES_DATA & (1 << ADC_BIT_DATA))
#endif
/*********************************************************************************
** End of _adc.h **
*********************************************************************************/
/*************************************************************************
** AVR Studio V4.16 **
** WinAVR-20090313 **
** Created By SourceInsight V3.50 **
**************************************************************************
** Program By:Richard.Mo **
** E-mail:moxudong@yeah.net **
** File Name: _adc.c **
** Last Update:2010-08-31 22:41 **
** Modify Content: **
*************************************************************************/
#include <avr/io.h>
#include <util/delay.h>
uint16_t adc_convert( void )
{
uint8_t i = 0;
uint32_t data = 0;
ADC_CLR_CS;
_delay_us(100); //Waitting 16bits-Data ready
while(ADC_BIT_VALUE);
for(i=0; i<24; i++)
{
data <<= 1;
ADC_SET_CLK;
_delay_us(10); //Data Ready to output
ADC_CLR_CLK;
_delay_us(10); //Output at SDO
if(ADC_BIT_VALUE) //Read SDO
data |= 0x00000001;
}
ADC_SET_CS;
return((uint16_t)data); // return XXXX mV
}
void adc_init( void )
{
SW_RES_PORT |= ((1 << SW_BIT_ADDR0) | (1 << SW_BIT_ADDR1) | //Simulator switch ctrl prots init
(1 << SW_BIT_ADDR2) | (1 << SW_BIT_ADDR_REF));
SW_RES_DDR |= ((1 << SW_BIT_ADDR0) | (1 << SW_BIT_ADDR1) |
(1 << SW_BIT_ADDR2) | (1 << SW_BIT_ADDR_REF));
ADC_RES_PORT |= ((1 << ADC_BIT_CLK) | (1 << ADC_BIT_DATA) | (1 << ADC_BIT_CS));
ADC_RES_DIR |= ((1 << ADC_BIT_CLK) | (1 << ADC_BIT_CS));
ADC_RES_DIR &= ~(1 << ADC_BIT_DATA); //Set SDO as input
ADC_SET_CS;
ADC_CLR_CLK; //WAKE UP
_delay_ms(1);
}
/*********************************************************************************
** End of _adc.c **
*********************************************************************************/