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.

[参考译文] TMS320F28388S:Rx 中断发出 tms320f28388s

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1502341/tms320f28388s-rx-interrupt-issue-tms320f28388s

器件型号:TMS320F28388S

工具/软件:

我对 UART 使用 SCI-A 中断  

我正在使用器件库  

SCI_setFIFO InterruptLevel (SCIA_BASE、SCI_FIFO_TX2、SCI_FIFO_RX1);

设置 SCI_FIFO_RX1后、我收到垃圾值  

设置   SCI_FIFO_RX0获得正确的输出、但 DUW 持续进入该中断、而 while (1)内不工作   

我会附上我的代码、请检查并告诉我问题

#include "driverlib.h"
#include "device.h"
#include "string.h"

//
//全局
//
uint16_t 循环计数器= 0;
bool newStringReceived = false;//指示已接收到完整字符串的标志
Volatile bool transmitComplete = true;//指示发送已就绪的标志

//消息缓冲区
Volatile char txBuffer[100];//发送缓冲器
Volatile uint16_t txLength = 0;//要发送的数据长度
Volatile uint16_t txIndex = 0;//发送缓冲器中的当前位置

Volatile char rxBuffer[100];//接收缓冲器
Volatile uint16_t rxIndex = 0;//接收缓冲区中的当前位置
Volatile char processedString[100];//完整接收字符串的缓冲区

//函数原型
__ interrupt void sciaRXISR (void);
__ interrupt void sciaTXISR (void);
void initSCI (void);
void sendMessage (const char *msg);
static bool startCapture = false;

void UART_init (void)

//
// GPIO28是 SCI Rx 引脚。
//
GPIO_setControllerCore (DEVICE_GPIO_PIN_SCIRXDA、GPIO_CORE_CPU1);
GPIO_setPinConfig (DEVICE_GPIO_CFG_SCIRXDA);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_DIR_MODE_IN);
GPIO_setPadConfig (DEVICE_GPIO_PIN_SCIRXDA、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_QUAL_ASYNC);

//
// GPIO29是 SCI Tx 引脚。
//
GPIO_setControllerCore (DEVICE_GPIO_PIN_SCITXDA、GPIO_CORE_CPU1);
GPIO_setPinConfig (DEVICE_GPIO_CFG_SCITXDA);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (DEVICE_GPIO_PIN_SCITXDA、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_QUAL_ASYNC);

}

void UART_interruptInit (void)

INTERRUPT_enablePIE();
INTERRUPT_REGISTER (INT_SCIA_RX、sciaRXISR);
INTERRUPT_REGISTER (INT_SCIA_TX、sciaTXISR);

initSCI();

INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);
interrupt_enableInCPU (INTERRUPT_CPU_INT9);
INTERRUPT_enablePIE();
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group9);
}

//
//初始化 SCI 以进行基于中断的操作
//
void initSCI (void)

//
//重置并配置 SCI
//
Sci_performSoftwareReset (SCIA_BASE);

//
//将 SCIA 配置为9600波特、8-N-1
//
SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、9600、(SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));

//
//重置通道和 FIFO
//
sci_resetChannels (SCIA_BASE);
SCI_resetRxFIFO (SCIA_BASE);
SCI_resetTxFIFO (SCIA_BASE);

//
//清除任何挂起的中断
//
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF | SCI_INT_RXFF);

//
//启用 FIFO
//
SCI_enableFIFO (SCIA_BASE);

//
//设置 FIFO 中断级别
//
SCI_setFIFO InterruptLevel (SCIA_BASE、SCI_FIFO_TX2、SCI_FIFO_RX1);

//
//启用仅接收中断(需要时将启用发送)
//
SCI_enableInterrupt (SCIA_BASE、SCI_INT_RXFF);

//
//禁用错误中断;;;;;;;;;;;;;
//
SCI_disableInterrupt (SCIA_BASE、SCI_INT_RXERR);

//
//启用 SCI 模块
//
SCI_enableModule (SCIA_BASE);

while (SCI_getRxFIFOStatus (SCIA_BASE)> 0)

SCI_readCharNonBlocking (SCIA_BASE);
}

SCI_writeCharNonBlocking (SCIA_BASE、'\r');
SCI_writeCharNonBlocking (SCIA_BASE、'\n');
}

//
//发送以 null 结尾的消息字符串
//
void sendMessage (常量字符*msg)

//等待任何正在进行的传输完成
while (!transmitComplete);

//将消息复制到发送缓冲区
uint16_t i = 0;
while (msg[i]!='\0'&& i < sizeof (txBuffer)-1)

txBuffer[i]= msg[i];
I++;
}

//设置消息长度和重置索引
txLength = I;
txIndex = 0;

//将传输标记为进行中
transmitComplete = false;

//启用发送中断以开始发送
SCI_enableInterrupt (SCIA_BASE、SCI_INT_TXFF);
}

//
// SCI-A 接收 FIFO ISR
//
__中断 void sciaRXISR (void)

uint16_t availableChars;
已接收字符字符;
uint16_t j、i;

//获取 FIFO 中的字符数
availableChars = SCI_getRxFIFOStatus (SCIA_BASE);

//处理所有可用字符
for (i = 0;i < availableChars;i++)

//读取一个字符
receivedChar = SCI_readCharNonBlocking (SCIA_BASE);

//回显字符、以便用户可以看到他们正在键入的内容
SCI_writeCharNonBlocking (SCIA_BASE、receivedChar);

//处理接收到的字符
if (receivedChar ='\r'|| receivedChar ='\n')

//行末-填写字符串
//用空格填充剩余的缓冲区
rxBuffer[rxIndex]='\0';
/*对于(j = rxIndex+1;j < 50;j++)
rxBuffer[j]='';*/

//用空终结符填充缓冲区的其余部分
//memset (&rxBuffer[rxIndex + 1]、'\0'、100 -(rxIndex + 1));
memset (&rxBuffer[rxIndex]、'\0'、100 -(rxIndex + 1));
//复制到已处理的缓冲区
strcpy (processedString、rxBuffer);

//下一个字符串的复位缓冲器
rxIndex = 0;

//设置接收完整字符串的标志
newStringReceived = true;
}
Else if (receivedChar =='\b'|| receivedChar == 127)

//退格-如果缓冲区不为空、则删除最后一个字符
if (rxIndex > 0)

rxIndex--;

//发送退格序列以擦除终端上的字符
SCI_writeCharNonBlocking (SCIA_BASE、");
SCI_writeCharNonBlocking (SCIA_BASE、'\b');
}
}
Else if (rxIndex < sizeof (rxBuffer)- 1)

//如果未满、则将字符存储在缓冲区中
rxBuffer[rxIndex]= receivedChar;
rxIndex++;
}

/* if (receivedChar =='G')//使用任何适当的起始字符

//开始新消息
rxIndex = 0;
startCapture = true;
//如果你不想保存起始字符,请不要保存它
}
Else if (startCapture &&(receivedChar ='\r'|| receivedChar ='\n'))

//消息结束-正在处理的过程
rxBuffer[rxIndex]='\0';
memset (&rxBuffer[rxIndex]、'\0'、100 - rxIndex);
strcpy (processedString、rxBuffer);
rxIndex = 0;
startCapture = false;
newStringReceived = true;
}
Else if (startCapture && rxIndex < sizeof (rxBuffer)- 1)

//仅在看到起始字符后存储字符
rxBuffer[rxIndex]= receivedChar;
rxIndex++;
}*/
}

//检查溢出
IF (SCI_getOverflowStatus (SCIA_BASE)))

SCI_clearOverflowStatus (SCIA_BASE);
}

//清除中断标志
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_RXFF);
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group9);
}

//
// SCI-A 发送 FIFO ISR
//
__ interrupt void sciaTXISR (void)

uint16_t i;
Uint16_t charsToSend = 0;

//计算我们可以发送的字符数(最多 FIFO 深度)
while ((txIndex + charsToSend < txLength)&&(charsToSend < 16))

字符 ToSend++;
}

//发送字符
for (I = 0;I < charsToSend;I++)

SCI_writeCharNonBlocking (SCIA_BASE、txBuffer[txIndex+]);
}

//检查是否已发送所有字符
if (txIndex >= txLength)

//禁用发送中断
SCI_disableInterrupt (SCIA_BASE、SCI_INT_TXFF);

//将变速箱标记为完成
transmitComplete = true;
}

//清除中断标志
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group9);
}

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

    尊敬的 Tejashri:

    虽然 E2E 论坛上我们不支持完整代码分析、但我可以帮助您说明 SCI FIFO 级别的工作原理、并解答您提出的任何概念问题。

    对于 SCI 接收器、当 FIFO 级别达到或高于编程级别时、FIFO 级别中断将升高。 因此、如果 FIFO 级别设置为0、它将在 FIFO 具有零个或多个元素时触发(基本上是持续)。 如果 FIFO 级别设置为1、则每次 FIFO 有一个或多个字时都会触发中断。 通常、FIFO 级别为1时、为了保持同步、每次触发标志时都需要读取一个字。 如果中断被阻止(被其他更高优先级的 ISR 阻止)或接收线路上出现错误(如 SCIRXST 寄存器中所示)、则会关闭此同步。 另一个器件一次发送到 C2000器件有多少个字节?  

    此致、

    Delaney