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.

[参考译文] ADS8686SEVM-PDK:尝试从 STM32读取寄存器失败

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1011158/ads8686sevm-pdk-trying-to-read-registers-from-stm32-fails

器件型号:ADS8686SEVM-PDK
主题中讨论的其他器件:ADS8686S

我有一些非常简单的代码尝试在 SPI 模式下从 ADS8686S 寄存器读取。 我无法使其正常工作、但我相信我遵循数据表7.5.3.3中的时序图。

SPI 配置:


/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;

后跟一个尝试读取寄存器0x02的非常简单的函数(抱歉、请说明硬编码值、尚未将 intlo 打包为一个函数、因为我无法使此示例正常工作):

uint8_t rx[8] = { 0x00 };

// Read register 0x02
uint8_t tx[2] = { 0x04, 0x00 };

// Send read register command
set_adc_cs(GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, tx, 2, 1000);
set_adc_cs(GPIO_PIN_SET);

// Don't care
HAL_SPI_Receive(&hspi1, rx, 2, 1000);

// Receive register data
set_adc_cs(GPIO_PIN_RESET);
HAL_SPI_Receive(&hspi1, rx, 2, 1000);
set_adc_cs(GPIO_PIN_SET);

其结果是、我始终将0x00、0xFF 读取到 Rx 中。 这与寄存器的复位值不匹配。 实际上、我为前几个寄存器准备了相同的0x00、0xFF。 如果我尝试读取器件 ID、寄存器0x10 (TX[2]={0x20、0x00})、我会读回所有的0。 所以我的命令有点被接收、但结果毫无意义。 这样一个简单的示例会出什么问题?

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

    我将 SPI 配置固定为 SPI 模式2:

    /* SPI1 parameter configuration*/
    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi1.Init.CRCPolynomial = 10;

    我决定专注于读取 DEVICE_ID、并调整了读取位:

    uint8_t rx[2] = { 0x00, 0x00 };
    uint8_t tx[2] = { 0x00, 0x00 };

    // Read register device id
    tx[0] = 0x20;

    // Send read register command
    set_adc_cs(GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);
    set_adc_cs(GPIO_PIN_SET);

    tx[0] = 0x00;
    // Don't care
    HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);

    // Receive register result
    set_adc_cs(GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);
    set_adc_cs(GPIO_PIN_SET);

    使用此代码、当我需要{0x20、0x02}时、我返回{0x00、0x02}。 我还不清楚我的错误是什么、但它看起来更接近。 就像我在某种程度上丢失了一个字节一样。 有什么想法、我在这种感觉下把头撞在墙壁上?

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

    约旦、您好!

    我对延迟回复表示歉意、并感谢您的更新。

    您为 Device_ID 寄存器读取的数据(0x00 20)是正确的。 您预期的0x20表示寄存器地址0x10、实际上、当寄存器被读取时、寄存器地址不会在 SDO 上输出。 数据表中显示的 Device_ID 寄存器的复位值(0x2002)不正确、应将其更新为0x0002。 此外、应更新 ADS8686S 数据表中所有寄存器的复位值。 我希望这对我有所帮助,谢谢。

    此致、

    戴尔