/********************************************************
* MSP430和ADS1278连接关键信息
* ADS1/2 SYNC(11)-- START --> MSP P3.7(35)
* ADS1 DIN(12)-- ADIN --> GND
* ADS1 DOUT1(20)--OUTI1 --> ADS2 DIN(12)
* ADS1/2 CLK(27)-- FCLK --> MSP P5.4(48)
* ADS1/2 SCLK(28)-- ADCLK --> MSP P3.3(31)
* ADS1 DRDY(29) 悬空
* ADS2 DRDY(29)-- DRDY--> MSP P1.0(12)
* ADS1/2 D0~2(30~32)-- D0~2 --> MSP P1.1~1.3(13~15)
* ADS1/2 MODE0~1(33~34)--M0~1 --> MSP P1.6~1.7(18~19)
*******************************************************/
#include <msp430f247.h>
#include <math.h>
/*
* 数据类型声明
*/
typedef unsigned char uint8; /* 8 bits */
typedef unsigned short int uint16; /* 16 bits */
typedef unsigned long int uint32; /* 32 bits */
typedef unsigned long long uint64; /* 64 bits */
typedef char int8; /* 8 bits */
typedef short int int16; /* 16 bits */
typedef long int int32; /* 32 bits */
typedef long long int64; /* 64 bits */
typedef volatile int8 vint8; /* 8 bits */
typedef volatile int16 vint16; /* 16 bits */
typedef volatile int32 vint32; /* 32 bits */
typedef volatile int64 vint64; /* 64 bits */
typedef volatile uint8 vuint8; /* 8 bits */
typedef volatile uint16 vuint16; /* 16 bits */
typedef volatile uint32 vuint32; /* 32 bits */
typedef volatile uint64 vuint64; /* 64 bits */
//数据类型声明 end
/*
* 用户宏定义声明
*/
#define ADS1278_START (P3OUT |= BIT7) // P3.7输出高电平 START(同步信号输入(所有通道))
#define ADS1278_DRDY (P1IN&BIT0) //P1.0管脚输入电平状态 DRDY(检测这个状态)
//用户自定义变量声明 end
/*
* 用户自定义变量
*/
uint8 data[48] = {0};
uint32 results[16] = {0};
//用户自定义变量 end
/*
* 用户自定义函数声明
*/
void delay_ms(uint32 nValue);//ms延迟函数
void delay_us(uint8 nValue); //us延迟函数
void devices_init(void); //设备初始化函数
void clk_init( void ); //MCLK初始化函数
void spi_init(void); //SPI初始化函数
void ADS1278_init(void); //ADS1278初始化函数
void ADS1278_write(uint8 byteword); //write_ADS1278函数
void ADS1278_read(void); //read_ADS1278函数
void ADS1278_data_change(void); //ADS1278_data_change函数
//用户自定义函数声明 end
/*!
* @brief main函数
* @note ADS1278模数转换实验
*/
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; //Stop watchdog
devices_init(); //设备初始化
ADS1278_START; //P3OUT |= BIT7
__bis_SR_register(GIE); //使能全局中断
while (1)
{
_NOP();
//ADS1278_START; //P3OUT |= BIT7,重新启动
//ADS1278_data_change();
}
}
//main函数 end
/*!
* @brief I/O中断服务函数
*/
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
//__bis_SR_register(GIE); //使能全局中断
delay_us(10); //延迟再次判断 为低电平
// if(ADS1278_DRDY==0) //宏定义(P1IN&0x01)
// {
// ADS1278_read();
// ADS1278_data_change();
// _NOP();
// }
ADS1278_read();
ADS1278_data_change();
P1IFG &= ~0x01; // P1.0 IFG cleared
}
//P1.0 I/O中断服务函数 end
/*!
* @brief 设备初始化函数
*/
void devices_init(void)
{
clk_init(); //MCLK初始化函数
//delay_ms(50);
spi_init(); //SPI初始化
ADS1278_init(); //ADS1278初始化
}
//设备初始化函数 end
/*!
* @brief MCLK初始化函数
*/
void clk_init( void )
{
vuint16 i;
BCSCTL1 &= ~ XT2OFF; // 使能XT2振荡器
BCSCTL3 |= XT2S_2; // 选择XT2振荡器工作在3~16MHz
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while (IFG1 & OFIFG); // OSCFault flag still set?
BCSCTL2 = SELM_2 + SELS + DIVS_0 + DIVM_0;// MCLK Source Select XT2,MCLK/SMCLK Divider 2分频 8/=8MHz
}
//MCLK初始化函数 end
/*!
* @brief SPI初始化函数
*/
void spi_init(void)
{
//开启I/O口管教的SPI功能 P3.2(UCB0SOMI),P3.3(UCB0CLK),P3.2(UCB0SIMO)
P3SEL = BIT2 + BIT3; // + BIT1
//设置BSCIBO模块工作在主机模式
//时钟无效状态为高,工作在三线制主机模式下,数据最高有效位在前
UCB0CTL1 |= UCSWRST; // **Put state machine in reset**
UCB0CTL0 |= UCMST+UCSYNC+UCMSB; // 3-pin, 8-bit SPI master MSB 1st
UCB0CTL0 |= UCCKPH; //相位控制1,第一个沿上捕获接受,下一个发送
UCB0CTL0 |= UCCKPL; //时钟极性1,非活动状态下时钟为高电平
//设置时钟源为SMCLK
UCB0CTL1 = UCSSEL_2; // SMCLK
UCB0BR0 |= 0x02; //设置时钟分频系数2 4M
UCB0BR1 = 0;
UCB0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
}
//SPI初始化函数 end
/*!
* @brief ADS1278初始化函数
*/
void ADS1278_init(void)
{
//P5DIR |= BIT5;
//P5SEL |= BIT5;
//P5DIR |= BIT4;
//P5SEL |= BIT4;
P1DIR &= ~BIT0; //P1.0管脚方向为输入 DRDY(ADS1278数据就绪输出状态)
P1OUT |= BIT0; //P1.0管脚内部上拉??模式改变后变高,知道数据设置完成(准备就绪)
P1REN |= BIT0;
P1IE |= BIT0; // P1.0 interrupt enabled
P1IES |= BIT0; // P1.0 中断沿为下降沿
P1IFG &= ~BIT0; // P1.0 IFG cleared
P1DIR |= BIT1 + BIT2 + BIT3; //P1.1~3管脚方向为输出 D0~2(RORMAT[2:0])
P1OUT |= BIT1; //001 SPI TDM 固定
P1OUT &= ~(BIT2 + BIT3); //001
P1DIR |= BIT6 + BIT7; //P1.6~7管脚方向为输出 M0~1(MODE[1:0])
P1OUT |= BIT6 + BIT7; //11 低速模式(CLKDIN已经接地拉低了)
//P3DIR |= BIT1; //P3.1管脚方向为输出 ADIN
//P3OUT &= ~BIT1; //0拉低
P3DIR |= BIT7; // P3.7管脚方向为输出 START(同步信号输入(所有通道)
P3OUT &= ~BIT7;
}
//ADS1278初始化函数 end
#if 1
/*!
* @brief write_ADS1278函数
*/
void ADS1278_write(uint8 byteword)
{
UCB0TXBUF = byteword;
while (!(IFG2&UCB0TXIFG)); // USCI_B0 TX buffer ready?
//IFG2 &=~UCB0TXIFG;
}
//writeADS1278函数 end
#endif
/*!
* @brief read_ADS1278函数
*/
void ADS1278_read(void)
{
uint8 k;
delay_us(2);
for(k=0; k<48; k++)
{
ADS1278_write(0x00);
while(!(IFG2&UCB0RXIFG));
data[k] = UCB0RXBUF;
}
}
//read_ADS1278函数 end
/*!
* @brief ADS1278_data_change函数
*/
void ADS1278_data_change(void)
{
uint8 ch,k;
for(ch=0; ch<16; ch++)
{
k=ch*3;
results[ch] =(((uint32)data[k])<<16);
k++;
results[ch] +=(((uint32)data[k])<<8);
k++;
results[ch] +=data[k];
}
}
//ADS1278_data_change函数 end
/*!
* @brief ms延迟函数
*/
void delay_ms(uint32 nValue)
{
uint8 i;
uint32 j;
uint32 nCount;
nCount=(uint32)(2667/8*11.0592);
for (i=nValue;i>0;i--)
{
for (j=nCount;j>0;j--);
}
}
//ms延迟函数 end
/*!
* @brief us延迟函数
*/
void delay_us(uint8 nValue)
{
uint8 i;
for (i=nValue;i>0;i--)
{
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
}
//us延迟函数 end
评论2