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.

[参考译文] RTOS/EK-TM4C123GXL:SPI 驱动程序

Guru**** 2460850 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/651442/rtos-ek-tm4c123gxl-spi-driver

器件型号:EK-TM4C123GXL

工具/软件:TI-RTOS

您好!

我正在实施 SPI 从接收器。 RTOS 驱动程序管理由固定数量的数据帧组成的 SPI 事务。

在我的情况下、我收到的帧数未知、是在未知时间到达的。

我想知道是否可以将 transaction.count 设置为1并循环。 我修改了 spilopopback 示例,以显示我的意思…

/*










使用从模式初始化 SPI 句柄*/ SPI_PARAMS_INIT (&slaveSpiParams);slaveSpiS.mode = SPI_SLAVE;slaveSpi = SPI_OPEN (Board_SPI1、&slaveSpiams);if (slaveSpi = NULL){System_abort ("Error Spi= SPI_OPENTI_OPEN ("Spi1、&slaveSpiSpince1);if) transaction = nraveSpince1;if (slaveSpince1)=

nr1nrf transaction/slaveTransaction_bers.if);if (初始化 SPI transaction = nrxeSpi_botrf);*


while (1){
//*启动 SPI 传输*/
transfer OK = SPI_transfer (slaveSpi、&slaveTransaction);

myRxBuffer[inPtr+]= slaveRxBuffer[0];

if (transferOK){
//打印从接收缓冲区的内容*/
System_avprintf ("从


机:%s\n"slxBuffer"

;slxtransfer})

这是可以的、还是有更好的方法接近它?

谢谢、

Richard

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

    您好 Richard、

    上述方法很可能满足数据字节传输频率较低的情况、但在连续传输大量数据时可能会出现问题。  原因是每次调用 SPI_TRANSFORT()时,DMA 都被配置为执行从内存到 SPI TX 以及从 SPI RX 到内存的数据传输;然后任务被阻止,直到传输完成。  虽然这不需要花费大量的时间/周期、但在传输结束和设置下一个传输之间仍然可能会丢失数据。

    主设备和从设备之间是否有协议?  例如、如果主器件发送1个字节、这是它接下来将发送的数据量;从器件随后可以接收/解析该字节并为下一个更大的传输做好准备。  具有某种协议/握手有助于缓解大型连续传输的问题。

    请告诉我这是否有帮助、

    伊曼纽尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Emmanuel、
    非常感谢、这非常有帮助。
    在一个不使用 RTOS 的早期项目中、我使用 uDMA 和乒乓缓冲来设置 SPI。 这非常成功、并且在5MHz 时具有16位帧、运行完美。 它持续计时、协议在没有任何可说的情况下交换0。 分析很容易:丢弃0、第一个非零字是要遵循的消息的长度。
    我想使用 RTOS 为该项目设置类似的设置、但无法找到设置 SPI 驱动程序以实现"自由运行"交换的方法。
    问题是我在 SPI_TRANSF()解锁/完成与下一个 SPI_TRANSF()调用之间有多长时间?
    如果 SSI 端口设置为在其 FIFO 中缓冲8个16位字、并且接口的时钟频率为1MHz、则为128uS -有足够的时间清空 rxBuffer。 但也许 SPI_TRANSF()会在进入时清除 FIFO?
    如何查看 SPI_TRANSF()的代码?
    我可以安排硬件握手、但这会增加我希望避免的复杂性!
    非常感谢——圣诞快乐!
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    埃马纽埃尔

    请允许我回忆一下您的帖子、因为"非常关心、非常详细-太棒了!"   您的观点远远超出了简单的观点-努力"为您的方向辩护"-这使您的指导特别令人信服。

    您已经确定了海报的"真正需求"、这可以确保获得更好的最终结果、并提供帮助(此处的其他人)... 太棒了!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB_1
    虽然我完全同意你的情绪、但我认为你的帖子不合适。
    此论坛适用于技术而非情感支持。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的"意见"Richard。    我是否可以问"你如何证明这种"强烈"的观点?"

    随着"类似的"的消失,现在(很少)还有办法来确定和登记对这种 "特别努力"的赞赏。

    伊曼纽尔的写法显然要求这种"承认"。

    最后、您的"圣诞快乐"服务是否没有给您"投诉的空虚"这样好的信号?   (还是"技术?")

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

    我们有一个增强请求、可以使用 SPI 执行某种类型的乒乓缓冲、但没有时间范围。 注意:您仍然可以使用您的方案、只需将代码更改为使用 Hwi 而不是 driverlib 来插入矢量表。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、不、有人称赞互联网上的某人! 让我把它用在耳塞中。

    Robert

    让我回应最初的赞美,这是当之无愧的。