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.

[参考译文] TMS570LC4357:帮助使用自动生成的 Halcogen API -spiTransmitAndReceiveData

Guru**** 2450280 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1223521/tms570lc4357-help-with-the-auto-generated-halcogen-api--spitransmitandreceivedata

器件型号:TMS570LC4357

我们正在开发一个需要 SPI 通信的项目、因此、为了满足我们参考的数据表中指定的数据通信协议、我们可能需要更改自动生成的 API。

因此、为了实现同样的目的、我们还需要一些材料或见解供参考。

我们的一些问题:

1) 1) CS_HOLD 与 SPI 通信的 CS 相同吗? (我们对此存在疑问、因为在论坛上我们看到一个代码将 CS_HOLD 初始化为 false、在 while 循环中的 if 语句后、我们再次将 CS_HOLD 设为0)

2) 2) 什么是 Chip_Select_Hold? (低电平有效/高电平有效)

2) WDEL (我们假设的一些延迟因素)和 CSNR 的任务是什么?

最后、如果我们要修改该特定 API 以首先传输数据、然后仅开始接收、那么我们应该如何处理? (目前、我们正在使用 spiTransmitData 和 spiReceiveData 的组合)

uint32 spiTransmitAndReceiveData (spiBASE-t *spi、spiDAT1_t * dataconfig_t、uint32 blocksize、uint16 * srcbuff、uint16 * destbuff)

   UINT16 Tx_Data;
   uint32 Chip_Select_hold =(dataconfig_t->CS_hold )? 0x10000000U:0U;
   UINT32 WDelay =(dataconfig_t->WDEL)? 0x04000000U:0u;
   SPIDATAFMT_t DataFormat = dataconfig_t->DFSEL;
   UINT8 ChipSelect = dataconfig_t->CSNR

/*用户代码开始(14)*/
/*用户代码结束*/
   while (blocksize!= 0u)
   {
       if ((SPI->FLG & 0x000000FFU)!= 0U)
       {
          中断;
       }

       if (blockSize == 1u)
       {
          Chip_Select_Hold = 0u;
       }
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序仅允许有效的非 NULL 输入参数"*/
       TX_Data =* srcbuff;

       SPI->DAT1 =((UINT32) DataFormat << 24u)|
                  ((UINT32) ChipSelect << 16U)|
                  (WDelay)          |
                  (CHIP_SELECT_HOLD)|
                  (UINT32) Tx_Data;
       /*SAFETYMCUSW 567 S MR:17.1,17.4. "需要指针增量"*/
       srcbuff++;
       /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
       while ((SPI->FLG & 0x00000100U)!= 0x00000100U)
       {
       }/*等待*/
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序仅允许有效的非 NULL 输入参数"*/
       *destbuff =(uint16)SPI->BUF;
       /*SAFETYMCUSW 567 S MR:17.1,17.4. "需要指针增量"*/
       减震缓冲器++;

       块大小--;
   }

/*用户代码开始(15)*/
/*用户代码结束*/

   返回(SPI->FLG & 0xFFU);
}

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

    尊敬的 Varikoti Siva:

    我们已着手解决您的问题、并将很快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Varikoti Siva:

    1) 1) CS_HOLD 与 SPI 通信的 CS 相同吗? (我们对此存在疑问、因为在论坛上我们看到一个代码将 CS_HOLD 初始化为 false、在 while 循环中的 if 语句后、我们再次将 CS_HOLD 设为0)

    2) 2) 什么是 Chip_Select_Hold? (低电平有效/高电平有效)

    [/报价]

    CS_HOLD 不同于 CS、我的意思是 CS_HOLD 的值不直接控制 CS 的值。 而不是该 CS_HOLD 值、有助于保持在传输之间激活的片选信号。 我的意思是、通常 CS 信号会在右侧传输之间停用、但如果设置了 CS_HOLD 位、则 CS_HOLD 信号不会在两次传输之间停用。

    之所以需要此行为、是因为某些从器件要求在几个连续数据字传输期间将片选信号持续保持在活动状态。 因此、此 CS_HOLD 有助于与此类从器件一起工作。

    如果您验证上述波形、首先我们向右写入了 CS_HOLD =1、这意味着在第一次传输完成后不应停用 CS 信号。 这就是为什么您可以看到只有在第一次传输完成后 CS 引脚才处于保持状态。 第二次写入时、我们使 CS_HOLD = 0正确、这意味着在完成第二次传输后、应该需要停用 CS 信号、因此您可以看到、在第二次传输结束后、CS 信号变为逻辑高电平(即停用)。

    有关更多详细信息、请参阅  28.2.6.5.2保持芯片选择有效 和  28.2.6.5.2.1主模式下的 CSHOLD 位  SECTIONS。

    Unknown 说:
    2) WDEL (我们假设的一些延迟因素)和 CSNR 的任务是什么?

    正如我们在上面的段落中讨论的那样、通常 CS 引脚将在右侧传输之间停用。 传输之间实际被停用的时间最小为2VCLK 周期。 但一些从器件可能需要更多的停用时间、在这种情况下、您可以使用 WDEL 和 WDELAY 值来控制该停用时间。

    其中、  

    WDEL-是一个针对 WDELAY 的使能位

    WDELAY-保存以 VCLK 周期为单位的实际延迟值。

    延迟公式为  

    芯片选择 停用延迟(等待延迟)=(WDELAY + 2)×VCLK_PERIOD 持续时间

    因此、例如、如果我配置 WDELAY=5并且我启用了 WDEL 位、那么最小芯片选择停用时间将等于7个 VCLK 周期。

    更多细节请参考  寄存器说明部分中的 WDEL 和 WDELAY 位说明。

    --

    谢谢。此致、
    Jagadish。

    [/quote]