微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ads1294 DOUT输出问题,急,请专家指教

ads1294 DOUT输出问题,急,请专家指教

时间:10-02 整理:3721RD 点击:

问题:程序如下,问题是主机msp430f149执行SendCode函数,通过SPI给ads1294发送数据的时候,ads1294的DOUT引脚一直为低,不返回数据,且DRDY一直为高

图1为上电时DOUT输出,这个测试模式,在开始就输出50Hz的方波,请问为什么,方波不是应该在输入端么?

图2为执行SendCode(0x06)//发送复位操作码 ,SCLK和DIN引脚的电平变换,感觉没问题

图3为RREG指令部分,发送没问题,但是ads1294DOUT依然没变换

图4为程序卡在while((P1IN&ADS1294_DRDY)!=0);之前的DOUT情况

#include <msp430x14x.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))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#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};
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 &= ~ADS1294_DRDY;
P1DIR |= (ADS1294_START+ADS1294_PWDN); //设置START和PWDN通过P1.1和P1.2控制
P1OUT &=~(ADS1294_START+ADS1294_PWDN);//关闭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; //CKPH=1,CKPL=0
U0TCTL |=SSEL1;
U0TCTL |=STC; //时钟源为SMCLK,3线模式,下降沿数据有效

U0BR0 = 0x04; // SPICLK = SMCLK/4
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(RXBUF0);
}


//*************************************************************************
// 片选控制
//*************************************************************************
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;
signed char a[15];
//long dato[5];
//uchar dato1,dato2,dato3;


PortInit();
Init_CLK();
Init_SPI();
UART_Init();

//*************************************************************************
// ads1294工作程序流程
//*************************************************************************
//CLKSEL外部强制拉高
P1OUT |= ADS1294_PWDN;//拉高PWDN,给芯片内部上电
//RESET外部强制拉高
delay_ms(1000); //延时1s

ADS1294AssertCS(1); // 选通ADS1294
delay_ms(1);//延时1ms

SendCode(0x06); //发送复位操作码
delay_ms(1); //延时1ms

SendCode(0x11); //发送SDATAC操作码
delay_ms(1); //延时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(10); //延时10ms

SendCode(0x21);//RREG从01h读
SendCode(0x01);//读两个寄存器
SendCode(0);
SendCode(0);

ADS1294AssertCS(0); // 不选通ADS1294

while(1)
{
while((P1IN&ADS1294_DRDY)!=0);//用P1.0作为输入端口查询DRDY信号

ADS1294AssertCS(1); // 选通ADS1294

SendCode(0x12);//RDATA

for (j = 0; j < 15; j++) //读取数据并发送出去:status(24bit) + 4 channels(4*24bit),总共15个字节
{
a[j]=SendCode(0);
TXBUF1=a[j];//UART1蓝牙发送数据到PC
};
ADS1294AssertCS(0); // 不选通ADS1294
};
};
//double=dato[i]*VERF/(2^23)计算实际电压公式
//在客户端long dato[i] = ((long)U1RXBUF << 24)|((long)U1RXBUF<<16)|((long)U1RXBUF<<8)|((long)U1RXBUF);
//*************************************************************************
//
//
// if (dato1 & 0x80)//符号扩展,判断MSB最高位,最高位为1,为负数,long高八位全部补1,最高位为0,long高八位全部补0
// {
// //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发送出去
// //循环下三个字节
//*************************************************************************

看看问题是不是在这里

START
The START pin must be set high for at least 2 tCLKs or the START command sent to begin conversions. When START is low or if the START command has not been sent, the device does not issue a DRDY signal (conversions are halted).

你好,请问你之前的ads1294问题解决了吗?最近我也在用ads1294,新手不是很会用,想参考下你最后的代码设置,谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top