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.

DAC1282: 寄存器回读失败

Part Number: DAC1282
Other Parts Discussed in Thread: TMS320F28379D,

您好,

我在用TMS320F28379D利用SPI通信控制DAC1282输出直流电压,示波器观察SPICLK和SPISIMO正常,周期为12.5us。

但SPISOMI始终为低电平,debug界面也读取不出SPISOMI的值,请问这是什么原因?

下面是我的程序。

/*
 * DAC读取调试
 *
 */

#include "F28x_Project.h"

typedef unsigned char Uint8;


//声明
void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
void spia_init();
void dac_init();
void spia_xmit(Uint8 a);

Uint8 rdata;

void main()
{
    //初始化
    InitSysCtrl();//系统控制
    InitGpio();//GPIO
    DINT;//关中断
    InitPieCtrl();//PIE控制寄存器
    IER = 0x0000;//中断标志位清零
    IFR = 0x0000;//中断标志位清零
    InitPieVectTable();//中断向量表


    gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI)
    spia_init();
    dac_init();

    spia_xmit(0x20);//读GANMOD寄存器地址
    DELAY_US(100);
    spia_xmit(0x00);//读一个寄存器
    DELAY_US(100);
    while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){}
    rdata = SpiaRegs.SPIRXBUF;







}

void gpio_init()
{
    /* GPIO 连接端口                          I/O        初始值
     * 111  GPIO_CS_DA     O          0
     * 60   SPICLKA_DA     SPIA CLK
     * 59   SPISOMIA_DA    SPIA SOMI
     * 58   SPISIMOA_DA    SPIA SIMO
     * 22   GPIO_SW/TD_DA  O          0
     */

    EALLOW;

    //CS、SW/TD、RESET、DRDY
    GpioCtrlRegs.GPDPUD.bit.GPIO111 = 0;
    GpioCtrlRegs.GPDMUX1.bit.GPIO111 = 0;
    GpioCtrlRegs.GPDDIR.bit.GPIO111 = 1;
    GpioDataRegs.GPDCLEAR.bit.GPIO111 = 1;//GPIO_CS_DA

    GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;
    GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO22 = 1;
    GpioDataRegs.GPACLEAR.bit.GPIO22 = 1;//GPIO_SW/TD_DA

    //SPI
    //DA(使能、异步、SPI)
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA_DA

    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA_DA

    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;
    GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;
    GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA_DA

    EDIS;

}

void spia_init()
{
    //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0
    //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007)
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平)
    SpiaRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式
    SpiaRegs.SPICCR.bit.SPILBK = 0;//关闭回环模式
    SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位

    //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0016)
    SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样)
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU主机
    SpiaRegs.SPICTL.bit.TALK = 1;//使能主机发送
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断

    //SpiaRegs.SPISTS.all = 0;

    //波特率寄存器(9位保留,0000 0000 0000 007C)
    /*
     * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14)
     * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1)
     * 在不添加外部辅助时钟的情况下
     * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS
     * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS
     * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C
     */

    EALLOW;
    ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频)
    EDIS;

    SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C;

    //优先级控制寄存器
    SpiaRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI

    //停止SPI软件复位准备接收或发送
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}


    //2、外置元件初始配置(DAC、ADC)

void dac_init()
{
    spia_xmit(0x40);//写入GANMOD寄存器地址
    DELAY_US(100);
    spia_xmit(0x00);//写一个寄存器
    DELAY_US(100);
    spia_xmit(0x0D);//写入0000 1101,GAIN=8,DC模式
    DELAY_US(100);



    //SINEG寄存器不配置

    spia_xmit(0x42);//写入SWM寄存器地址
    DELAY_US(100);
    spia_xmit(0x00);//写一个寄存器
    DELAY_US(100);
    spia_xmit(0x10);//写入0001 0000,开关全开实现差分
    DELAY_US(100);

    //N寄存器不配置

    spia_xmit(0x44);//写入DCG寄存器地址
    DELAY_US(100);
    spia_xmit(0x02);//写入三个寄存器
    DELAY_US(100);
    spia_xmit(0xE9);//DCG0
    DELAY_US(100);
    spia_xmit(0x26);//DCG1
    DELAY_US(100);
    spia_xmit(0x31);//DCG2
    DELAY_US(100);

    //PULSE寄存器不配置
}


void spia_xmit(Uint8 a)
{
    SpiaRegs.SPITXBUF = (Uint16)(a<<8);//将8位数据传到串行发送缓冲
}