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/TMS320F2.8335万:Sci-A RXRDY标志未设置为高

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/615387/ccs-tms320f28335-sci-a-rxrdy-flag-does-not-set-high

部件号:TMS320F2.8335万

工具/软件:Code Composer Studio

操作系统:Windows 10,版本1607,HP 90SBGRUS笔记本电脑,Intel Core i3-7100U 2.4GHz CPU  

代码编辑器工作室:版本7.2 .0.0.0013万

板: Spectrum Digital eZdsp F2.8335万 (德州仪器 (TI) TMS320F2.8335万 数字信号处理器)

仿真器: Spectrum Digital DSK-EVM-eZdsp板载USB仿真器

SCI终端/程序:PuTTY Release 0.70

大家好,

使用F2.8335万的SCI-A模块时遇到一些问题。 我正在尝试开发一些简单的代码,最初是受资源管理器示例文件'Example_2833xSci_Echoback'的启发。

我的目标是使用PuTTY输入一个短字符串,该字符串由F2.8335万读取,然后传输回用户,以确认已成功接收到该字符串。  

我已经使用中断驱动程序实现了这一点,该程序是从C2000教学ROM的实验9_4改编而来的。 在这种情况下,我将SCIFFX的位0:4配置为介于1和16之间的给定值。 当Rx FIFO中的字符数与此匹配时,请求Rx ISR,ISR从RXDT获取每个字符并将每个字节放入一个CHAR数组。 我现在尝试在不使用中断的情况下获得相同的结果。

我在中断驱动代码和这个新程序中遇到的一个问题是,RXRDY标记似乎从未变高;即使RXFFST FIFO状态位指示缓冲区中有东西时也是如此。 这是我尝试输入单个字符'c'时在监视窗口中看到的内容:

我已经检查了在SCIA初始化中配置的每个位,似乎找不到任何能解释当Rx FIFO中明显存在字符时为什么不设置RXRDY的信息。 另请注意,SCIRXEMU寄存器中指示的二进制值确实与输入的小写'c'的ASCII值相对应。 因此我们可以确信该字符是从PC发送的,并且确实到达了缓冲区。

当前程序只在线路上挂起:而(SciaRegs.SCIRXST.bit.RXRDY ==0){};

当我尝试在没有此标志检查阶段的情况下运行代码时,可以将第一个字符从Rx FIFO复制到数组中,但随后数组的其余部分将填充一些重复的垃圾值。

代码如下所示。 我已使用****符号突出显示了我认为问题所在的领域。

在我们到达此线路之前,是否有一些从SCIRXBUF寄存器读取的错误信息,从而清除Rx FIFO并将RXRDY标记发送为低电平? 如有任何建议或反馈,我们将不胜感激。 非常感谢!

尼克

#include "DSP28x_Project.h"
#include <string.h>

//函数原型
void scia_echoback_init(void);
void scia_fifo_init(void);
void print_string(car *_msg);

void main (void){

char *msg;//指向消息字符的指针

InitSysCtrl();
// InitGpio();跳过这里,在DSP2833x_gPIO.c中找到的函数
InitSciaGpio();//初始化SCI-A端口的引脚,该函数可在DSP2833x_Sci.c文件中找到。
dint;//禁用CPU中断
InitPieCtrl();//将PIE控制寄存器初始化到其默认状态。
//禁用CPU中断并清除所有CPU中断标志
IER = 0x0000;
IFR = 0x0000;
InitPieVectorTable();//使用指向外壳ISR的指针初始化PIE矢量表
scia_fifo_init();//初始化SCI FIFO
scia_echoback_init();//为echoback初始化SCI

MSG ="\r\n\n\n用户启动提示的第一行转到此处\n";//Hello world等
print_string (msg);//将msg放在屏幕上
MSG ="\r\n用户启动提示的第二行转到此处\n\0";
print_string(msg);
MSG ="\r\n输入命令:\0";
print_string(msg);

for(;;){//永远留在这个运行时循环中

int i;
char rx_buffer[16]={'\0'};//array以保存接收到的字符

//等待输入字符串- FIFO Rx缓冲区为空时空闲
while (SciaRegs.SCIFFRX.bit.RXFFST !=1){};

//******************************************************************************************************************************************
//********** 从Rx FIFO获取字符,放置在Rx_buffer []数组***********************************
对于(i=0;i<16;i++)

当(SciaRegs.SCIRXST.Bit.RXRDY ==0){};//等待Rx就绪标记,即等待下一个字符准备就绪,可以读取
Rx_buffer[i]= SciaRegs.SCIRXBUF.bit.RXDT;//将字符从Rx FIFO复制到ith元素
}
//******************************************************************************************************************************************
//******************************************************************************************************************************************

MSG ="您已发送:\0";
print_string(msg);
//将rx_buffer[]字符串传输回用户:
print_string (rx_buffer);

//重置/清除RX FIFO缓冲器
SciaRegs.SCIFFRX.Bit.RXFIFORESET =0;//重置RX-FIFO指针
SciaRegs.SCIFFRX.Bit.RXFIFORESET =1;//启用RX操作

MSG ="\r\n输入命令:\0";
print_string(msg);
//跳回循环

}//end of for (;)运行时循环
}//main()的结尾


//功能定义  

// scia_echoback_init -测试1,SCIA DLB,8位字,波特率0x000F,默认, 1个停止位,奇偶校验
void scia_echoback_init(){

//注:在InitSysCtrl()函数中,时钟已打开到SCIA外围设备
// 1停止位,无回送,奇偶校验,8个字符位,异步模式, 空闲线路协议
//使用Putty中的'F2.8335万'设置
SciaRegs.SCICCR.ALL =0x0027;

//启用TX,RX,内部SCICLK,
//禁用RX ERR,睡眠,TXWAKE
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICT2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =0;
SciaRegs.SCICTL2.bit.RXKINTENA =0;//设置RXRDY标志时,不启用触发中断
#IF (CPU_FRQ_150MHz)
SciaRegs.SCIHBAUD =0x0001;// 9600波特@LSPCLK = 37.5MHz。
SciaRegs.SCILBAUD =0x00E7;
#endif
#IF (CPU_FRQ_100MHz)
SciaRegs.SCIHBAUD =0x0001;// 9600波特@LSPCLK = 20MHz。
SciaRegs.SCILBAUD =0x0044;
#endif
SciaRegs.SCICTL1.all =0x0023;//从重置放弃SCI
}

// scia_fifo_init -初始化SCI FIFO
void scia_fifo_init(){
SciaRegs.SCIFFTX.All=0xE040;
SciaRegs.SCIFFRX.all=0x204f;
SciaRegs.SCIFFCT.All=0x0;
}

// print_string -从SCI传输字符串
void print_string(car *_msg){

int i=0;
while (_msg[i]!='\0')//直到我们到达输入字符串的末尾

while (SciaRegs.SCIFFTX.Bit.TXFFST !=0){};//等待TX FIFO清除
SciaRegs.SCITXBUF=_msg[i];//将每个字符放入TX缓冲区
I++;
}
}

//文件结束  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我写这封信是为了告诉您,一位C2000小组成员已被指派担任此职位,应该很快就会回答。

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

    启用FIFO后,请勿使用RXRDY位。 启用FIFO时,此位不起作用。 而是使用FFST来监控是否收到数据。

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

    尼古拉斯,

    如果您已正确配置FIFO增强功能,则不应使用RXRDY检查是否已收到消息。 您应检查RXFFST。 SCI用户指南中对其操作进行了说明。 还需注意:RXFFINT应仅在RXFFIL低于RXFFST时发生。

    此致,
    科迪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢Cody和Sal -现在以不同的方式处理了代码,因此,在收到某些内容之前,您可以使用while (SciaRegs.SCIFFRX.Bit.RXFFST=0){}来使程序闲置。 一旦程序退出此While循环,我会一直复制RXDT,直到看到返回字符,这似乎现在工作正常。 非常感谢您的快速帮助。 使用FIFO时,我一定错过了RXRDY未激活的信息。