TI论坛
直播中

李晨灵

7年用户 1482经验值
私信 关注
[问答]

TMS320F28379D利用SPI通信控制DAC1282输出直流电压,debug界面读取不出SPISOMI的值是怎么回事?


  • 我在用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位数据传到串行发送缓冲}
                                                                   

回帖(2)

刘秀兰

2024-11-22 14:16:13
示波器上的 SCLK 位于200mV 的电压(y 轴)除法上,它太低了以致于无法超过输入的 V_IH (DVDD*0.8)。 请检查您的原理图或者 SPI 线路上的任何其他器件,看下是否可能尝试将引脚保持在低电平。 
举报

王浩

2024-11-23 16:28:27
根据您的描述,您在使用TMS320F28379D通过SPI通信控制DAC1282输出直流电压时,发现SPISOMI始终为低电平,且在debug界面无法读取SPISOMI的值。以下是一些可能的原因和解决方法:

1. 检查硬件连接:首先,请确保您的硬件连接正确。检查SPI接口的引脚是否正确连接,包括SPICLK、SPISIMO、SPISOMI和SPICS。如果连接不正确,可能会导致通信问题。

2. 检查SPI初始化:请确保您正确初始化了SPI接口。在您的代码中,您提到了`spia_init()`函数,但未提供具体实现。请检查该函数是否正确配置了SPI接口的参数,例如时钟频率、CPOL、CPHA等。

3. 检查SPI传输函数:您提到了`spia_xmit(Uint8 a)`函数,但未提供具体实现。请检查该函数是否正确实现了SPI数据传输。确保在发送数据时,您已经正确设置了SPISIMO引脚的值,并在发送数据后等待SPISOMI引脚的值。

4. 检查DAC1282配置:请确保DAC1282已经正确配置。检查DAC1282的控制寄存器是否设置正确,以确保它可以正确接收SPI数据并输出直流电压。

5. 检查SPI接口时序:您提到SPI周期为12.5us,但未提供具体的时钟频率。请检查您的SPI时钟频率是否符合DAC1282的要求。如果时钟频率过高或过低,可能会导致通信问题。

6. 检查调试环境:请确保您的调试环境正确配置。检查您的调试器是否正确连接到TMS320F28379D,并且调试器的设置是否正确。如果调试环境配置不正确,可能会导致无法读取SPISOMI的值。

综上所述,您需要检查硬件连接、SPI初始化、SPI传输函数、DAC1282配置、SPI接口时序和调试环境。通过逐步排查这些问题,您应该能够找到导致SPISOMI始终为低电平和无法读取值的原因,并采取相应的解决措施。
举报

更多回帖

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