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.

[参考译文] MSPM0G3519:DRV8363S 的 SPI 配置

Guru**** 2805935 points

Other Parts Discussed in Thread: MSPM0G3519, DRV8363, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1608479/mspm0g3519-spi-configuration-for-drv8363s

器件型号: MSPM0G3519
主题: DRV8363SysConfig 中讨论的其他器件

您好、

我正在使用 MSPM0G3519 和 DRV8363S。
我从基本的 SPI 外设初始化开始、以验证从 PICO 发送的数据。
我发送了0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88但只收到了
0x11, 0x22, 0x33, 0x44, 0x55。 此外、我已经确认该函数的返回值DL_SPI_fillTXFIFO8为 5。  


为什么仅传输 5 个字节?

image.png

image.png

 

image.png

此致、

Sakhan

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

    我已经使用了  

    DL_SPI_transmitDataBlocking8 函数 、用于发送 8 个字节的数据、我在 PicoScope 示波器中获得了相同的结果。 两种功能的区别是什么?

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

    我找不到该线程、但我认为这是 FIFO 造成的。 您只能发送 5 个字节(1 个立即数、FIFO 中为 4 个)、然后必须等待 FIFO 清除才能发送下一个批处理。 为什么 8 字节传输失败、我不知道。

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

    SPI TX FIFO 只有 4 个条目[Ref TRM (SLAU846C) 第 25.2.2.5]节。

    您将获得“Extra"(“(第(第 5 个)条目、因为一旦 FIFO 不为空、就会将第一个条目弹出到 FIFO 移位寄存器中。

    DL_SPI_transmitDataBlocking8 () 在加载 FIFO 后等待传输完成,因此那里的条目不会超过 1 个。

    [编辑:固定的 goof。]

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

    您好 Bruce 和 Keith、

    我已将 MSPM0 SPI 控制器配置为发送 DRV8363 SPI 帧。

    IC_STAT1 寄存器 (偏移= 0h)[复位= 8080h]

    现在的地址  IC_STAT1 寄存器  为 0x00 (偏移= 0h)。

    RW 为 1

    数据为 0x0000  

    奇偶校验为 1

    1.按照 DRV SDI 帧格式(24 位)构成的帧。 在连接到 DRV8363 之前通过启用内部环路模式来验证 SPI Tx 和 Rx。

    2.代码段

    #include "SPI_Frames.h"
    #include "globalVariables.h"
    #include "ti_msp_dl_config.h"
    #include <ti/driverlib/m0p/dl_interrupt.h>
    
    #define SPI_PACKET_SIZE 8
    #define TIME_BETWEEN_EACH_FRAME 13 // 400ns is 13, 1us is 32 (as per DRV datasheet)
    
    SDI_Frame tx;
    SDO_Frame rxFrame;
    uint8_t gTxPacket[SPI_PACKET_SIZE] = {0x11, 0x22, 0x33, 0x44,
                                          0x55, 0x66, 0x77, 0x88};
    uint32_t sendBytes;
    uint8_t i;
    uint8_t sdi[3];
    uint8_t txBytes[3];
    uint8_t rxBytes[3];
    
    //func proto
    static SDO_Frame drv8363_spi_transfer_frame(SDI_Frame txFrame);
    
    int main(void) {
      SYSCFG_DL_init();
    
      //nSLEEP to "HIGH" (Enable the DRV)
      DL_GPIO_setPins(GPIO_GRP_0_PORT, GPIO_GRP_0_PIN_B12_PIN);
      drv8363_ReadFrame(&tx, 0x00);
      
    
        drv8363_spi_transfer_frame(tx);
    
        drv8363_ReadFrame(&tx, 0x00);
        
        drv8363_spi_transfer_frame(tx);
    
      while (1) {
      }
    }
    
    static SDO_Frame drv8363_spi_transfer_frame(SDI_Frame txFrame)
    {
    
    
    
        /* -------- Split SDI raw into 3 bytes (MSB first) -------- */
        txBytes[0] = (txFrame.raw >> 16) & 0xFF;
        txBytes[1] = (txFrame.raw >> 8)  & 0xFF;
        txBytes[2] = (txFrame.raw)       & 0xFF;
    
        /* -------- Start SPI frame -------- */
         for (int i = 0; i < 3; i++)
        {
            DL_SPI_transmitDataBlocking8(SPI_0_INST, txBytes[i]);
            rxBytes[i] = DL_SPI_receiveDataBlocking8(SPI_0_INST);
        }
    
        while (DL_SPI_isBusy(SPI_0_INST));
    
        /* -------- End SPI frame -------- */
    
    
        /* -------- Assemble received bytes into SDO raw -------- */
        rxFrame.raw =
            ((uint32_t)rxBytes[0] << 16) |
            ((uint32_t)rxBytes[1] << 8)  |
            ((uint32_t)rxBytes[2]);
    
        return rxFrame;
    }

          

    3.使用 Picoscope 示波器验证 Pico 针数据。 有 48 个上升沿(每个帧= 24 个时钟上升沿)  

    4.现在、使用正确的引脚映射连接 DRV8363。 [SPI CLK 至 DRV SCLK、SPI CS 至 nSCS、SPI PICO 至 SDI、 SPI POCI 至 SDO]

    此外、nSLEEP 设为高电平、以便在上电后清除故障引脚。 请参阅下面的 MSPM0 和 DRV 设置、

    当我将读取帧[0x810000]发送到 DRV 时、没有响应((Rx 寄存器中没有收到任何响应)为什么? 甚至我实现了发送到 MSPM0 到 DRV 的每一帧之间的延迟(请参阅 Picoscope 数据)。

    即使发送所需的帧后、我也没有从 DRV 获取数据?  

    请帮我解决这个问题。

    此致、

    SaKhan

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

    模式“Motorola 4 线“表示硬件/CS(本例中为 PC7)。 如果 (a) SPH=0 或 (b) TX FIFO 变为空、则 SPI 单元将在字节之间将 nSCS 置为无效[Ref TRM (SLAU846C) 第 25.2.3.1]节。 虽然 DRV8363 数据表 (SLVSHQ3) 第 6.6.1 节没有明确说明、但这表明 nSCS 必须在全部 3 个(或 4 个具有 CRC 的字节)内保持有效。 通常:您应该针对 nSCS 使用 GPIO(如果需要,您可以使用 PC7)、而不是硬件/CS。

    -------------------

    为了让您立即行动:您似乎正在使用 SPH=1 (“在第二个时钟边沿捕获“)、这使/CS 在“连续背靠背“字节序列中保持有效、这意味着“TX FIFO 永远不会变为空“。 您(通常)可以通过预加载 TX FIFO 来实现此目的。 正如我所知、DRV8363 事务全部为 3 字节(或 4 字节带 CRC)、适合 FIFO。

    所以我建议您返回使用  DL_SPI_fillTXFIFO8 ()、但一次限制为 3(或 4)个字节。 [即使这不能保证、因此长期来看您应该考虑将 GPIO 用于/CS。]

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

    您好 Bruce、

    我已经做了建议的更改 4 线到 3 线 (Manuall CS)。 现在、我的 CS 对于整个 SPI 帧持续为低电平(未置为无效)

    然后、我使用了 TXFIFO 而不是 TXBlocking、我已经按预期观察到了完整的 24 个时钟周期。

    但从 MSPM0G3519 发送确切帧后、DRV 没有响应。 您能否请确认以下发送和接收函数实现正确无误?

     是否有适用于 DRV8363 的任何实现库(也可以使用任何其他 TI MCU 而不是 MSPM0G3519)。  

    此致、

    SaKhan

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

    1a) 我看不出你的代码有什么明显的错误。 也许检查您的接线(再次)?

    1b) 假设较低的迹线是/CS、我注意到它一直处于低电平(置为有效)、直到事务开始之前、并且在传输再次变为低电平之前非常短暂地变为高电平。 在 1Msps 下、我无法分辨其持续时间、但数据表 (SLVSHQ3) 第 5.6 节要求其处于高电平并持续至少~0.5usec。 我建议您将/CS 引脚最初设置为=1(我认为 SysConfig 可以这样做)、这应该可以确保即使在启动时/CS 处于空闲状态也是高电平。

    2) 真相是已知的,我不知道很多关于这个设备(但我做了一些 SPI 在我的生活)。 EVM 页面(此处)提供了一个可下载的示例 (DRV8363_Piccolo.zip)、其中包含 Sensored_Trap (Piccolo) 的源代码、还有一个 SPI_read () 函数(我想)几乎能执行您所做的操作。 [虽然我不太明白为什么它在每次 SPITXBUF 写入后立即对 SPIRXBUF 进行虚拟读取。]