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.

[参考译文] TMS570LS1227:MibSPI 动态传输组长度

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/975052/tms570ls1227-mibspi-dynamic-transfer-group-length

器件型号:TMS570LS1227

我使用来自 HalGen 的 MibSPI 框架、在这里我使用传输组0和1。 这些组使用16位数据格式设置为10上的长度。 这是我需要的最大长度。 但是传输可以是1到10个16位字、因此我需要动态更改传输长度。 为此、我在 MibSPI 传输命令之前编写了以下函数:

typedef 枚举{
   QSPI_TRANSFS_OUTPUT 组、
   QSPI_TRANSFS_INPUT_GROUP、
   QSPI_TRANSFS_LAST_GROUP
}QSPI_TRANSFS_GROUK_ENUM;

#define QSPI_PORT                      MibspiREG5

void QSPI_TransferSetup (uint16_t u16Size、QSPI_transfer_Group_enum TransferGroup)

   uint8_t    loop;
   uint32_t   缓冲区大小总计;

   transferGroupSize[TransferGroup]=(uint32_t) u16Size;

   QSPI_PORT->TGCTRL[QSPI_TRANSFER_INPUT_Group]&= 0xFFFFFF0000;
   QSPI_PORT->TGCTRL[QSPI_TRANSFER_INPUT_Group]|=(transferGroupSize[QSPI_TRANSFER_OUTPUT_Group]<< 8);

   BufferSizeTotal = transferGroupSize[QSPI_transfer_output_Group]+ transferGroupSize[QSPI_transfer_input_Group];

   for (LOOP = QSPI_TRANSFS_LAST_GROUP;LOOP < 8;LOOP++)
   {
       QSPI_PORT->TGCTRL[LOOP]&= 0xFFFFFF0000;
       QSPI_PORT->TGCTRL[LOOP]|=(BufferSizeTotal << 8);
   }

   QSPI_PORT->TGCTRL[8U]=缓冲区大小总计<< 8U;
   QSPI_PORT->LTGPEND =(QSPI_PORT->LTGPEND & 0xFFFF00FFU)|((BufferSizeTotal - 1U)<< 8U);

数组传输组大小只是每个传输组新大小的本地分段。

但这不奏效。 观察示波器上的信号时、传输组大小始终为10。

我缺少什么?

我已经查看过

但它没有帮助。

Andy

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

    尊敬的 Andy:

    您是对的、您可以动态更改组的缓冲区编号。  

    清除位字段[15:0]并禁用 TG:  

    mibspiREG5->TGCTRL[0]&= 0x7FFF0000;   

    mibspiREG5->TGCTRL[1]&= 0x7FFF0000;   

    mibspiREG5->TGCTRL[2]&= 0x7FFF0000;   

    要将组0的大小更改为 TG0_SIZE:  

    mibspiREG5->TGCTRL[1]|=(TG0_size-1)<< 8);

    要将组1的大小更改为 TG1_SIZE:  

    mibspiREG5->TGCTRL[2]|=(TG1_Size-1)<<8 );

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

    您好 QJ、

    这是完美的。

    谢谢你。

    Andy

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

    您好!

    我认为这解决了我的问题、但它没有解决。

    如果我将大小设置为5个组(数据格式设置为16位时为10个字节)、则器件会发送4个组、然后将 CS 始终保持为低电平。

    此致

    Andy

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

    尊敬的 Andy:

    对于每个传输组的最后一个缓冲区、请禁用芯片选择保持。  

    对于(索引= 40;索引< 49;索引++)

      mibspiRAM5->TX[index].control |= 1 << 12;      /*芯片选择保持*/

      mibspiRAM5->TX[49].control &=^(1 << 12);      /*禁用芯片选择保持*/

    TGCTRL[5]中的启动缓冲区应进行编程、以定义 TG4 (第5组)组大小。

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

    您好!

    感谢您的回复。 我在做了一些工作(比较不同的长度并生成 HalGen 代码并查看 mibspi.c 文件内的变化)之后得出了这一结论、现在有一个工作解决方案可以很好地工作。

    目前、我仅使用1个传输组、我已将长度最大化为128。 这可确保每个 mibspiRAM5->TX[index].control 在开始时都有一个设置。 然后、我使用以下函数(请记住、现在仅使用1个 TG (QSPI_TRANSFER_OUTPUT 组= 0)):

    void QSPI_TransferSetup (uint16_t u16Size、QSPI_transfer_Group_enum TransferGroup)

       uint16_t   i = 0;

       transferGroupSize[TransferGroup]=(uint32_t) u16Size;
       QSPI_PORT->TGCTRL[QSPI_TRANSFER_OUTPUT 组]&= 0x7FFF0000;

       IF (QSPI_TRANSFERS_OUTPUT 组= TransferGroup)
       {
           QSPI_PORT->TGCTRL[QSPI_TRANSFER_INPUT_Group]&= 0x7FFF0000;
           QSPI_PORT->TGCTRL[QSPI_TRANSFER_INPUT_Group]|=(uint32_t) u16Size << 8U;
       }
       其他
       {
           IF (QSPI_TRANSFERS_INPUT_GROUP = TransferGroup)
           {
               QSPI_PORT->TGCTRL[QSPI_TRANSFER_LAST_GROUP ]&= 0x7FFF0000;
               QSPI_PORT->TGCTRL[QSPI_TRANSFER_LAST_Group]|=(uint32_t) u16Size << 8U;
           }
       }

       QSPI_PORT->LTGPEND =(uint32_t)(u16Size - 1)<< 8U;

       while (i < u16大小)
       {
           QSPI_PORT_RAM->TX[I].CONTROL |=(uint16)((uint16) 1U << 12U);//确保 CS 有效
           i++;
       }
       //此行会使发送 TG 结束时的 CS 甜点
       QSPI_PORT_RAM->TX[u16Size - 1].control ~(uint16)(((uint16) 1U << 12U);

    感谢你的帮助。

    Andy