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.

[参考译文] TMS320F28388D:使用 SCI RX 中断读取512字节数据

Guru**** 2540720 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1130161/tms320f28388d-read-512-bytes-of-data-using-sci-rx-interrupt

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARE

您好!

我正在尝试使用 TMS320F28388中的 SCI 开发通信协议。 最大512字节的数据可以通过这个 SCI、并且控制器应该能够使用 RX 中断方法来存储数据。

下面 是我用于 SCI 配置的代码。

GPIO_setPinConfig(GPIO_19_SCIB_RX);
GPIO_setPinConfig(GPIO_18_SCIB_TX);


//
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
//
Interrupt_register(INT_SCIB_RX, sciaRXFIFOISR);

SCI_performSoftwareReset(SCIB_BASE);

//
// Configure SCIA for echoback.
//
SCI_setConfig(SCIB_BASE, DEVICE_LSPCLK_FREQ, 9600, (SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_resetChannels(SCIB_BASE);
SCI_enableModule(SCIB_BASE);
SCI_performSoftwareReset(SCIB_BASE);
SCI_enableFIFO(SCIB_BASE);

//
// RX FIFO Interrupts Enabled
//
SCI_enableInterrupt(SCIB_BASE, SCI_INT_RXFF);
SCI_disableInterrupt(SCIB_BASE, SCI_INT_RXERR);

//
// The transmit FIFO generates an interrupt when FIFO status
// bits are less than or equal to 2 out of 16 words
// The receive FIFO generates an interrupt when FIFO status
// bits are greater than equal to 2 out of 16 words
//
SCI_setFIFOInterruptLevel(SCIB_BASE, SCI_FIFO_TX2, SCI_FIFO_RX2);
SCI_performSoftwareReset(SCIB_BASE);

SCI_resetRxFIFO(SCIB_BASE);

Interrupt_enable(INT_SCIB_RX);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

 下面是 ISR 中用于读取数据的代码。

uint16_t flags;
uint16_t chr;
uint16_t words;


if (ReceiveBufferLen != 0) // if buffer is busy
return;


do // until TerminationChar received or rcv buf is empty
{


flags = SCI_getRxStatus(SCIB_BASE);
if (NumCharsReceived >= RX_BUFF_SIZE)
{
ErrorCode = SerialRxBuffTooSmall; // ReceiveBuffer too small
ReceiveBufferLen = RX_BUFF_SIZE; // inform the user a partial packet is available
break;
}
//
if (SCI_getRxFIFOStatus(SCIB_BASE))
{
chr = SCI_readCharBlockingFIFO(SCIB_BASE);
//
// // If no data is available, break
//
((uint16_t*) &ReceiveBuffer)[NumCharsReceived++] = chr;
if (((((uint16_t) (ReceiveBuffer[1]) << 8) & 0xFF00u)
| ((uint16_t) (ReceiveBuffer[0] & 0x00FFu)))
== NumCharsReceived)
{
ReceiveBufferLen = NumCharsReceived; // inform the user a packet is available
//break;
}

} while (!SCI_isDataAvailableNonFIFO(SCIB_BASE));

SCI_clearOverflowStatus(SCIB_BASE);

SCI_clearInterruptStatus(SCIB_BASE, SCI_INT_RXFF);


//
// Issue PIE ack
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

使用此代码、我只能读取2个字节的数据。

能不能有人帮助我了解这一点、以便使用中断方法通过 SCI Rx 读取多个字节的数据。

提前感谢

此致

双引脚

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

    您好 Dipin、

      

    感谢您的推荐。 我已更新您的帖子、以使用代码块而不是原始文本。 将来,请使用“插入->代码”正确设置您帖子中的代码格式。

      

    您能否暂停调试器并查看代码卡在何处? 我认为、一旦代码被读取一次、代码可能会卡在"readCharBlockingFIFO"行中。

      

    我认为问题的一部分是:

    *每2个字节触发一次中断(FIFO 级别设置为2个字节)

    但是-

    *您仍然使用 getRxFIFOStatus 放置一条 if 语句来查看是否有数据:

      

    不应需要"if statement"。 如果代码进入 ISR、则意味着存在2个字节-或-错误。 应首先检查错误、这意味着只有数据到达的可能性。

      

    此致、

    Vince

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

    尊敬的 Vince:

    感谢您的回复。

    我的代码实际上不会卡在任何位置。 它不会读取我要发送的所有数据。 即使我发送的数据超过16个字节、它也只会获得前两个字节、其余数据也会丢失。

    要接收所有数据、我必须设置什么 FIFO 中断级别? 请建议进行任何 SCI 配置更改。

    我应该检查哪种情况以确保接收到完整数据?

    您能帮我解决这些疑问吗? 我添加了最新的 Rx ISR 代码以供参考

    谢谢

    	uint16_t flags;
    	uint16_t chr;
    	uint16_t words;
    
    
    	if (ReceiveBufferLen != 0) // if  buffer is busy
    		return;
    
    
    	do  // until TerminationChar received or rcv buf is empty
    	{
    
    	   flags =  SCI_getRxStatus(SCIB_BASE);
    		if (NumCharsReceived >= RX_BUFF_SIZE)
    		{
    			ErrorCode = SerialRxBuffTooSmall;  // ReceiveBuffer too small
    			ReceiveBufferLen = RX_BUFF_SIZE; // inform the user a partial packet is available
    			break;
    		}
    //			// If data is available, read
    		    chr = SCI_readCharBlockingFIFO(SCIB_BASE);
    //
    //			// If no data is available, break
    //
    			((uint16_t*) &ReceiveBuffer)[NumCharsReceived++] = chr;
    			if (((((uint16_t) (ReceiveBuffer[1]) << 8) & 0xFF00u)
    					| ((uint16_t) (ReceiveBuffer[0] & 0x00FFu)))
    				    == NumCharsReceived)
    			{
    				ReceiveBufferLen = NumCharsReceived; // inform the user a packet is available
    				//break;
    			}
    	} while (SCI_getRxFIFOStatus(SCIB_BASE)!=0);
    
    		    SCI_clearOverflowStatus(SCIB_BASE);
    
    		    SCI_clearInterruptStatus(SCIB_BASE, SCI_INT_RXFF);
    
    
    		    //
    		    // Issue PIE ack
    		    //
    		    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    
    }

    双引脚

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

    您好 Dipin、

    如前所述、除非使用调试窗口来查找代码停止的位置、否则很难确定问题所在的位置。 您能否提供代码在接收前2个字节后的位置?

    此致、

    Vince

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

    尊敬的 Vince:

    在读取 SCI_getRxFIFOStatus 时接收到两个字节的数据后、它将为0。 则它将从环路中流出。

    while (SCI_getRxFIFOStatus (SCIB_BASE)!=0);(第33行)这是我要讨论的条件。 在两个字节后、此条件将提供0值。

    我不知道我的其余数据在哪里?

    我已在之前的 SCI 配置中将 FIFO 中断级别设置为2。  

    此致

    双引脚

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

    您好 Dipin、

    如前所述、您不应在 ISR 内部执行类似这样的 while 循环。 这可防止进一步的中断触发。 请删除 while 循环。

    此致、

    Vince

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

    尊敬的 Vince:

    我会尝试这个。 为了通过 SCI 接收数据序列(512字节)、您是否有任何要与我共享的示例代码?

    此致

    双引脚

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

    双引脚、

    C2000Ware 中的"echoback"和"interrupts" SCI 示例是实现此目的的良好起点。 它们都能够在理论上无限接收数据、并且只需稍作修改即可完成您所尝试的操作(基本上只需更改 FIFO 深度)。

    需要记住的一点是:确保接收到的数据具有2个停止位。 这将防止大型数据包的接收出现任何问题(提供足够的中断处理时间)。

    此致、

    Vince

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

    您能不能再看看这个问题

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

    您能告诉我读取数据序列所需的 FIFO 深度吗? 实际上、我的代码仍然无法按预期工作。 您能不能共享您的代码、以便不受限制 地接收数据

    此致

    双引脚

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

    双引脚、

    任何 FIFO 深度都足以简单读取多个数据字节。

    为了帮助调试、请尝试在使用其中一个基本示例时复制此问题、但未修改。 例如:请运行 SCI 回送示例、并查看该示例是否收到512个字节时出现问题。 请尝试使用该示例并查看问题是否仍然存在。

    此致、

    Vince