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.

[参考译文] ADS1261:SPI C2000

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1045345/ads1261-spi-c2000

器件型号:ADS1261
Thread 中讨论的其他器件: SysConfig

大家好、

我正在尝试将 ADS1261与 C2000 (F28388D)配合使用。

我从 SPI 环回示例项目开始、并添加了可用的 ADS1261 C 库(sbac199)。

  1. 我的 SPI 配置如下:

    协议: PROT POL0PHA1

    STE 极性: SPISTE 低电平有效(正常)

    仿真模式: 仿真在发送后停止

    咬口率 1000000Hz

    数据宽度:8位

    使用 FIFO

  2. 我 使用 我的引脚的名称编辑了 interface.c 中的所有函数内容。

如果我尝试调用函数 ads1261_enable_internal_reference_example();当代码转至 setCS 时、我的引脚 nCS 不会变为低电平。

我按如下方式编辑了 setCS:

void setCS(bool state)
{
    /* --- INSERT YOUR CODE HERE ---
     * This function sets the "nCS" GPIO pin state,
     * according to the input argument, and delays for 50 ns.
     *
     * The following code shows an example using TivaWareTm...
     */

    if (state)
	{
        /* Sets the nCS pin HIGH */
        //GPIOPinWrite(SPI_STEn, nCS_PIN, nCS_PIN);
        GPIO_writePin(GPIO_PIN_SPIA_STEN,1);

	}
	else
	{
	    /* Sets the nCS pin LOW */

		GPIO_writePin(GPIO_PIN_SPIA_STEN,0);
		GPIO_writePin(GPIO3,0); //DEBUG
	}

    /* td(SCCS)/td(CSSC) delay */
    DEVICE_DELAY_US(8);
    //SysCtlDelay(2);

}

它看起来像 GPIO_writePin (GPIO_PIN_SPIA_Sten、0);不起作用。

我使用 SysConfig 配置我的引脚分配、在 board.c 中、我看到 SPI_init 和 Pinmux_init:

/*
 * Copyright (c) 2020 Texas Instruments Incorporated - http://www.ti.com
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#include "board.h"

void Board_init()
{
	EALLOW;

	PinMux_init();
	GPIO_init();
	SPI_init();

	EDIS;
}

void PinMux_init()
{
	//GPIO40 -> NDRDY Pinmux
	GPIO_setPinConfig(GPIO_40_GPIO40);
	//GPIO96 -> nRESET Pinmux
	GPIO_setPinConfig(GPIO_96_GPIO96);
	//GPIO41 -> nPWDN Pinmux
	GPIO_setPinConfig(GPIO_41_GPIO41);
	//GPIO98 -> START Pinmux
	GPIO_setPinConfig(GPIO_98_GPIO98);
	//GPIO34 -> LED_34 Pinmux
	GPIO_setPinConfig(GPIO_34_GPIO34);
	//GPIO31 -> LED_31 Pinmux
	GPIO_setPinConfig(GPIO_31_GPIO31);
	//GPIO3 -> GPIO3 Pinmux
	GPIO_setPinConfig(GPIO_3_GPIO3);
	//SPIA -> mySPI0 Pinmux
	GPIO_setPinConfig(GPIO_16_SPIA_SIMO);
	GPIO_setPinConfig(GPIO_17_SPIA_SOMI);
	GPIO_setPinConfig(GPIO_18_SPIA_CLK);
	GPIO_setPinConfig(GPIO_19_SPIA_STEN);

}

void GPIO_init(){
		
	//NDRDY initialization
	GPIO_setDirectionMode(NDRDY, GPIO_DIR_MODE_IN);
	GPIO_setPadConfig(NDRDY, GPIO_PIN_TYPE_STD);
	GPIO_setMasterCore(NDRDY, GPIO_CORE_CPU1);
	GPIO_setQualificationMode(NDRDY, GPIO_QUAL_SYNC);
		
	//nRESET initialization
	GPIO_setDirectionMode(nRESET, GPIO_DIR_MODE_OUT);
	GPIO_setPadConfig(nRESET, GPIO_PIN_TYPE_STD);
	GPIO_setMasterCore(nRESET, GPIO_CORE_CPU1);
	GPIO_setQualificationMode(nRESET, GPIO_QUAL_SYNC);
		
	//nPWDN initialization
	GPIO_setDirectionMode(nPWDN, GPIO_DIR_MODE_OUT);
	GPIO_setPadConfig(nPWDN, GPIO_PIN_TYPE_STD);
	GPIO_setMasterCore(nPWDN, GPIO_CORE_CPU1);
	GPIO_setQualificationMode(nPWDN, GPIO_QUAL_SYNC);
		
	//START initialization
	GPIO_setDirectionMode(START, GPIO_DIR_MODE_OUT);
	GPIO_setPadConfig(START, GPIO_PIN_TYPE_STD);
	GPIO_setMasterCore(START, GPIO_CORE_CPU1);
	GPIO_setQualificationMode(START, GPIO_QUAL_SYNC);
		
	//LED_34 initialization
	GPIO_setDirectionMode(LED_34, GPIO_DIR_MODE_OUT);
	GPIO_setPadConfig(LED_34, GPIO_PIN_TYPE_STD);
	GPIO_setMasterCore(LED_34, GPIO_CORE_CPU1);
	GPIO_setQualificationMode(LED_34, GPIO_QUAL_SYNC);
		
	//LED_31 initialization
	GPIO_setDirectionMode(LED_31, GPIO_DIR_MODE_OUT);
	GPIO_setPadConfig(LED_31, GPIO_PIN_TYPE_STD);
	GPIO_setMasterCore(LED_31, GPIO_CORE_CPU1);
	GPIO_setQualificationMode(LED_31, GPIO_QUAL_SYNC);
		
	//GPIO3 initialization
	GPIO_setDirectionMode(GPIO3, GPIO_DIR_MODE_OUT);
	GPIO_setPadConfig(GPIO3, GPIO_PIN_TYPE_STD);
	GPIO_setMasterCore(GPIO3, GPIO_CORE_CPU1);
	GPIO_setQualificationMode(GPIO3, GPIO_QUAL_SYNC);
}
void SPI_init()
{
	
	//mySPI0 initialization
	SPI_disableModule(mySPI0_BASE);
	SPI_setConfig(mySPI0_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1,
				  SPI_MODE_MASTER, 1000000, 	8);
	SPI_enableFIFO(mySPI0_BASE);
	SPI_setFIFOInterruptLevel(mySPI0_BASE, SPI_FIFO_TXEMPTY, SPI_FIFO_RXEMPTY);
	SPI_disableLoopback(mySPI0_BASE);
	SPI_setEmulationMode(mySPI0_BASE, SPI_EMULATION_STOP_AFTER_TRANSMIT);
	SPI_enableModule(mySPI0_BASE);
}

在我的主  函数 bars_init()中,调用该函数可以执行以下操作:
PinMux_init();
GPIO_init();
spi_init();

所以我不确定是什么问题,除了 SPI_init()之外,我还需要做什么呢? 您能否确认 GPIO_PIN_SPIA_STEN 是否是常规 GPIO、即使它在 SysConfig 中为 SPI 定义也是如此?

为了确保它不是硬件、我启动了一个新项目并将我的引脚19定义 为正常 GPIO、它工作正常、我可以切换引脚。

如果可以的话、我会把项目放出来。

谢谢你

e2e.ti.com/.../spi_5F00_ADS1261.zip

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

    您好、Hal、

    您的代码是否在 C2000上配置了正确的引脚以用作 CS 线路?

    您是否能够探测这条线路并查看是否有任何内容实际切换?

    您也可以尝试在 MCU 论坛中发布同样的问题、因为问题听起来像是与 MCU 配置有关、而不是与 ADC 有关(因为您能够使 GPIO 正常工作、而不仅仅是所需的控制线)、 由于 CS 是由 MCU 驱动的信号)。

    布莱恩

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

    HY Bryan、感谢您的帮助。

    实际上、我发现我的 SPI 引脚未由 SysConfig 生成的代码初始化、这很奇怪。

    因此、我添加了具有正确初始化的 CS、SIMO、SOMI 和 CLK、现在在振荡器上看起来正常、我可以看到 CS 变为低电平。

    我还有其他一些问题;

    • 您是否建议使用 FIFO 和 SPI 例程中断? 另一个选项是在循环中等待 RX 数据?
    • 如前所述、我将 START、PWDN 和 RESET 引脚连接到 VDD、因此这意味着它直接在连续模式下运行。
      我 尝试避免在第一次配置任何寄存器以使其更容易。 您能否确认、使用默认寄存器值、 当 DRDY 变为低电平时、仅监控 DRDY 并读取数据就足够了?

    谢谢你
     

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

    您好、Hal、

    很高兴您解决了初始问题

    我不确定我会推荐哪一个、这实际上取决于您的整体应用程序需要完成的任务、例如、如果您运行其他例程、那么中断驱动方法可能更有意义。 如果您只是想从 ADC 读取数据、则可能不需要采用任何一种方式(在几次情况下、我看到其他人使用循环等待 DRDY 下降)。

    如果您将所有寄存器保留在其默认设置、则除输入多路复用器外、一切都正常(请参阅下图)。 多路复用器通道默认为对 VCOM 短路、因此您将读取0V (这实际上是测量 ADC 噪声的方法)。 换言之、您将无法使用默认设置读取输入信号。 您可以使用默认设置来确认 ADC 数据表中的噪声性能、增益为1、20SPS、且采用 FIR 滤波器(应为~370nVRMS)。

    布莱恩

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

    非常感谢 Bryan 的帮助。

    我注意到、在 ADS1261.c 中、ReadData 函数具有数组参数 、但描述是指针:

    在主代码中、我初始化了三个数组:

        uint8_t status[1];
        uint8_t data[20];
        uint8_t crc[10];

    并在我的循环中调用函数:

    while(1){
            result = readData(status,data,crc);
            for (cpt=4;cpt>0;cpt--)
            {
                //GPIO_writePin(LED_34, cpt & 0x1);
                DEVICE_DELAY_US(cpt*100000);
            }

    如果我探测 MISO CLK 和/CS、我会看到:

    但 MOSI 不会变为高电平:

    我通过将 MOSI 引脚替换为常规 GPIO 来检查硬件、并且能够切换引脚。

    我猜是我在重新写入函数 SPI_SendReceive (DataTx、DataRx、byteLength)时出错;在 interface.c 中:

    void SPI_SendReceive(uint8_t *DataTx, uint8_t *DataRx, uint8_t byteLength)
    {
       /*	--- INSERT YOUR CODE HERE ---
    	*
    	* 	This function should send and receive multiple bytes over the SPI.
    	*
    	* 	A typical SPI send/receive sequence may look like the following:
    	* 	1) Make sure SPI receive buffer is empty
    	* 	2) Set the /CS pin low (if controlled by GPIO)
    	* 	3) Send command bytes to SPI transmit buffer
    	* 	4) Wait for SPI receive interrupt
    	* 	5) Retrieve data from SPI receive buffer
    	* 	6) Set the /CS pin high (if controlled by GPIO)
    	*
    	*/
    
    	/* Set the nCS pin LOW */
    	setCS(LOW);
    
    	/* Remove any residual or old data from the receive FIFO */
    	uint32_t junk;
    	//while (SSIDataGetNonBlocking(SSI0_BASE, &junk));      /*COMMENTED*/
    	//while (SPI_readDataBlockingNonFIFO(SPIA_BASE, &junk));/*COMMENTED*/
    
    
    	int i;
    	for (i = 0; i < byteLength; i++)
    	{
    		/* Set up data for the next transmit */
    		//HWREG(SSI0_BASE + SSI_O_DR) = DataTx[i];          /*COMMENTED*/
    		SPI_writeDataBlockingNonFIFO(SPIA_BASE, DataTx[i]); /*REPLACED BY*/
    		
    		/* Wait for data to appear */
    		//while (!(HWREG(SSI0_BASE + SSI_O_SR) & SSI_SR_RNE)); /*COMMENTED*/
    
    		/* Grab the return data */
    		//DataRx[i] = HWREG(SSI0_BASE + SSI_O_DR);          /*COMMENTED*/
    		DataRx[i] = SPI_readDataBlockingNonFIFO(SPIA_BASE); /*REPLACED BY*/
    	}
    
    	/* Set the nCS pin HIGH */
    	setCS(HIGH);
    }

    我基本上会添加  

    SPI_writeDataBlockingNonFIFO(SPIA_BASE, DataTx[i]);
    
    DataRx[i] = SPI_readDataBlockingNonFIFO(SPIA_BASE);

    此外、波形显示了5个不同的数据包 、它们对应 于字节长度、没有 CRC、因此看起来不错。 我的问题是/CS 引脚、它应该在整个发送期间保持低电平、如果   SPI_SendReceive 函数 CS 变为低电平、则发送所有数据、然后 CS 变为高电平...

    我很慢地到达那里  

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

    您好、Hal、

    很高兴知道您正在取得进展。

    您当然不想在数据读取事务期间切换 CS。 这将重置串行接口(请参阅数据表中的第9.5.1.1节)。 我不清楚 CS 在代码中的切换位置、因此希望您能够跟踪这行代码并重写它。

    布莱恩

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

    您好、Bryan、感谢您的所有帮助。

    我终于让它工作并阅读了一些内容:

    对于/CS、我使用常规 GPIO、我不知道原因、但通过使用 通过 SPI 定义的 GPIO_19_SPIA_STEN、它会在一个字节后切换/CS、正如您所说的那样、它会复位串行接口。 我稍后将检查...

    我还必须将 SPI 配置更改为 :SPI_PROT_POL0PHA0、即使 ADS1261中指定它使用   SPI_PROT_POL0PHA1

      

        // SPI configuration. Use a 2MHz SPICLK and 8-bit word size.
        //
        SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
                      SPI_MODE_MASTER, 500000, 8);
    

    如果我使用  SPI_PROT_POL0PHA1、则数据是错误的(0x24而不是0x12)、但您会看到从器件实际上正在执行回显字节1:

    无论如何、我将继续使用寄存器、现在应该可以了。

    感谢您的支持。

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

    您好、Hal、

    是的、我过去曾看到一些 MCU 使用不同的命名法来表示不同的东西。 例如、某些 MCU 可能需要您设置 CPOL = 0和 CPHA = 0、以便我们将 SPI 模式01视为目标。 最终、您只需确保 MCU 被设置为使 SCLK 空闲并且在 SCLK 的下降沿读取数据、无论这是否被视为模式00、模式01等

    但是、听起来您已经解决了这一问题、并且正在取得进展。 如果您需要其他信息、请告知我们。 如果您有与此特定主题不相关的另一个问题、请随意启动新主题、我们将为您提供帮助。

    布莱恩