⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adcdrv.c

📁 用c编写的基于ARM的max1246的驱动程序源码和应用示例。
💻 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 + -