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.

[参考译文] TM4C129XNCZAD:DACx0508的 SPI 通信问题

Guru**** 2416110 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1076654/tm4c129xnczad-spi-communication-issue-with-dacx0508

部件号:TM4C129XNCZAD

大家好,我有一个具有上述 UC 的定制板,我需要使用它与 DACx0508进行通信。 我看到内置 SSI 模块一次最多只允许16位数据传输,但 DAC 需要24位数据。 我希望每次 使用12位数据拨打两个外设函数 SSIDataPut()的电话都能起到这种作用,但这并不是什么运气。 我认为它不起作用是因为 SSI 初始化有问题,而不是因为 DAC。 我测试的方法是在禁用 DAC 的内部2.5V 参考并查看电压是否变为3V 后检查电压。 下面是示意图和我的代码。  

SSI 模块初始化,并在末尾设置 DAC 内部参考关闭:

注:地址0x3代表 DAC 的配置寄存器,数据0x0100将配置设置为关闭内部引用。 位23处的0指定这是一个写入。

    //enable the pins used for SPI communication.
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);

    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOQ)){

    }
    //
    // Configure the SS pin and communication pins as GPIO output pins.
    //
    GPIOPinTypeGPIOOutput(PQ_SPI_PORT, (PQ1_SPI_SS_MEMORY_PIN       |
                                        PQ4_SPI_SS_DIGIPOT_PIN      |
                                        PQ5_SPI_SS_DAC_PIN));

    //
    // Enable the SSI3 peripheral
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3);

    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_SSI3)){

    }

    GPIOPinTypeSSI(PQ_SPI_PORT, (   PQ0_SPI_CLK_PIN         |
                                    PQ2_SPI_TX_PIN          |
                                    PQ3_SPI_RX_PIN));

    GPIOPinConfigure(GPIO_PQ0_SSI3CLK);
    GPIOPinConfigure(GPIO_PQ2_SSI3XDAT0);
    GPIOPinConfigure(GPIO_PQ3_SSI3XDAT1);

    // Wait for the SSI3 module to be ready.
    //
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_SSI3))
    {
    }

    uint32_t ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                                SYSCTL_OSC_MAIN |
                                                SYSCTL_USE_PLL |
                                                SYSCTL_CFG_VCO_240), 50000000);
    //
    // Configure the SSI.
    //
    //Note the DAC uses 24 bits of data
    SSIConfigSetExpClk(SSI3_BASE, ui32SysClock, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 2000000 , 12);

    //
    //Enable the SSI module
    //
    SSIEnable(SSI3_BASE);

    //Set the SS pins to high to disable communication.
    GPIOPinWrite(PQ_SPI_PORT, PQ1_SPI_SS_MEMORY_PIN, PQ1_SPI_SS_MEMORY_PIN);
    GPIOPinWrite(PQ_SPI_PORT, PQ4_SPI_SS_DIGIPOT_PIN, PQ4_SPI_SS_DIGIPOT_PIN);
    GPIOPinWrite(PQ_SPI_PORT, PQ5_SPI_SS_DAC_PIN, PQ5_SPI_SS_DAC_PIN);

    //Disable the internal reference of the DAC.
    /*
     * Write operation identifier:  0x0
     * Address:                     0x03
     * Data:                        0x0100
     * */
    uint32_t disableSignal = 0x00030100;
    WriteToDAC(disableSignal);

写入功能将数据发送到 DAC:

static void WriteToDAC( int32_t DataToWrite )
{
    //Set the DAC SS pin to low to activate the line.
    GPIOPinWrite(PQ_SPI_PORT, PQ5_SPI_SS_DAC_PIN, 0x0);

    //SPI can only send 16 bits at a time.
    //Send the data over SPI.
    SSIDataPut(SSI3_BASE, (DataToWrite >> 12) & 0xfff );
    SSIDataPut(SSI3_BASE, DataToWrite & 0xfff );

    //Set the DAC SS pin to high again to disable the communication.
    GPIOPinWrite(PQ_SPI_PORT, PQ5_SPI_SS_DAC_PIN, PQ5_SPI_SS_DAC_PIN);
}

使用 SPI 的连接示意图。

DAC 数据表中的 DAC 写入位字段规格。

我的理论是 SSIConfigSetExpClk()调用中的比特率设置有问题,但我无法找出问题所在。 我们非常感谢您的帮助。

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

    您好,

     我真的看不到您的2MHz SPICLK 配置有问题。 但是,为了使主从设备和从设备能够进行通话,它们必须遵循相同的极性和相位。 您可以为模式0配置 SSI,该模式在下缘发送数据,在下缘采样数据。  

    但是,读取 DAC 时,它正在对落边的数据进行采样。 您应该改变极性和相位以使两侧匹配。  

    对于您的代码,我建议您也添加第二行。  

    SSIDataPut (SSI3_base,(DataToWrite >> 12)和0xf);

    同时(SSIBusy (SSI3_base)); //添加此行

    SSIDataPut (SSI3_base,DataToWrite 和0xf);

    最后,如果您使用范围或逻辑分析器来观察 SCLK/TX/RX 的 SSI 信号,而不是测量 DAC 端的电压,则故障排除将使您的生活更加轻松。  

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

    谢谢你们解决了这个问题,我用所有极性设置尝试了这个问题,我认为问题是我在第一次发送完成之前尝试发送数据,而 while 循环解决了这个问题。