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.

[参考译文] CCS/TMS320F28335:TMS320F28335

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/890962/ccs-tms320f28335-tms320f28335

器件型号:TMS320F28335

工具/软件:Code Composer Studio

此外、在带有中断的 SCI 回送示例中、我无法理解以下行集:

//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.SCIRXINTA =&sciaRxFifoIsr;
PieVectTable.SCITXINTA =&sciaTxFifoIsr;
PieVectTable.SCIRXINTB =&scibRxFifoIsr;
PieVectTable.SCITXINTB =&scibTxFifoIsr;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

1.此函数之前的'&'是什么意思? 注释行显示了它的重映射、但我无法理解它。 此外、该函数还有一个下划线、这显然意味着编译器和标准库使用的函数。 我无法理解这一点。

2.这些行是否也调用了各自的函数(sciRxFifoIs 等)? 因为在代码中没有其他地方调用此函数。 那么、如何执行该函数呢?  该行只是建议它被映射、并且没有函数调用。 但是  

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

    Anu、

    您是否参加了有关该器件的一日技术讲座? 它通过中断服务例程。

    https://training.ti.com/c2000-f2833x-microcontroller-workshop

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

    我已经搜索过该手册、但无法找到有关 ISR 的信息。  

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

    您搜索了有关 ISR 的哪些手册?

    这是编译器文档的链接

    http://www.ti.com/lit/ug/spru514p/spru514p.pdf

    您是否参加过技术讲座以更好地了解器件?

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

    谢谢。 我现在可以理解。 但我无法理解如何在以下特定代码中调用 ISR:

    根据 SCI 参考指南、如果 TXFFST 小于 TXFFIL、TX FIFO 将生成中断:

    "当 FIFO 状态位(TXFFST4-0)小于或等于 FIFO 中断级别位(TXFFIL4-0)时、发送 FIFO 将产生中断"。

    那么、在这里、只要 TxFifo 没有少于8个字、就会为 SciaTxFifoIsr 提供服务。 (因为在此代码中、TXFFIL 被写入8)

    因此 ,在调用 scia_fifo_init()之后,  会立即设置 SciaRegs.SCIFFTX.All= 0xC028。 因此、现在 TXFFIL = 8个字、而 TxFifo 具有0个字。 因此、将输入 ISR SciaTxFifoIsr 并进行服务。 因此 SCITXBUF 将写入 sdataA[i]的值。

    但 sdata[i]仅在步骤5中初始化(在  scia_fifo_init()之后;在步骤4中调用)。  

    那么、由于 sdata[i]的值在初始化前被写入、那么 SCITXBUF 中将写入什么值?

    [初始化仅在步骤5中进行。 但是 ,在步骤4中调用 scia_fifo_init(),使中断服务例程作为 TXFFST (0个字)被调用,小于 FIFO 中断级别位(TXFFIL)-它有8个字 ]

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

    Anu、

    我仍然建议您浏览技术参考手册第1.6节的 PIE 控制部分。 这详细说明了如何在器件上管理中断。

    http://www.ti.com/lit/ug/sprui07/sprui07.pdf。 

    在步骤5中启用中断后、才会生成中断。

    //
    //启用此示例所需的中断
    //
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
    PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE 组9,INT1
    PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE 组9,int2
    PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE 组9,INT3
    PieCtrlRegs.PIEIER9.bit.INTx4=1; // PIE 组9,int4
    IER = 0x100;//启用 CPU INT
    EINT; 

    专题讨论会链接:

    https://training.ti.com/c2000-f2833x-microcontroller-workshop

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

    谢谢。 这让我明白了。 不过、在同一个带有中断的 SCI 回送示例中、我有最后一个疑问。

    SCITXFIFO 和 SCIRXFIFO 配置为:

    SciaRegs.SCIFFTX.All=0xC028;// 1100 0000 0010 1000  // TXFFIL = 8个字,RXFFST =0

    SciaRegs.SCIFFRX.All=0x0028;// 0000 0010 1000  // RXFFIL = 8个字,RXFFST=0

    第一个问题是 Tx/RX FIFO 和 TX/RXBUF 只有8位宽-->一个字。 那么、它们如何容纳8个字呢? 如果 TXFFST = 8、则表示接收 FIFO 中有8个字对吗? 怎么可能?

    2.根据 SCI 参考指南、如果 TXFFST 小于 TXFFIL、TX FIFO 将生成中断

    "当 FIFO 状态位(TXFFST4-0)小于或等于 FIFO 中断级别位(TXFFIL4-0)时、发送 FIFO 将产生中断"。

    因此、当 接收到一个字并且为所有 TXFFST <TXFFIL (8 words) right? 提供中断服务时、将从 sdataA[i]数组中读取数据  

    但是只有当 RXFFST 大于 RXFFIL 时、RX FIFO 才会产生中断

    "当 FIFO 状态位(RXFFST4-0)大于或等于 FIFO 中断级别位(RXFFIL4-0)时、接收 FIFO 会产生中断"。

    由于在内部回送中、Tx 和 Rx 短接、因此 Rx 中将接收相同的数据。

    因此、数据将从 SCIRXBUF 阵列中读取。 但是只有当 RXFFST>=RXFFIL 时、才会为中断提供服务。 因此、这意味着 ISR 将仅在 RXFFST 达到8时运行。 但 FIFO 本身只能保存8位(1个字)。 那么、如何一次读取8个字的数据呢? 此外、示例代码中的 ISR 表明读取的数据仅为一个字。 如果仅在 RXFIFO 有8个字且只读一个字时才调用中断、则7个字的其余部分将永远不会被读取。 那么、这是否意味着数据是作为接收字时读取的? 但定义说明了其他情况。 (也就是说、只有在 RXFFST >= RXFFIL 时才会处理中断)。

    for (i=0;i<8;i++)


    rdataA[i]=SciaRegs.SCIRXBUF.all;//读取数据

    这是怎么可能的?

    谢谢!

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

    [引用 user="Anu B"]1. 我的第一个疑问是 Tx/RX FIFO 和 TX/RXBUF 只有8位宽-->一个字。 那么、它们如何容纳8个字呢? 如果 TXFFST = 8、则表示接收 FIFO 中有8个字对吗? 如何实现?[/报价]

    请查看第10.14.2.10节中 SCIFFTX 寄存器的定义。

    对于#2和#3、我建议您仔细查看第10.13.1节中的 SCI FIFO 说明。

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

    好的、那么只需澄清一下。

    Tx/Rx FIFO 是一个16 x 8位的堆栈、因此可以容纳16个字。

    根据示例中 Tx 和 Rx FIFO 的配置、数据将被写入 SCITXBUF 1字一次。

    但是、在 FIFO 被启用时、TXSHF 将在一个可选延迟值(SCIFFCT)后被直接载入;TXBUF 将不被使用。 那么、在 ISR 中写入 TXBUF 有什么意义呢?

    3.当 SCI 接收到数据时、RXENA (SCICTL1.0)被置位、 RXSHF 寄存器中的数据被传输到 SCIRXBUF 寄存器。  此操作将置位 RXRDY 标志(SCIRXST、位6)、如果 RX/BK INT ENA 位(SCICTL2.1)被置位、 则会启动一个中断。

    但是在 FIFO 被启用的情况下、如果 RXFFIL 被置位并且 RXFFIENA 被启用、中断将被处理。 RXFFIENA 在 RXFIFO 中的字数量达到8时置1;并且第一个字被读取。

    由于它是无限循环、因此最终将读取 RXFIFO 中的所有字。 但是、当它不是无限循环时、情况会怎样呢? 那么、RXFFIL 应该设置为1对吧? 那么、每个字在何时以及何时被读取?

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

    Anu、

    第一:是的

    #2:请拍摄 SCI 模块的方框图(第10.2节)。 它解释了数据/中断流程。

    3:如果您的应用程序需要,您可以执行此操作,但会有 CPU 开销,中断太多。 (请参阅表10-17)

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

    好的。 非常感谢!