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.

[参考译文] TMS320F28035-DAC:EP 和 DAC 之间的 SPI 通信未正常工作

Guru**** 2305280 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1520304/tms320f28035-ep-spi-communication-between-mcu-and-dac-is-not-working

器件型号:TMS320F28035-TMS320F28035 EP

工具/软件:

您好、

我正在使用 TMS320F28035MPNTEP 微控制器和 DAC DAC80504RTET。 会尝试使用 SPIA 进行通信。

我尝试从"器件 ID 寄存器"中读取 DAC 的器件 ID 并获得垃圾值。 于是开始检查 SPI 信号。 片选在数据传输期间不会变为低电平。 下面是信号的代码和屏幕截图

void SPI_configureSPI机模 块(void)

EALLOW;

GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;// SPISIMOA (MOSI)
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;// SPISOMIA (MISO)
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;// SPICLKA (CLK)
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;// SPISTEA (CS)

GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;

// SPI 配置
SpiaRegs.SPICCR.bit.SPISWRESET = 0;//将 SPI 保持在复位状态
SpiaRegs.SPICCR.all = 0x0047;// 16位 char、无环回
SpiaRegs.SPICTL.all = 0x000E;//主模式、启用 TX、下降沿数据捕获
SpiaRegs.SPIBRR = 0x007F;// SPI 波特率~468.75kHz @ 60MHz
SpiaRegs.SPICCR.bit.SPISWRESET = 1;//释放 SPI

SpiaRegs.SPIPRI.bit.FREE = 1;//自由运行模式

EDIS;
}

void SPI_writeToDAC (Uint8 regAddr、Uint16值)

UINT8 cmdByte = 0;
Uint16 word1 = 0;
Uint16 word2 = 0;

//位23 = 0 (写入)、位22–20 = 000 (保留)、位19–16 =寄存器地址
cmdByte =(regAddr 和0x0F);

//将24位帧构建为两次16位写入(MSB 在前)
WORD1 =(CMdByte << 8)|((value >> 8)& 0xFF);//前16位:[command][Data[15:8]]
word2 =(value & 0xFF)<< 8;//最后8位:[DATA[7:0]]位于高字节

GpioDataRegs.GPACLEar.bit.GPIO19 = 1;// CS 低电平

//发送字1
SpiaRegs.SPITXBUF = word1;
while (SpiaRegs.SPISTS.bit.INT_FLAG = 0);
SpiaRegs.SPISTS.all = 0x0000;

//发送字2
SpiaRegs.SPITXBUF = word2;
while (SpiaRegs.SPISTS.bit.INT_FLAG = 0);
SpiaRegs.SPISTS.all = 0x0000;

GpioDataRegs.GPASSET.bit.GPIO19 = 1;//CS 高电平
}

当我尝试写入值1 (SPI_writeToDAC (0x08、0x1);)时、捕获了以下屏幕截图

通道0为 CS

通道1为 CLK

通道2为 SPIA_MISO_DAC (SDO)

通道3是 SPIA_MOSI_uCtoDAC (SDI)

当我尝试写入值0x5555 (SPI_writeToDAC (0x08、0x5555)时、捕获了以下屏幕截图;)

我无法找到代码的问题。 您能帮忙吗?

我尝试将 GPIO19配置为 GPIO 而不是 SPISTEA、但在通道3 (SDI)上没有获得任何信号

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我更改了 SPICHAR、 CLKPOLARITY、 CLK_PHASE、如下所示、并获得了屏幕截图所示的波形。 仍然 CS 不会变为低电平

    SPICCR: 1111

    SPICHAR:0-3:16位字(F)

    SPILBK:4:禁用环回功能

    CLKPOLARITY:6:=数据在上升沿输出、在下降沿输入。 当未发送 SPI 数据时、SPICLK 处于低电平。

    数据输入和输出边沿取决于时钟相位位位的值

     

    SPICTL:0110

    SPIINTENA: 禁用中断。 (0)

    Talk :启用传输(1`)

    master_slave: SPI 配置为主器件。(1)

    CLK_PHASE :=正常的 SPI 时钟方案,取决于时钟极性位(SPICCR.6)(0)

    void spi_configureSPIAModule(void)
    {
        EALLOW;
    
        GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // SPISIMOA (MOSI)
        GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // SPISOMIA (MISO)
        GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // SPICLKA (CLK)
        GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // SPISTEA (CS)
    
        GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;
        GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;
    
        // SPI configuration
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;   // Hold SPI in reset
        SpiaRegs.SPICCR.all = 0x000F;         // 16-bit, CPOL = 0, reset held
        SpiaRegs.SPICTL.all = 0x0006;         // Master, CPHA = 1
        SpiaRegs.SPIBRR = 0x007F;             // SPI baud rate ~468.75kHz @ 60MHz
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;   // Release SPI
    
        SpiaRegs.SPIPRI.bit.FREE = 1;         // Free run mode
    
        EDIS;
    }
    
    void spi_writeToDAC(Uint8 regAddr, Uint16 value)
    {
        Uint8 cmdByte = 0;
        Uint16 word1 = 0;
        Uint16 word2 = 0;
    
        // Bit 23 = 0 (Write), Bits 22–20 = 000 (reserved), Bits 19–16 = register address
        cmdByte = (regAddr & 0x0F);
    
        // Build 24-bit frame as two 16-bit writes (MSB first)
        word1 = (cmdByte << 8) | ((value >> 8) & 0xFF);   // First 16 bits: [Command][Data[15:8]]
        word2 = (value & 0xFF) << 8;                      // Last 8 bits: [Data[7:0]] in upper byte
    
        GpioDataRegs.GPACLEAR.bit.GPIO19 = 1; // CS low
    
        // Send word1
        SpiaRegs.SPITXBUF = word1;
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0);
        SpiaRegs.SPISTS.all = 0x0000;
    
        // Send word2
        SpiaRegs.SPITXBUF = word2;
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0);
        SpiaRegs.SPISTS.all = 0x0000;
    
        GpioDataRegs.GPASET.bit.GPIO19 = 1; //CS high
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不确定为什么 CS 在正常情况下不会变为低电平、但当您尝试手动控制它时、请注意在 SPI_configureSPIAmodule () func 中、您是设置 GPAMUX2.GPIO19 = 1、这意味着 GPIO19不是手动控制的、而是由 SPI 控制。

    尝试更改该配置、并查看是否可以手动控制 IO19。 否则、可能存在硬件问题、确保 IO19未在电路中以某种方式接地。

    此致、
    Jason Osborn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的答复 Jason、

    CS 现在正在工作。 到目前为止、波形看起来不错