?? 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 + -