📄 ads1241.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 + -