📄 ad7794.c
字号:
#include "msp430x44x.h"
#include "math.h"
#include "../utility/delay.h"
#include "../main/parameter.h"
#include "IO_init.h"
#include "ad7794.h"
void write_8bit(unsigned char writeData)
{
unsigned char j;
SET_SCLK;
for(j = 0; j < 8; j++)
{
if(writeData & 0x80) SET_DOUT;
else CLR_DOUT;
CLR_SCLK;
writeData <<= 1;
SET_SCLK;
}
SET_DOUT;
}
void write_16bit(unsigned int writeData)
{
unsigned char j;
SET_SCLK;
for(j = 0; j < 16; j++)
{
if(writeData & 0x8000) SET_DOUT;
else CLR_DOUT;
CLR_SCLK;
writeData <<= 1;
SET_SCLK;
}
SET_DOUT;
}
unsigned char read_8bit(void)
{
unsigned char readData;
unsigned char j;
SET_SCLK;
SET_DOUT;
for(j = 0; j < 8; j++)
{
CLR_SCLK;
readData <<= 1;
if(READ_DIN == ADC_DIN) readData |= 1;
SET_SCLK;
}
return readData;
}
unsigned int read_16bit(void)
{
unsigned int readData;
unsigned char j;
SET_SCLK;
SET_DOUT;
for(j = 0; j < 16; j++)
{
CLR_SCLK;
readData <<= 1;
if(READ_DIN == ADC_DIN) readData |= 1;
SET_SCLK;
}
return readData;
}
unsigned int read_24bit(void)
{
//unsigned long int readData;
unsigned int readData;
unsigned char j;
SET_SCLK;
SET_DOUT;
for(j = 0; j < 16; j++)
{
CLR_SCLK;
readData <<= 1;
if(READ_DIN == ADC_DIN) readData |= 1;
SET_SCLK;
}
for(j = 0; j < 8; j++)
{
CLR_SCLK;
CLR_SCLK;
SET_SCLK;
SET_SCLK;
}
return readData;
}
unsigned char AD7794ReadConfig(unsigned char adcType)
{
unsigned char temp;
SET_SCLK;
SET_DOUT;
if(adcType == 0)
{
CLR_ADCS0;
}
else
{
CLR_ADCS1;
}
write_8bit(STATUS_REGISTER | READ);
temp = read_8bit();
if(temp == 0x4D)//channel 6
temp = 0x0D;
temp &= 0x78;
SET_ADCS0;
SET_ADCS1;
return temp;
}
unsigned int read_adc(unsigned char adcType)
{
unsigned int readData;
SET_SCLK;
SET_DOUT;
SET_ADCS0;
SET_ADCS1;
if(adcType == 0)
{
CLR_ADCS0;
}
else
{
CLR_ADCS1;
}
write_8bit(READ | DATA_REGISTER);
SET_DOUT;
readData = read_24bit();
SET_ADCS0;
SET_ADCS1;
return readData;
}
void set_adc_channel(unsigned int adcChannel, unsigned char adcType)
{
unsigned int temp;
SET_SCLK;
SET_DOUT;
SET_ADCS0;
SET_ADCS1;
if(adcType == 0)
{
do
{
CLR_ADCS0;
write_8bit(CONFIG_REGISTER);
write_16bit(adcChannel);
SET_ADCS0;
CLR_ADCS0;
write_8bit(CONFIG_REGISTER | READ);
temp = read_16bit();
SET_ADCS0;
}
while(temp != adcChannel);
adcChannel &= 0x07;
do
{
CLR_ADCS0;
write_8bit(STATUS_REGISTER | READ);
temp = (unsigned int)read_8bit();
SET_ADCS0;
temp &= 0x07;
}
while(temp != adcChannel);
}
else
{
do
{
CLR_ADCS1;
write_8bit(CONFIG_REGISTER);
write_16bit(adcChannel);
SET_ADCS1;
CLR_ADCS1;
write_8bit(CONFIG_REGISTER | READ);
temp = read_16bit();
SET_ADCS1;
}
while(temp != adcChannel);
adcChannel &= 0x07;
do
{
CLR_ADCS1;
write_8bit(STATUS_REGISTER | READ);
temp = (unsigned int)read_8bit();
SET_ADCS1;
temp &= 0x07;
}
while(temp != adcChannel);
}
delay_ms(SAMPLING_TIME/2);
read_adc(adcType);
}
void ADCPortInit(void)
{
ADC_SEL &= ~(ADC_SCLK + ADC_DIN + ADC_DOUT + ADC_PSW + ADCCS0 + ADCCS1);
ADC_DIR |= ADC_SCLK + ADC_DOUT + ADC_PSW + ADCCS0 + ADCCS1;
DIN_IN;
delay_ms(5);
ADC_OUT |= ADC_SCLK + ADC_DOUT + ADC_PSW + ADCCS0 + ADCCS1;
delay_ms(500);
}
void ADCInit(void)
{
unsigned int temp, ADCParameter;
SET_SCLK;
SET_DOUT;
SET_ADCS0;
SET_ADCS1;
do
{
CLR_ADCS0;
write_8bit(STATUS_REGISTER | READ);
temp = (unsigned int)read_8bit();
temp &= 0x58;
SET_ADCS0;
}
while(temp != 0x08);
do
{
ADCParameter = CONTINUOUS_MODE | ADC_470HZ;
CLR_ADCS0;
//set adc mode register
write_8bit(MODE_REGISTER);
write_16bit(ADCParameter);
SET_ADCS0;
CLR_ADCS0;
//set adc mode register
write_8bit(MODE_REGISTER | READ);
temp = read_16bit();
SET_ADCS0;
}
while(temp != ADCParameter);
do
{
CLR_ADCS0;
//set adc mode register
write_8bit(CONFIG_REGISTER);
write_16bit(VRR_CHANNEL);
SET_ADCS0;
CLR_ADCS0;
//set adc mode register
write_8bit(CONFIG_REGISTER | READ);
temp = read_16bit();
SET_ADCS0;
}
while(temp != VRR_CHANNEL);
CLR_ADCS0;
//enable AIN6 as analog input
write_8bit(IO_REGISTER);
write_8bit(0);
SET_ADCS0;
delay_ms(1);
#if DOUBLE_ADC == 1
//init adc1
do
{
CLR_ADCS1;
write_8bit(STATUS_REGISTER | READ);
temp = (unsigned int)read_8bit();
temp &= 0x58;
SET_ADCS1;
}
while(temp != 0x08);
do
{
ADCParameter = CONTINUOUS_MODE | ADC_470HZ;
CLR_ADCS1;
//set adc mode register
write_8bit(MODE_REGISTER);
write_16bit(ADCParameter);
SET_ADCS1;
CLR_ADCS1;
//set adc mode register
write_8bit(MODE_REGISTER | READ);
temp = read_16bit();
SET_ADCS1;
}
while(temp != ADCParameter);
do
{
CLR_ADCS1;
//set adc mode register
write_8bit(CONFIG_REGISTER);
write_16bit(VH_CHANNEL);
SET_ADCS1;
CLR_ADCS1;
//set adc mode register
write_8bit(CONFIG_REGISTER | READ);
temp = read_16bit();
SET_ADCS1;
}
while(temp != VH_CHANNEL);
CLR_ADCS1;
//enable AIN6 as analog input
write_8bit(IO_REGISTER);
write_8bit(0);
SET_ADCS1;
#endif
}
void ADCLowPowerMode(void)
{
//enable analog power supply
SET_PWR;
SET_ADCS0;
SET_ADCS1;
SET_PSW;
CLR_DOUT;
CLR_SCLK;
}
void ADCActiveMode(void)
{
//enable analog power supply
CLR_PWR;
SET_SCLK;
SET_DOUT;
SET_ADCS0;
SET_ADCS1;
SET_PSW;
CLR_DOUT;
CLR_SCLK;
delay_ms(100);
ADCInit();
delay_ms(30);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -