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.

[参考译文] EK-TM4C123GXL:与 DWM1000进行 SPI 通信

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/607626/ek-tm4c123gxl-spi-communication-with-dwm1000

器件型号:EK-TM4C123GXL

大家好,

我最近开始使用 dwm1000模块,我对电路板上的 SPI 接口的工作原理有疑问,这是一个 MCU (在我的例子中是 Tiva c)和 dwm1000模块之间事务的示例

,我正在尝试读取包含0xDECA0130的寄存器地址0x00,但是由于 ARM 微控制器使用小端字节序,我应该在  总线上获得0x30 0x01 0xCA 0xDE 字节顺序。  

另请注意,在整个事务中 SPICS 行应该为低电平,我正在使用 TIvaware API,下面是我初始化和发送/读取数据的方法  

uint8_t DataToSend;
uint32_t rxDataOne = 0x00;
uint32_t rxDatatwo = 0x00;
uint32_t rxDatathree = 0x00;
//必须启用 SSI0外设才能使用。
SysCtlPeripheralEnable (sysctl_Periph_SSI2);
//首先禁用模块以配置 SPI
SSIDisable (SSI2_base);
//启用端口 b SysCtlPeripheralEnable (
sysctl_Periph_GPIOB)的时钟;
//将 IO 时钟设置为 SSI 时钟源
// SSIClockSet (SSIP2_SSIP2);



配置 GPIO_PINSSIP4 (SSIP_SSIPBLE_GPIO4);//配置 GPIO4 (SSIP_SSIP_SSIP4)
GPIOPinConfigure (GPIO_PB7_SSI2TX);
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI2));
GPIOPINTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4);
SSIPBET_SysCltl (SysCltl) SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、2000000、8);
SSIEnable (SSI2_base);
//配置数据发送到此处
DataToSend=0x00;
//发送数据
SSIDataPut (SSI2_base、DataToSend);
while (SSIBusy (SSI2_base);
SSIDatashu
(SSI2_base);SSIData&rxDataNet;SSIDataDataNet (SSatwo_base);SSI2&natwo_r&nat_dataNet (SSwo_base) 

现在我怀疑这是因为我使用数据获取和数据输入来读取和写入总线,而 TIvAware API 正在对 SSIDataPut 和 SSIDataGet 函数之间的 SPICS 进行解速率。 在整个事务中、它应该被设置为低电平、然而、由于我使用2个函数来读取和写入、它在发送数据的第一个字节后将其重新变为高电平、这将解释为什么我只获得1字节数据和 不再来自模块。  

如果上述内容正确,我应该修改代码,通过软件手动控制 SSI CS 引脚。是否正确?  

BR、
埃萨姆。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还想补充一点、我的 SPI 模式引脚连接是接地 SPIPHA 和接地 SPIPOL 以及 DWM1000板上的 SPIPOL、这意味着我在 Tiva c 上的模式应该是模式0、正如我所做的那样
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [报价 USER="Essam Eid]]如果上述内容正确,我应该修改代码,通过软件手动控制 SSI CS 引脚。我对吗?  [/报价]

    在任何情况下都应该这样做、但确实有另一个问题。

    [引用 user="Essam Eid]SSIDataPut (SSI2_base、DataToSend);while (SSIBusy (SSI2_base));

    在这里发送一个字节

    [引用 user="Essam Eid]SSIDataGet (SSI2_base、&rxDataOne);SSIDataGet (SSI2_base、&rxDatatwo);

    在这里、您读回该字节、然后执行另一个虚拟读取。 无论您如何选择芯片、SPI 总线上的数据都不会再出现。

    在 SPI 总线上、每个字节发送都会导致一个将被读取的字节。 为了读取一个字节、您必须首先写入一个字节。 SPI 只是一个移位寄存器、每次您为位中的某个位计时时、都会随时钟移出。 由于您读取的第一个字节只是当您在命令中计时时器件移位寄存器中发生的任何情况、因此很可能没有意义。

    在首次设置 SPI 时、您应该习惯做的一件事是观察示波器或逻辑分析仪上的信号线。 将相位和时序与您的器件要求进行比较。 SPI 可以在多种可能的模式下运行、但只有一种模式是正确的、尽管某些不正确的模式可能"几乎可以工作"。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、您建议首先通过我理解的软件手动控制 CS 值

    但是,对于第二部分,我理解的是,当我发送数据一个寄存器编号(例如使用 SSIDataPut())时,我在数据寄存器 FIFO 上接收数据,并且由于缓冲区接收到所有数据,所以我会逐字节读取数据。 根据我的理解,SSIDataGet ()函数将数据从数据寄存器移动到存储器中的某个位置,即我的 rxdataone 等变量。
    因此,发送单个“SSIDataPut ()”时,如果我想读取寄存器,然后使用数据集几次,直到 FIFO 为空,那是什么错误的? 意味着所有字节都已被读取? 由于 SSI DR 上的每次读取操作都会删除当前读取的字节并将下一个字节放置在缓冲区的顶部? 对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Essam Eid"]但是,对于第二部分,我理解的是,当我发送数据时,例如使用 SSIDataPut()发送寄存器编号,然后我在数据寄存器 fifo[/quot]上接收数据。

    是的、但该数据将是器件移位寄存器中发生的任何数据。 这将不会是您的命令的结果、因为器件尚未读取它。

    [引用 user="Essam Eid"]由于缓冲区接收到所有这些数据,因此我会逐字节读取数据

    如果您不继续执行操作、则没有任何内容可读。 正是写入操作产生时钟信号来为更多数据计时。

    在 SPI 通信中、每个写入必须具有关联的读取、同样、每个读取都需要写入。

    Essam Eid 说:
    dataget 数次,直到 FIFO 为空? 意味着所有字节都已被读取? 由于 SSI DR 上的每次读取操作都会删除当前读取的字节并将下一个字节放置在缓冲区的顶部? 右?[/引号]

    错误。 您必须为您读取的每个字节都写入一个字节。 您还必须为您写入的每个字节读取一个字节。 这是 SPI 的基础知识。

    因此、如果你有一个具有2字节响应的单字节命令、那么你将有一个类似的序列

    写入命令、读取虚拟

    写入虚拟、读取响应1

    写入虚拟、读取响应2

    现在、这些器件上的 SPI FIFO 使您能够写入多个字节、然后读取多个字节、但您需要确保 FIFO 不会溢出。  从简单的写入一个字节、读取一个字节序列开始可能更有意义。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,我理解了你的观点,我不知道在 MOSI 线路上没有使用写操作时不会生成时钟,所以我将尝试写命令读取虚拟等序列,看看它是否起作用! 谢谢 Robert!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    @ Robert、

    细节很好-准确地描述了这张海报的细节-不能更清楚了。

    许多人遗漏了"旧"数据(不太可能有用)与传输(有效) SPI 数据"按顺序"的同时到达。

    您的晶振清晰示例"写入虚拟、读取响应 n"无法改进-并且应该是 MCU 手册的"模型"-甚至那些(超出)此供应商...

    缺少此类明确性(包含供应商的 MCU 手册和代码示例)会继续使许多用户"跳闸"、正如此帖子所述... ("智能供应商"将利用您的"模型"、但它将(很快)旋转成为论坛漏洞...)