📄 adcdrv.c
字号:
//----------------------------------------------------------------------------
//
// FILE NAME VERSION
// ADCdrv.c 1.0
//
// DESCRIPTION
// ADC driver code and command functions for S3C44B0X
// Use MAX1246 4-QSPI ports
//
// DEPENDENCIES
// lib.c
//
// HISTORY:
// 2005.12.24 Arthur Zhu Initial begin
// 2005.06.24 Arthur Zhu support bipolar mode
//----------------------------------------------------------------------------
#include "ADClib.h" // Hardware enviroment and function definitions
#ifdef __cplusplus
extern "C" {
#endif
//////////////////////////////////////////////////////////////////////////////
#ifdef __ADC_AD7706__
//----------------------------------------------------------------------------
// Function name : ADC_init
// Description : 初始化和 AD7706 连接的端口等
// Return type : void
// Argument : void
//----------------------------------------------------------------------------
void ADC_init (void)
{
Delay (1);
}
//----------------------------------------------------------------------------
// Function name : ADC_RD_DAT
// Description : 从AD7706读值子程序
// Return type : short
// Argument : unsigned int cmd: 命令字 (8-bit)
//----------------------------------------------------------------------------
short ADC_RD_DAT (unsigned int cmd)
{
short result; // 定义命令字,和数据存储器
result = 0;
return (result); // 返回键值 16-bit
}
#endif // end of __ADC_AD7706__
//////////////////////////////////////////////////////////////////////////////
#ifdef __ADC_MAX1246__
unsigned char MAX1246_last_pd; // The last PD mode of MAX1246
//----------------------------------------------------------------------------
// Function name : MAX1246_SPI_Write
// Description : 输出数据子程序,从 MAX1246 SPI 接口输出数据至MAX1246
// Return type : void
// Argument : unsigned int cmd: 命令字
// Argument : unsigned char cmd_length: 命令字长
//----------------------------------------------------------------------------
void MAX1246_SPI_Write (unsigned int cmd, unsigned char cmd_length)
{
unsigned char i;
unsigned int cmd_mask;
cmd_mask = 1 << (cmd_length - 1);
MAX1246_CSn_VALID; // 命令开始, CSn = 0
for (i = 0; i < cmd_length; i++) // 送入cmd_lengh (12)位数据,低位在前
{
MAX1246_SCLK_CLR;
if (cmd & cmd_mask) // 输出最高位数据
{
MAX1246_DIN_SET;
}
else
{
MAX1246_DIN_CLR;
}
cmd <<= 1; // 数据输出,高位在前,低位在后
Delay (MAX1246_CMD_DLY);
MAX1246_SCLK_SET; // 上升沿有效
Delay (MAX1246_CMD_DLY);
}
MAX1246_SCLK_CLR;
MAX1246_DIN_CLR;
}
//----------------------------------------------------------------------------
// Function name : MAX1246_SPI_Read
// Description : 输入数据子程序,从 MAX1246 SPI 接口读数据
// Return type : unsigned int
// Argument : unsigned char rd_length: 数据字长
//----------------------------------------------------------------------------
unsigned int MAX1246_SPI_Read (unsigned char rd_length)
{
unsigned char i;
unsigned int cmd; // 定义命令字,和数据存储器
unsigned int rd_data; // 定义命令字,和数据存储器
rd_data = 0; //
MAX1246_CSn_VALID; // 命令开始, CSn = 0
MAX1246_SCLK_SET;
Delay (MAX1246_DAT_DLY);
for (i = 0; i < rd_length; i++)
{
MAX1246_SCLK_CLR; // 产生时钟下降沿通知MAX1246输出下一位
Delay (MAX1246_DAT_DLY);
MAX1246_SCLK_SET;
rd_data <<= 1; // 数据移入rd_data,高位在前,低位在后
rd_data |= MAX1246_DOUT; // 从高到低读入MAX1246的数据
Delay (MAX1246_DAT_DLY);
}
MAX1246_SCLK_CLR;
return (rd_data); // 返回所读取的数据
}
//----------------------------------------------------------------------------
// Function name : MAX1246_WR_CMD
// Description : 输出命令至MAX1246子程序
// Return type : void
// Argument : unsigned int cmd: 命令字 (8-bit)
//----------------------------------------------------------------------------
void MAX1246_WR_CMD (unsigned int cmd)
{
MAX1246_SPI_Write (cmd, MAX1246_CMD_LEN);
MAX1246_CSn_NOVALID; // 命令结束, CSn = 1
}
//----------------------------------------------------------------------------
// Function name : ADC_RD_DAT
// Description : 从MAX1246读值子程序
// Return type : short
// Argument : unsigned int cmd: 命令字 (8-bit)
//----------------------------------------------------------------------------
short ADC_RD_DAT (unsigned int cmd)
{
short result; // 定义命令字,和数据存储器
unsigned char cur_pd; // MAX1246 Current power down mode
cur_pd = cmd & 0x03; // Get the current power down mode
MAX1246_SPI_Write (cmd, MAX1246_CMD_LEN); // 输入命令字
if ( (cur_pd == MAX1246_PD_iCLK) ||
((MAX1246_last_pd == MAX1246_PD_iCLK) && (cur_pd == MAX1246_PD_FA)) ||
((MAX1246_last_pd == MAX1246_PD_iCLK) && (cur_pd == MAX1246_PD_FU)) )
{
MAX1246_CSn_NOVALID; // 命令结束, CSn = 1
while (!MAX1246_SSTRB); // SSTRB is low in iclk mode when
// converting, so wait until SSTRB is high
}
else
{
Delay (MAX1246_CONV_DLY); // wait until convert end
// while (MAX1246_SSTRB); // SSTRB is high in eclk mode when
// converting, so wait until SSTRB is low
}
result = MAX1246_SPI_Read (MAX1246_DAT_LEN); // 读取result
MAX1246_CSn_NOVALID; // 命令结束, CSn = 1
result >>= 4; // 有效值 12-bit (4 zeros at end are dropped)
if ( (cmd & (1 << 3)) == MAX1246_BIP ) // 双极性模式下会产生负的测量结果
{
if (result & (1 << 11)) // 最高位为1(负数)
result |= (0xF << 12); // 按符号位扩展
}
if ( (cur_pd != MAX1246_PD_FA) && (cur_pd != MAX1246_PD_FU) )
MAX1246_last_pd = cur_pd;
return (result); // 返回键值 12-bit
}
//----------------------------------------------------------------------------
// Function name : MAX1246_init -> ADC_init
// Description : 初始化和 MAX1246 连接的端口等
// Return type : void
// Argument : void
//----------------------------------------------------------------------------
void ADC_init (void)
{
// Corresponing to Hardware and ADClib.h settings
#ifdef __MAX1246_FAST__
// Set the SHDNn -> input to let SHDNn float for fast convert
MAX1246_SHDNn_FLOAT;
#else
// Set the SHDNn -> output to use SHDNn for not more fast convert
MAX1246_SHDNn_USE;
MAX1246_SHDNn_NOVALID; // Not Shut Down
#endif
MAX1246_CSn_PORTSET;
MAX1246_CSn_NOVALID;
MAX1246_PORTSET;
MAX1246_DIN_CLR;
MAX1246_SCLK_CLR;
// The default mode of MAX1246 is internal clock mode
MAX1246_last_pd = MAX1246_PD_iCLK;
Delay (MAX1246_CONV_DLY);
}
#endif // end of __ADC_MAX1246__
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -