工具/软件: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++;
}
}
//文件结束
