第一次使用430单片机,使用SPI方式进行驱动的AD7711A芯片
初始化配置AD7711A以后,读取AD7711A的控制寄存器,写进去的配置参数与读取回来的数据一致,说明初始化的操作是成功的,但是430读取AD7711A的ADC数据时,数据总是0
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
现在已经将相关代码和时序图上传,请走过路过的各位大侠,指点迷津
/********************主函数**********************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关狗
CLK_INIT();
UART_INIT();
//TimerA_INIT();
SPI_INIT();
Delays(50);
AD7711_WR();
Delays(100);
//AD_temp=26342;
while(1)
{
//AD7711_RD_INIT();
AD7711_RD_AD();
_NOP();
_NOP();
}
}
/********************************************
函数名称:SPI_INIT
功 能:SPI初始化
参 数:无
返回值 :无
********************************************/
void SPI_INIT()
{
P3OUT &= ~(BIT0+BIT4+BIT5);
P3SEL |= 0x31; //P3.0,4,5 = USCI_A0 SCLK SIMO/SOMI
UCA0CTL1 = UCSWRST; //UCSWRST SET 1
UCA0CTL0 |= UCMST+UCSYNC+UCMSB;
//UCA0CTL0 |= UCCKPH+UCMSB; //UCCKPL
UCA0CTL1 |= UCSSEL_1; //CLK = ACLK
UCA0BR0 = 0x14; //10MHz/20 Fsclk<=clk/5
UCA0BR1 = 0x00; //
UCA0MCTL = 0; // No modulation
UCA0CTL1 &= ~UCSWRST; //Initialize USCI state machine**
}
/*******************************************
函数名称:AD7711_WR
功 能:AD7711初始化
参 数:无
返回值 :无
********************************************/
void AD7711_WR()
{
P1DIR |= BIT5;
P1OUT |= BIT5; //RFS,置1
P1DIR |= BIT6;
P1OUT |= BIT6; //TFS,置1
P1DIR |= BIT3;
P1OUT |= BIT3; //A0,置1
P1DIR |= BIT0; //
P1OUT |= BIT0; //P1.0 1为发送数据,
P1OUT &= ~(BIT3); //A0,置0
P1OUT &= ~(BIT6); //TFS,置0
uint i;
for (i=0;i<3;i++)
{
while (!(IFG2 & UCA0TXIFG))
{}
UCA0TXBUF = AD7711A_INIT[i]; //P3.4 TX DATA
while (UCA0STAT & UCBUSY)
{}
}
Delays(1);
P1OUT |= BIT6; //TFS,置1
P1OUT |= BIT3; //A0,置1
}
/*******************************************
函数名称:AD7711_RD_INIT
功 能:回读AD7711A初始化数据
参 数:无
返回值 :无
********************************************/
void AD7711_RD_INIT()
{
P1DIR |= BIT5;
P1OUT |= BIT5; //RFS,置1
P1DIR |= BIT6;
P1OUT |= BIT6; //TFS,置1
P1DIR |= BIT3;
P1OUT |= BIT3; //A0,置1
P1DIR |= BIT0;
P1OUT &= ~(BIT0); //P1.0,0为接收
//while (P1IN & BIT7); //读取DRDY,判断信号是否为0
P1OUT &= ~(BIT3); //A0,置0
P1OUT &= ~(BIT5); //RFS,置0
uint i;
for (i=0;i<3;i++)
{
while (!(IFG2 & UCA0TXIFG))
{}
UCA0TXBUF =0x00; //P3.4TX DATA
while (UCA0STAT & UCBUSY)
{}
AD7711A_REC[i]= UCA0RXBUF; //P3.5 RX DATA
}
Delays(1);
P1OUT |= BIT5; //RFS,置1
P1OUT |= BIT3; //A0,置1
}
/*******************************************
函数名称:AD7711_RD_AD
功 能:读取AD7711A的ADC数据
参 数:无
返回值 :无
********************************************/
void AD7711_RD_AD()
{
P1DIR |= BIT5; //RFS,置1
P1OUT |= BIT5;
P1DIR |= BIT6; //TFS,置1
P1OUT |= BIT6;
P1DIR |= BIT0; //读AD7711 P1.0 0为接收
P1OUT &= ~(BIT0);
P1DIR |= BIT3; //A0,置1
P1OUT |= BIT3;
while (P1IN & BIT7) //读取DRDY,判断信号是=”0"?
{}
P1OUT |= BIT3; //A0,置1
P1OUT &= ~(BIT5); //RFS,置0
uint i;
for (i=0;i<2;i++)
{
while (!(IFG2 & UCA0TXIFG))
{}
UCA0TXBUF =0x00; //P3.4TX DATA
while (UCA0STAT & UCBUSY)
{}
AD7711A_DATA[i] = UCA0RXBUF; //P3.5 RX DATA
}
Delays(1);
P1OUT |= BIT5; //RFS,置1
P1OUT |= BIT3; //A0,置1
}
图1,AD7711A的DRDY信号与RFS信号
图2,AD7711A的RFS信号与SCLK信号
图3,AD7711A的SCLK信号与SDATA信号
备注:AD7711A的数据线为双向的,只有一个引脚,MSP430F2619的数据线有MOSI何MISO,通过P1.0作为读写数据切换。