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.

[参考译文] DRV8243-Q1:在 SPI 通信中读取 Device_ID 寄存器时遇到问题

Guru**** 2463330 points
Other Parts Discussed in Thread: DRV8243-Q1

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1309265/drv8243-q1-facing-issue-with-spi-communication-to-read-the-device_id-register

器件型号:DRV8243-Q1

您好!

我们使用 DRV8243-Q1进行电机控制、并使用 SPI 接口 与 DRV8243和 stm32f401re MCU 进行通信。 寄存器时使用的最大电流。 此外、还请澄清我在通过 SPI 通信与驱动器进行通信时的一些疑问。

与驱动程序通信需要进行哪些 SPI 初始化设置?  

2.如 nsleep、nFAULT、DRVOFF 等引脚应该保持高电平或低电平以便开始通信?

3、为了与驱动程序通信(即读取和写入寄存器)、我将 SPI 模式配置为模式0、MSB 优先、时钟频率为1MHz 和16位帧格式。 尝试读取 Device_ID 寄存器、但无法获得预期的结果。 和使用 SPI HAL 库。

预期结果应为0x32、因为我正在使用 DRV8243-Q1、但我得到的是0x80、如下面所附的屏幕截图所示。  

上述读取的代码片段在下面随附、

 uint8_t R_device_id = 0b01000000;
 //Read data from the DRV8243 DeviceID register
    uint32_t DeviceIDRegisterAddress = R_device_id;
    DeviceIDRegisterValue1 = readDRV8243Register(&hspi2,DeviceIDRegisterAddress,0x00);
    
    //function definition for read register
    uint16_t readDRV8243Register(SPI_HandleTypeDef *hspi,uint8_t regAddress,uint8_t regValue)
{
    // Select the DRV8243(DRV1) by pulling CS low
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 0);

    // Send the register address to request data
	 uint16_t dataToSend = ((uint16_t)regAddress << 8) | regValue;
    //HAL_SPI_Transmit(hspi,(uint8_t*)&dataToSend, 2, 100);
    // Receive the data from the DRV8243
    uint16_t receivedData;
    HAL_SPI_TransmitReceive(hspi, (uint8_t*)&dataToSend, (uint8_t*)&receivedData, 1, 100);
    // Deselect the DRV8243(DRV1) by pulling CS high
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 1);

    return receivedData;
}

谢谢!

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

    你好, Deekshitha,

    感谢您在此论坛中发帖。 我会按照与您的问题相同的顺序发布我的回复。

    1.数据表第20页提供了相关信息。 控制器 MCU SPI 必须配置为符合 SPI 的以下状态和时序。 nSCS 与 CS (芯片选择)类似,它在 SPI 事务期间必须为高电平且低电平有效,并且必须恢复为高电平才能完成事务。 请观察指示的时钟极性和时钟相位。  

    2.是的,该器件必须为 SPI 事务处于唤醒状态,nSLEEP =高电平。 请注意、当 nSLEEP 从低电平变为高电平时、必须在 唤醒器件后立即启动第一个 SPI 事务之前提供 tREADY 的延迟。 如数据表规格中所述、这个值为1ms。

    3、根据屏幕截图、时钟极性配置 与所需的 SPI 时钟相反。 将模式配置为 SPI 时钟空闲低沿和下降沿 SDI 捕捉点。 我注意到在完成交易后 nSCS 没有恢复到高电平。 可能是在屏幕中未捕获到代码。 完成事务后 nSCS 恢复为高电平非常重要。 请参阅数据表的第49页。

    此致、Murugavel

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

    您好,Murugavel

    感谢您的答复。 我已经遵循了你在上面的答复中提到的内容。 仍然无法按照我之前的查询所述正确读取 DEVICE_ID、而不是使用0x32。我得到的是0x80。我将随附 SPI 通信的屏幕截图。 我已通过 MODE0初始化 SPI、并在激活 nSLEEP 和首次 SPI 通信之间指定了1ms 的延迟。

    uint8_t R_device_id = 0b01000000;
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, 1);   //LC nSLEEP
    HAL_Delay(1);
    uint32_t DeviceIDRegisterAddress = R_device_id;
    DeviceIDRegisterValue1 = readDRV8243Register(&hspi2,DeviceIDRegisterAddress,0x00);
    
    //FUNCTION DEFINITION
    uint16_t readDRV8243Register(SPI_HandleTypeDef *hspi,uint8_t regAddress,uint8_t regValue)
    {
        // Select the DRV8243(DRV1) by pulling CS low
    	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 0);
        // Send the register address to request data
    	 uint16_t dataToSend = ((uint16_t)regAddress << 8) | regValue;
        // Receive the data from the DRV8243
        uint16_t receivedData;
        HAL_SPI_TransmitReceive(hspi, (uint8_t*)&dataToSend, (uint8_t*)&receivedData, 1, 100);
        // Deselect the DRV8243(DRV1) by pulling CS high
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 1);
        return receivedData;
    }

     谢谢!

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

    你好,Deekshitha,

    解码器逻辑在您共享的逻辑分析仪屏幕捕获中反相。 有关正确的解码器设置、请参阅以下示例。 在 SPI 时钟下降沿进行数据捕获。 我希望这对您有所帮助。 作为参考、许多客户都使用了该产品和该系列器件中的几款产品、它们在 SPI 事务处理方面没有问题。 每个器件还在生产时进行了验证。 如果存在 SPI 读取问题、很可能是与微控制器 SPI 模式设置或 SPI 硬件连接相关。 根据捕获结果、看起来硬件连接可能没问题。

    解码器设置:

    进一步检查您最近的逻辑捕获后、查看 SPI 时钟 SDI 的下降沿似乎会得到0xC0、这是一个不存在的地址。 虽然时钟极性现在看起来正确、但时钟相位与 DRV8243-Q1要求不匹配。 必须修复此问题。  

    此致、Murugavel