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.

[参考译文] HalCoGen 生成的代码 SPI 通知 API

Guru**** 2748915 points

Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/998243/halcogen-generated-code-spi-notification-api

主题中讨论的其他器件:HALCOGEN

我不太了解 HalCoGen 自动生成的 HAL 低级代码的设计/API。 我 的想法是、或者我已经这样做了、就是在没有/很少修改的情况下按原样使用它、但我发现不清楚如何最好地使用 API。

我有的示例、是来自 HalCoGen 层的 SPI 驱动程序的通知调用。  考虑说"spiEndNotification (spiBASE-t* SPI)"调用。

这个想法似乎很好、我可以提供这个处理程序的执行、以便在 TX 耗尽或 RX 缓冲区已满时进行回调。 看起来很好、但是

一件事情就是只使用一个参数、我的处理程序无法立即检查回调的原因/源代码、我的代码必须访问并重新检查 SPI 的寄存器以查看原因是什么。  但这意味着访问的寄存器与较低代码/HalCoGen 代码已经读取的寄存器相同-例如、就像标志一样-所以似乎我被强制执行第二次(或更多)相同的寄存器访问来再次读取相同的信息。 而且,这种情况甚至可能不再有效:例如:  中断和中断标志寄存器可能已被该代码修改

如果您的代码想检查调用 spiEndNotification()的原因,您似乎需要猜测 是 SPI 高级中断还是低级中断,您不知道需要  查看哪个- INTVECT0或 INTVECT1 -以查看它是完整的 Rx 还是空 Tx。

此外,一旦包含了 spiEndNotification()处理程序代码,就不能禁用该特定调用-它不再是可选的。 而且、由于发送将始终启用 TX 中断、因此您的代码现在将始终获取此调用、即使您不关心此调用(因为您已经使用 spiSendData 等设置了所有缓冲区)。

我想您可以避免使用此 spiEndNotification() API 部分,方法是使用应 传递所有标志的其他通知调用:void spiNotification(siBASE-t *spi, uint32 flags)

但如果不更改 HalCoGen 代码,还不清楚如何操作。 生成的中断处理程序代码- mibspi1HighLevelInterrupt、 mibspi1LowLevelInterrupt -仅针对默认开关情况调用此更"通用"spiNotification 回调、即 RX 满或 TX 空时的_Exclive_Cases。  所以... 当您只想发送/接收数据时,您似乎不打算在基本/正常情况下使用这些数据!

.and sendNotification 也不会将向量源作为参数、因此虽然不重要、但您可能无法签入您自己的处理程序、哪个中断源是它的源。  (但是... HalCoGen 代码会读取它、可能刚刚传递它)。

我在生成的中断处理程序中看到的另一个奇怪现象是、这个(不安全)代码(snip):

    switch(vec)
    {

    case 0x24U: /* Receive Buffer Full Interrupt */
             {
                uint16 *destbuff;
                destbuff = g_spiPacket_t[0U].rxdata_ptr;

                *destbuff = (uint16)spiREG1->BUF;

所以,呃, 很好,所以如果你做 spiSendAndReceive(.) 而不仅仅是 spiSendData(.) 这不会设置 RX、并且您没有专门禁用 RX、您基本上会使系统崩溃、尝试写入到空或无效的位置。

我对这个 API 感到非常跛行模式,我不知道我是否以灵活的方式理解它的正确使用模式。   

是否有一个适当的示例-超过2个内衬轮询的 SPI 发送/接收? 一个更复杂的中断驱动示例正在运行此 HalCoGen API?

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

    您好!

    [引用 userid="426815" URL"~/support/microcontrollers/hercules/f/hercules-safety-microcontrollers-forum/998243/halcogen-generated-code-spi-notification-api。]如果您的代码想检查为什么调用 spiEndNotification(),您似乎需要猜测这是 SPI 高级中断还是低级中断, 您不知道哪个- INTVECT0或 INTVECT1 -您需要查看它是完整 Rx 还是空 Tx。[/QUERP]

    您可以使用 API 获取     SPI TX 和 RX 数据块的状态: SpiTxStatus()和  SpiRxStatus(),也可以 直接使用 g_spiPacket_t[x]检查状态。  如果  是 TX 中断、TX_DATA_STATUS = SPI_Completed;    如果是 RX 中断、则 RX_DATA_STATUS = SPI_Completed。  

    [引用 userid="426815" url="~/support/microcontrollers/hercules/f/hercules-safety-microcontrollers-forum/998243/halcogen-generated-code-spi-notification-api ]so、err、 太棒了、如果您确实执行了 spiSendAndReceive(.) 而不仅仅是 spiSendData(.) 如果没有设置 RX、并且没有专门禁用 RX、则基本上会使系统崩溃、尝试写入到空或无效的位置。

    如果 SendspiData (..) TX 中断被启用、但是 RX 中断应该被禁用。  

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

    您好

    [引用 userid="45190" URL"~/support/microcontrollers/hercules/f/hercules-safety-microcontrollers-forum/998243/halcogen-generated-code-spi-notification-api/3687999 #3687999"]您可以使用 API 获取     SPI TX 和 RX 数据块的状态: SpiTxStatus()和  SpiRxStatus(),也可以 直接使用 g_spiPackage_t[x]检查状态。  如果  是 TX 中断、TX_DATA_STATUS = SPI_Completed;    如果是 RX 中断、则 RX_DATA_STATUS = SPI_Completed。  [/报价]

    Direct g_spiPackag_t[x]是一个私有成员(静态), 我更喜欢仅通过 API。   (否则、如果我在该代码中、我只能访问任何内容; 并更改我想要的方式)。

    是的、找到 SpiTX/RXStatus、方便使用。  看起来这是用于检查调用 endNotification 的原因。