/* dac5628.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include "STM8S207R.h"
#include "STM8S207R8.h"
#include "config.h"
#include "dac5628.h"
extern strdefRun_Inf pRun_Inf;
extern strdefDAC pDAC;
extern strdefEEPROM pEE;
extern unsigned char para_chan_sta[NUMBER_OF_CHANNELS];
/*******************************************************************************
* @函数名称 SoftDelay
* @函数说明 软延时函数
* @输入参数 Cycles
* @输出参数 无
* @返回参数 无
*****************************************************************************/
void SoftDelay(unsigned int Cycles)
{
unsigned int TempWord1;
for (TempWord1 = 0; TempWord1 < Cycles; TempWord1++);
}
/*******************************************************************************
* @函数名称 output
* @函数说明 通道输出函数
* @输入参数 channel
* @输出参数 无
* @返回参数 无
*****************************************************************************/
void output(unsigned char channel)
{
float temp;
float temp1;
if(channel > 7) return;
if(((pDAC.output_data[channel] > 32767) && (pDAC.output_data[channel] < 65035 ))||(pDAC.output_data[channel] < 10500))
{
para_chan_sta[channel] = 0;
if(pDAC.output_data[channel] > 32767)
{
temp = pDAC.output_data[channel] - 65536;
}
else
{
temp = pDAC.output_data[channel];
}
temp1 = (float)(pEE.EE_data_h[channel]-pEE.EE_data_l[channel]);
temp = (temp / 10000) * temp1;
temp = temp + (float)pEE.EE_data_l[channel];
DACStart(temp, channel);
}
else
{
para_chan_sta[channel] = 1;
}
}
/*******************************************************************************
* @函数名称 DACReg_Init
* @函数说明 DAC寄存器初始化函数
* @输入参数 DACValue
* @输出参数 无
* @返回参数 无
*****************************************************************************/
void DACReg_Init(unsigned long DACValue)
{
unsigned long TempWord = DACValue;
unsigned char TempByte;
Write_singleIO(SYNC_PORTX, SYNC_PORT_NUMBER, LOW_LEVEL);
SoftDelay(1);
// Write DAC data.
for (TempByte = 0; TempByte < 32; TempByte++)
{
if (0x80000000 & TempWord)
{
Write_singleIO(DIN_PORTX, DIN_PORT_NUMBER, HIGH_LEVEL);
}
else
{
Write_singleIO(DIN_PORTX, DIN_PORT_NUMBER, LOW_LEVEL);
}
SoftDelay(0);
Write_singleIO(SCLK_PORTX, SCLK_PORT_NUMBER, HIGH_LEVEL);
SoftDelay(0); //9ns
Write_singleIO(SCLK_PORTX, SCLK_PORT_NUMBER, LOW_LEVEL);
SoftDelay(0); //9ns
TempWord <<= 1;
}
SoftDelay(0);
Write_singleIO(SYNC_PORTX, SYNC_PORT_NUMBER, HIGH_LEVEL);
SoftDelay(4); //20ns
}
/*******************************************************************************
* @函数名称 DACStart
* @函数说明 DA转换函数
* @输入参数 DACValue,DACCh
* @输出参数 无
* @返回参数 无
*****************************************************************************/
void DACStart(unsigned int DACValue, unsigned char DACCh)
{
unsigned long TempWord = 0x00000000;
unsigned char TempByte;
unsigned char Channel[8] = {0, 2, 4, 6, 7, 5, 3, 1};
// Calculate data for DAC chip.
TempWord += 0x03; // command 4bit 向通道写数据
TempWord <<= 4;
TempWord += (Channel[DACCh]); // address 4bit
TempWord <<= 12;
TempWord += (DACValue); // DATA 12bit
TempWord <<= 8; //8bit free
Write_singleIO(SYNC_PORTX, SYNC_PORT_NUMBER, LOW_LEVEL);
SoftDelay(1);
// Write DAC data.
for (TempByte = 0; TempByte < 32; TempByte++)
{
if (0x80000000 & TempWord)
{
Write_singleIO(DIN_PORTX, DIN_PORT_NUMBER, HIGH_LEVEL);
}
else
{
Write_singleIO(DIN_PORTX, DIN_PORT_NUMBER, LOW_LEVEL);
}
//SoftDelay(0);
Write_singleIO(SCLK_PORTX, SCLK_PORT_NUMBER, HIGH_LEVEL);
//SoftDelay(0); //9ns
Write_singleIO(SCLK_PORTX, SCLK_PORT_NUMBER, LOW_LEVEL);
//SoftDelay(0); //9ns
TempWord <<= 1;
}
//SoftDelay(0);
Write_singleIO(SYNC_PORTX, SYNC_PORT_NUMBER, HIGH_LEVEL);
//SoftDelay(0);
}