TI论坛
直播中

英雄孤寂

13年用户 1280经验值
私信 关注
[问答]

对DAC104进行操作,16位数据分两次写,两次操作间需要延时吗?


    DAC104S085的DIN,SCLK, SYNC分别与MSP430单片机P9.3、P9.1、P9.0连接,DAC参考电压3V,单片机时钟频率18.432MHz,SPI时钟频率18.4329=2.048MHz,SPI初始化如下:
    void Init_SPI2(void)
    {     
    P9SEL |=BIT1+BIT3;  
    P9SEL &=~BIT0;   
    P9DIR|=BIT0+BIT1+BIT3; //
    P9OUT&=~BIT0;   
    UCB2CTL1 |= UCSWRST                                     ; // 复位SPI状态机  
    UCB2CTL0 |= UCMST+UCSYNC+UCMSB                   ; // 3-pin, 8-bit SPI master,  MSB   //
    UCB2CTL1 |= UCSSEL__SMCLK                                    ; // 选择SCK参考源为SMCLK  
    UCB2BR0   = 0x09                                        ; // SCK = SMCK/9
    UCB2BR1   = 0                                           ;  
    UCB2CTL1 &=~UCSWRST                                     ; // SPI状态机使能
    }
    SPI2发送数据程序如下:
    void TransceiveSPI2 (char txdata)      //发送
    {   
    while (!(UCB2IFG & UCTXIFG));             // wait until last SPI-Transmission is finished      
    UCB2TXBUF = txdata;                         // send 8 clocks "txdata" and SPI-clocks
    }
    设置DAC OUT A程序如下:
    void SetDAC_A(unsigned int DigData)
    {   
    unsigned int Data=0;     
    Data=0x1000+DigData;   //高四位0001     (00 0 1 设置A,更新输出)
    P9OUT &=~BIT0;   
    __delay_cycles(18432);      
    TransceiveSPI2((Data&0xFF00)>>8);   //MSB
    // __delay_cycles(18432);   
    TransceiveSPI2(Data&0x00FF);   
    __delay_cycles(18432);   
    P9OUT|=BIT0;           
    }
    main函数如下:
    void main( )
    {      
    Init_CLK();       //系统时钟初始化
    Init_SPI2();                //         
    while(1)   
    {      
    SetDAC_A(0x200); //0x200---1.5V      
    __delay_cycles(184320000);     //10s延时
    }
    }
    通过检测发现,A输出一直不对,不知道问题出在哪儿?对DAC104进行操作,16位数据分两次写,两次操作间需要延时吗?

回帖(1)

那年我十七_

2025-1-24 16:31:22
在操作DAC104S085时,16位数据需要分两次写入,每次写入8位。在两次操作之间是否需要延时,取决于DAC104S085的数据手册中对时序的要求。通常情况下,为了确保数据的准确性和稳定性,两次写入之间可能需要一定的延时。

对于DAC104S085,其数据手册中提到,每次写入数据后,需要等待一个同步脉冲(SYNC)来更新DAC输出。因此,在两次写入之间,需要确保同步脉冲已经完成,以避免数据冲突。

关于SPI初始化,您提供的代码片段已经包含了一些基本的设置,但似乎不完整。以下是完整的SPI初始化代码示例,适用于MSP430单片机:

```c
void Init_SPI2(void) {
    P9SEL |= BIT1 + BIT3; // 设置P9.1和P9.3为SPI功能
    P9SEL &= ~BIT0; // 设置P9.0为GPIO功能
    P9DIR |= BIT0 + BIT1 + BIT3; // 设置P9.0、P9.1和P9.3为输出

    UCB2CTL1 |= UCSWRST; // 进入复位状态
    UCB2CTL0 = UCCKPH | UCMSB | UCMST | UCSYNC; // 设置为主模式、同步模式、3线SPI
    UCB2CTL1 = UCSSEL_2; // 使用SMCLK作为时钟源
    UCB2BR0 = 0x02; // 设置SPI时钟分频
    UCB2BR1 = 0;
    UCB2CTL1 &= ~UCSWRST; // 释放复位状态,开始SPI通信
}
```

在这个初始化代码中,我们设置了P9.1(SCLK)、P9.3(DIN)和P9.0(SYNC)为SPI功能,并设置了SPI的主模式、同步模式和3线SPI。同时,我们使用了SMCLK作为时钟源,并设置了SPI时钟分频,以确保SPI时钟频率为2.048MHz。

在实际应用中,您需要根据DAC104S085的数据手册和MSP430单片机的具体型号,调整SPI初始化代码以满足您的要求。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分