ads1294使用问题
问题1:芯片的DVDD我是采用插针外部提供的,但是我发现只要一上电,我还没有短接插针,从而给DVDD连接上外部供电时,用万用表测量DVDD引脚就已经有大概2v左右的电压,而且不是稳定值
问题2:按照下面的程序,执行SendCode指令给ads1294发送数据时DOUT引脚一直为低,没有变化,SPI通信主机发送指令的时候从机不是应该会返回数据么,至于时钟我已经检查,SendCode指令执行的时候正常的产生了时钟信号,频率为4MHz
问题3:DRDY一直为高,程序一直卡在while((P1IN&ADS1294_DRDY)!=0);
问题4:当我设置成测试模式时,DOUT引脚会在一上电就会不停的输出频率为50Hz左右的方波,这个测试信号按道理应该在输入端,怎么会在DOUT输出?
请专家给解决一下,谢谢!主控芯片为MSP430f149 ,测试仪器为逻辑分析仪,采用IAR JTAG在线调试
#include <msp430f149.h>
/******************************************************************************/
/* ADS1294PWDN(35引脚)与P1.2连接 */
/* ADS1294START(38引脚)与P1.1连接 */
/* ADS1294DRDY(47引脚)和p1.0连接 */
/* ADS1294CS(39引脚)和p3.0连接 */
/* ADS1294DOUT(43引脚)和p3.2连接 */
/* ADS1294DIN(34引脚)和p3.1连接 */
/* ADS1294SCLK(40引脚)和p3.3连接 */
/******************************************************************************/
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //单位延时10us
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //单位延时10ms
#define baud 9600 //设置波特率的大小
#define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率计算公式
#define baud_h (uchar)(baud_setting>>8) //提取高位
#define baud_l (uchar)(baud_setting) //低位
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define ADS1294_CS BIT0 // P3.0
#define ADS1294_DIN BIT1 // P3.1
#define ADS1294_DOUT BIT2 // P3.2
#define ADS1294_SCLK BIT3 // P3.3
#define ADS1294_DRDY BIT0 // P1.0
#define ADS1294_START BIT1 // p1.1
#define ADS1294_PWDN BIT2 // p1.2
#define ADS1294_CMD_WREG 0x40
unsigned char inicializacion1[3]={0x86,0x20,0xC0};//0x30测试模式,0x20常规模式
unsigned char inicializacion2[4]={0x60,0x60,0x60,0x60};//0x65测试模式,0x60正常模式
unsigned char inicializacion3[2]={0x03,0xD4};
//*************************************************************************
// 初始化端口
//*************************************************************************
void PortInit(void)
{
P3SEL |= BIT1+BIT2+BIT3+BIT6+BIT7; //spi功能模式同时设置P3.6 p3.7为UASRT发送和接收
P3OUT |= BIT0;//ads1294不选通
P3DIR |= BIT0;
P3DIR |= BIT1;
P3DIR |= BIT3;
P3DIR |= BIT6; // msp430为主机模式,SOMI引脚(p3.2)方向设置为输入,设置P3.6口方向为UART输出
P3DIR &= ~(BIT2);
//设置DRDY管脚
P1SEL &= ~(BIT0+BIT1+BIT2);//IO功能模式
P1DIR &= ~BIT0;
P1DIR |= (BIT2+BIT1);
P1OUT &=~(BIT1+BIT2);//关闭STRAT,设置芯片掉电
}
//*************************************************************************
// 初始化时钟
//*************************************************************************
void Init_CLK(void)
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2 = 0X00; //将寄存器的内容清零
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do{
IFG1&=~OFIFG; //清除震荡标志
for(i=0;i<100;i++)
_NOP(); //延时等待
}
while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
IFG1&=~OFIFG;
}
//*************************************************************************
// 初始化UART,用于发送到蓝牙设备
//*************************************************************************
void UART_Init()
{
U1CTL|=SWRST; //复位SWRST
U1CTL|=CHAR; //8位数据模式
U1TCTL|=SSEL1; //SMCLK为串口时钟
U1BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U1BR0=baud_l; //N=UBR+(UxMCTL)/8
U1MCTL=0x00; //微调寄存器为0,波特率9600bps
ME2|=UTXE1; //UART1发送使能
ME2|=URXE1; //UART1接收使能
U1CTL&=~SWRST;
IE2|=URXIE1; //接收中断使能位
}
//*************************************************************************
// 初始化SPI
//*************************************************************************
void Init_SPI()
{
U0CTL |= SWRST;
U0CTL |= CHAR + SYNC + MM; // 8-bit, SPI, Master
U0TCTL &=~ (SSEL0+SSEL1+CKPL); //清除之前的时钟设置
U0TCTL |=CKPH;
U0TCTL |=SSEL1;
U0TCTL |=STC; //时钟源为SMCLK,3线模式,下降沿数据有效
U0BR0 = 0x02; // SPICLK = SMCLK/2
U0BR1 = 0x00;
U0MCTL = 0x00;
ME1 = USPIE0; //SPI0模块允许
U0CTL &= ~SWRST; //SPI使能
//IE1 |= URXIE0; //接收中断允许
//_EINT(); //开总中断
}
//*************************************************************************
// SPI发送函数
//*************************************************************************
unsigned char SendCode(unsigned char code)
{
while ((IFG1 & UTXIFG0) == 0); //等待发送完成
IFG1 &= ~UTXIFG0; //清掉发送标志
TXBUF0=code; //发送命令
while ((IFG1 & URXIFG0) == 0); //等待接收完成
IFG1 &= ~URXIFG0; //清掉接收标志位
return(U0RXBUF);
}
//*************************************************************************
// 片选控制
//*************************************************************************
void ADS1294AssertCS( int fAssert)
{
//分别设置高电平或者低电平
if (fAssert)
P3OUT &= ~ADS1294_CS;//低电平,片选信号置低,有效
else
P3OUT |= ADS1294_CS;//高电平,片选信号置高,无效
}
//*************************************************************************
// 写寄存器
//*************************************************************************
void ADS1294WriteRegister(int StartAddress, int NumRegs, unsigned char *pData)
{
int i;
SendCode(StartAddress);// 发送起始地址
SendCode(NumRegs-1);// 发送数量
for (i=0; i< NumRegs; i++)// 发送数据
{
SendCode(*(pData++));
}
}
//*************************************************************************
// 主函数
//*************************************************************************
void main()
{
WDTCTL = WDTPW + WDTHOLD;
int j;
long dato[5];
uchar dato1,dato2,dato3;
PortInit();
Init_CLK();
Init_SPI();
UART_Init();
//*************************************************************************
// ads1294工作程序流程
//*************************************************************************
//CLKSEL外部强制拉高
P1OUT |= ADS1294_PWDN;//拉高PWDN,给芯片内部上电
//RESET外部强制拉高
delay_ms(100); //延时1s
ADS1294AssertCS(1); // 选通ADS1294
SendCode(0x06); //发送复位操作码
delay_us(100); //延时1ms
SendCode(0x11); //发送SDATAC操作码
delay_us(100); //延时1ms
ADS1294WriteRegister(0x41,3,inicializacion1);//配置config1,config2,config3寄存器
ADS1294WriteRegister(0x45,4,inicializacion2);//配置每个通道寄存器
ADS1294WriteRegister(0x58,2,inicializacion3);//配置WCT
P1OUT |=(ADS1294_START);//保持START引脚为高
//SendCode(0x08);//发送START操作码,并保持START引脚为低直到发送STOP操作码
delay_ms(1); //延时10ms
//SendCode(0x21);//RREG
//SendCode(0x01);
//SendCode(0);
//SendCode(0);
SendCode(0x10);//RDATAC
//循环采样
while(1){
while((P1IN&ADS1294_DRDY)!=0);//用P1.0作为输入端口查询DRDY信号
for (j = 0; j < 5; j++) //每三个字节读取数据并发送出去:status(24bit) + 4 channels(4*24bit)
{
dato1=SendCode(0);//采集MSB
dato2=SendCode(0);//采集次字节
dato3=SendCode(0);//采集LSB
if (dato1 & 0x80)//符号扩展,判断MSB最高位,最高位为1,为负数,long高八位全部补1
{
dato[j] = (0xff000000)|((long)dato1<<16)|((long)dato2<<8)|((long)dato3);//数据每3字节保存到long类型中
TXBUF1=0xff;//发送符号位补1(负数)
}
else
{
dato[j] = (0x00000000)|((long)dato1<<16)|((long)dato2<<8)|((long)dato3);
TXBUF1=0x00;//发送符号位补0(正数)
}
TXBUF1=dato1;//将MSB数据通过USART1发送出去
TXBUF1=dato2;//将次字节数据通过USART1发送出去
TXBUF1=dato3;//将LSB数据通过USART1发送出去
//循环下三个字节
}
//double=dato[i]*VERF/(2^23)计算实际电压公式
//在客户端long dato[i] = ((long)U1RXBUF << 24)|((long)U1RXBUF<<16)|((long)U1RXBUF<<8)|((long)U1RXBUF);
};//data ready
//for(i = 10;i > 0;i--);//延时一段时间
// ADS1294AssertCS(0);// 不选通ADS1294
}
大概2v左右的电压,可能是由端口的反向保护二极管流到电源去的. 这属于保护机制