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

📄 ads1241.c

📁 MSP430单片机C语言应用程序设计实例精讲,单片机开发的朋友可以作为参考
💻 C
字号:
#include <msp430x14x.h>
#include "ADS1241.h"


int ADS1241Init(void)
{
    // 定义初始状态
    P3OUT &= ~(ADS1241_SCLK  | ADS1241_DIN);
    P3OUT |=  (ADS1241_CS); 
    // 方向
    P3DIR = (ADS1241_SCLK | ADS1241_CS | ADS1241_DOUT);
    //设置DRDY管脚
    P1SEL &= ~(ADS1241_DRDY);
    P1DIR &= ~(ADS1241_DRDY);

    return ADS1241_NO_ERROR;
}

int ADS1241WaitForDataReady(int Timeout)
{
	if (Timeout > 0)
	{
		// 判断ADS1241的管脚输出是否是高电平
		while (!(P1IN & ADS1241_DRDY) && (Timeout-- >= 0)) ;
		// 判断ADS1241的管脚输出是否是低电平
		while ( (P1IN & ADS1241_DRDY) && (Timeout-- >= 0)) ;
		if (Timeout < 0)
			return ADS1241_TIMEOUT_WARNING;
	}
	else
	{
		// 判断ADS1241的管脚输出是否是高电平
		while (!(P1IN & ADS1241_DRDY)) ;
		// 判断ADS1241的管脚输出是否是低电平
		while ( (P1IN & ADS1241_DRDY)) ;
	}
	return ADS1241_NO_ERROR;
}

void ADS1241AssertCS( int fAssert)
{
	//分别设置高电平或者低电平
	if (fAssert)
		P3OUT &= ~ADS1241_CS;
	else
		P3OUT |=  ADS1241_CS;
}
void ADS1241SendByte(int Byte)
{
    int i,j;
    for (i=0; i<8; i++)
	{
        // 输出数据
        if (Byte & 0x80)
            P3OUT |=  ADS1241_DIN;
        else
            P3OUT &= ~ADS1241_DIN; 

        // 时钟管脚输出高电平
        P3OUT |=  ADS1241_SCLK;
        //延迟一点时间
        for(j = 20;j > 0;j--) ;
        // 时钟管脚输出低电平
        P3OUT &= ~ADS1241_SCLK;
        //延迟一点时间
        for(j = 20;j > 0;j--) ;
        Byte <<= 1; 
	}
}

unsigned char ADS1241ReceiveByte(void)
{
    unsigned char Result = 0;
    int i,j;
    for (i=0; i<8; i++)
	{
        Result <<= 1; 
        // 时钟管脚输出高电平
        P3OUT |=  ADS1241_SCLK;
        //延迟一点时间
        for(j = 20;j > 0;j--) ;

        //读数据
        if (P3IN & ADS1241_DOUT) Result |=  1;
        // 时钟管脚输出低电平
        P3OUT &= ~ADS1241_SCLK;
        //延迟一点时间
        for(j = 20;j > 0;j--) ;
	}
    return Result;
}
/*
******************************************************************************
*/
long ADS1241ReadData(int fWaitForDataReady)
{
	int j;
	long Data;
	// if requested, synchronize to /DRDY
	if (fWaitForDataReady)
		ADS1241WaitForDataReady(0);

	// 选通ADS1241
	ADS1241AssertCS(1);

	// 发送命令字节
	ADS1241SendByte(ADS1241_CMD_RDATA);

	//延迟一点时间
	for(j = 50;j > 0;j--) ;

	// 得到转换结果
	Data = ADS1241ReceiveByte();
	Data = (Data << 8) | ADS1241ReceiveByte();
	Data = (Data << 8) | ADS1241ReceiveByte();

	// 符号扩展
	if (Data & 0x800000)
		Data |= 0xff000000;

	// 不选通ADS1241
	ADS1241AssertCS(0);
	return Data;
}

int ADS1241ReadRegister(int StartAddress, int NumRegs, unsigned * pData)
{
	int i;

	// 选通ADS1241
	ADS1241AssertCS(1);

	// 发送命令
	ADS1241SendByte(ADS1241_CMD_RREG | (StartAddress & 0x0f));

	// 发送参数
	ADS1241SendByte(NumRegs-1);

	//延迟一点时间
	for(i = 50;i > 0;i--) ;

	// 读取数据
	for (i=0; i< NumRegs; i++)
	{
		*pData++ = ADS1241ReceiveByte();
	}

	// 不选通ADS1241
	ADS1241AssertCS(0);
	return ADS1241_NO_ERROR;
}

int ADS1241WriteRegister(int StartAddress, int NumRegs, unsigned int *pData)
{
	int i;

	// 选通ADS1241
	ADS1241AssertCS(1);

	// 发送命令
	ADS1241SendByte(ADS1241_CMD_WREG | (StartAddress & 0x0f));

	// 发送参数
	ADS1241SendByte(NumRegs-1);

	//延迟一点时间
	for(i = 50;i > 0;i--) ;

	// 发送数据
	for (i=0; i< NumRegs; i++)
	{
		ADS1241SendByte(*pData++);
	}

	// 不选通ADS1241
	ADS1241AssertCS(0);
	return ADS1241_NO_ERROR;
}

int ADS1241SendResetCommand(void)
{
int i;
	// 选通ADS1241
	ADS1241AssertCS(1);

	// 发送命令
	ADS1241SendByte(ADS1241_CMD_RESET);

	// 不选通ADS1241
	ADS1241AssertCS(0);

	//延迟一点时间
	for(i = 50;i > 0;i--) ;

	return ADS1241_NO_ERROR;
}

int ADS1241SetChannel(int MuxCode)
{
unsigned int nTemp;
nTemp = MuxCode;
	ADS1241WriteRegister(ADS1241_MUX_REGISTER, 0x01, &nTemp);
	return ADS1241_NO_ERROR;
}

int ADS1241SetGain(int GainCode)
{
	unsigned Temp;

	// 读出增益
	ADS1241ReadRegister(ADS1241_SETUP_REGISTER, 0x01, &Temp);

	// 增益处理
	Temp &= ~0x07;
	Temp |= GainCode & 0x07;

	// 写入写的增益
	ADS1241WriteRegister(ADS1241_SETUP_REGISTER, 0x01, &Temp);
	return ADS1241_NO_ERROR;
}
void Init_CLK(void)
{
    unsigned int i;
    BCSCTL1 = 0X00;	//将寄存器的内容清零
					//XT2震荡器开启
					//LFTX1工作在低频模式
					//ACLK的分频因子为1
					
    do 
    {
		// 清除OSCFault标志
	    IFG1 &= ~OFIFG;    
	    for (i = 0x20; i > 0; i--);                
    }
    while ((IFG1 & OFIFG) == OFIFG);// 如果OSCFault =1   
					
	//将寄存器的内容清零
    BCSCTL2 = 0X00;		
	//MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELM1;	
	//SMCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;	
}
void main(void)
{
int i;
	char ACRVal;
	unsigned int nTemp;
	long nRes;

	// 初始化时钟
	Init_CLK();
	// ADS1241的初始化
	ADS1241Init();
	// 复位ADS1241	
	ADS1241SendResetCommand();
			
	// 设置增益和复用方式
	ADS1241SetGain(ADS1241_GAIN_1);
	ADS1241SetChannel(0x05 | ADS1241_MUXN_AINCOM);
	
	// 速率 = 15Hz (2.4576MHz, SPEED = 0)
	ACRVal = 0;
	nTemp = 0;
	ADS1241WriteRegister(ADS1241_ACR_REGISTER, 1, &nTemp);
	
	// 内部自校正
	ADS1241AssertCS(1);
	ADS1241SendByte(ADS1241_CMD_SELFCAL);
	ADS1241AssertCS(0);

	for (i=0; i<4; i++)
		ADS1241WaitForDataReady(0);
	
	// 读取数据
	nRes = ADS1241ReadData(1);
	
	return ;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -