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.

[参考译文] ADS127L01:无法通过 SPI 读取寄存器

Guru**** 2390755 points
Other Parts Discussed in Thread: LAUNCHXL-CC26X2R1, ADS127L01

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1120533/ads127l01-can-not-read-registers-through-spi

器件型号:ADS127L01
主题中讨论的其他器件:LAUNCHXL-CC26X2R1

大家好、

我想   通过 SPI 将一个 ADS127L01连接到我的 LAUNCHXL-CC26X2R1。 首先、我只想读取 ADS127L01中的寄存器来测试 SPI 连接。 (地址00h 上的 ID 寄存器)

我根据 SDK 上的 spimaster 示例编写了代码。

这是我的代码。

#define THREADSTACKSIZE (1024)

#define SPI_MSG_LENGTH  (1) 

static Display_Handle display;

uint16_t masterRxBuffer[SPI_MSG_LENGTH];
uint16_t masterTxBuffer[SPI_MSG_LENGTH]; //unsigned char
uint32_t        i;


/*
 *  ======== masterThread ========
 *  Master SPI sends a message to slave while simultaneously receiving a
 *  message from the slave.
 */
void *masterThread(void *arg0)
{
    SPI_Handle      masterSpi;
    SPI_Params      spiParams;
    SPI_Transaction transaction;
  //  uint32_t        i;
    bool            transferOK;
    int32_t         status;


    /* Open SPI as master (default) */
    SPI_Params_init(&spiParams);
    spiParams.frameFormat = SPI_POL0_PHA1;
    spiParams.bitRate = 200000; 
    spiParams.dataSize = 8;
    spiParams.mode = SPI_MASTER; 

    masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);
    if (masterSpi == NULL) {
        Display_printf(display, 0, 0, "Error initializing master SPI\n");
        while (1);
    }
    else {
        Display_printf(display, 0, 0, "Master SPI initialized\n");
    }


    /* Copy message to transmit buffer */

    for (i = 0; i < 100000; i++) {

        /* Initialize master SPI transaction structure */
            masterTxBuffer[0] = 0x2000;
        
        transaction.count = SPI_MSG_LENGTH;
        transaction.txBuf = (void *) masterTxBuffer;
        transaction.rxBuf = (void *) masterRxBuffer;

        /* Perform SPI transfer */
        transferOK = SPI_transfer(masterSpi, &transaction);
        if (transferOK) {
            Display_printf(display, 0, 0, "Master received: %d ",masterRxBuffer[0]);
        }
        else {
            Display_printf(display, 0, 0, "Unsuccessful master SPI transfer");
        }

        /* Sleep for a bit before starting the next SPI transfer  */
        sleep(1);
    }

    SPI_close(masterSpi);

    Display_printf(display, 0, 0, "\nDone");

    return (NULL);
}

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
    pthread_t           thread0;
    pthread_attr_t      attrs;
    struct sched_param  priParam;
    int                 retc;
    int                 detachState;

    /* Call driver init functions. */
    Display_init();
    GPIO_init();
    SPI_init();

    /* Open the display for output */
    display = Display_open(Display_Type_UART, NULL);
    if (display == NULL) {
        /* Failed to open display driver */
        while (1);
    }


    Display_printf(display, 0, 0, "Starting the SPI master example");
    Display_printf(display, 0, 0, "This example requires external wires to be "
        "connected to the header pins. Please see the Board.html for details.\n");

    /* Create application threads */
    pthread_attr_init(&attrs);

    detachState = PTHREAD_CREATE_DETACHED;
    /* Set priority and stack size attributes */
    retc = pthread_attr_setdetachstate(&attrs, detachState);
    if (retc != 0) {
        /* pthread_attr_setdetachstate() failed */
        while (1);
    }

    retc |= pthread_attr_setstacksize(&attrs, THREADSTACKSIZE);
    if (retc != 0) {
        /* pthread_attr_setstacksize() failed */
        while (1);
    }

    /* Create master thread */
    priParam.sched_priority = 1;
    pthread_attr_setschedparam(&attrs, &priParam);

    retc = pthread_create(&thread0, &attrs, masterThread, NULL);
    if (retc != 0) {
        /* pthread_create() failed */
        while (1);
    }

    return (NULL);
}

但 masterRxBuffer 不符合预期(数据表中提到的 x3h)。  

我将4个引脚(SCLK、MOSI、MISO、CS)从  ADS127L01连接到 LAUNCHXL-CC26X2R1、 并开始设置为1 、并设置为0。我还应该做什么?  

适用于 spimaster  示例的 SDK 版本:SimpleLink CC13x2 26x2 SDK (5.30.01.01)

Code Composer Studio 版本:11.1.0.00011

提前感谢

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

    您好、Kim、

    对于 SPI 模式、FORMAT 和 FSMODE 引脚都应设置为0。

    此外、查看您的代码、您会发现 SPI 设置为8b 宽。  写入或读取寄存器时、读取/写入单个寄存器时、SPI 帧长度为24b。  帧长度由/CS 引脚定义、并且必须在整个帧内保持低电平。  我猜、在读取/写入命令期间、/CS 会在字节之间变为高电平、在这种情况下、ADS127L01将不会将其识别为有效命令。

    请使用示波器或逻辑分析仪并记录 SCLK、MOSI、MISO、CS 引脚以验证操作是否正常、尤其是对于/CS 引脚。  如果您 可以分享这些结果、我将验证它们是否正确。

    下面是一个读取3个寄存器的示例、结果是帧大小为40b。  在整个帧期间、/CS 应该为低电平。

    此致、
    Keith Nicholas
    精密 ADC 应用

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

    您好、Keith、

    感谢您的回答、

    我更改了帧大小、实际上我将 transaction.count 更改为 3。 我也遇到了 CLK 引脚的另一个问题。 我修复了它们、现在我可以读取寄存器。

    现在、我要读取数据。 帧大小是否应设置为32位?  

    此致。

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

    您好、Kim、

    可以、您可以将帧大小设置为32位。  这将导致两个寄存器值(2x 8b)被读回。  命令应为:

    0x2r010000h、其中"r"是要读取的第一个寄存器的起始地址。  如果将"r"设置为0h、则将读回 ID 和配置寄存器。

    此致、
    Keith

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

    您好、Keith、

    我指  的是通过命令(RDATA)读取数据的帧大小、第一个字节应为(0x12)。  

    在本例中、我们需要8位用于命令、24位用于数据、对吧?  

    此致、

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

    您好、Kim、

    抱歉;我误解了您的问题。

    是的、您需要32b SPI 帧才能使用 RDATA 命令读取转换数据。

    您将发送0x12000000h、并且在同一个 SPI 帧中、从第9个 SCLK 开始接收转换结果。

    此致、
    Keith

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

    您好、Keith、

    感谢您的回答、我现在可以读取数据。

    此致、