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:为什么 RX 无法接收正确的字符?(已修复通信问题)

Guru**** 2589265 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/837614/ccs-tms320f28335-why-rx-cant-receive-correct-char-have-been-fixing-communication-issue

器件型号:TMS320F28335

工具/软件:Code Composer Studio

大家好。

我使用此代码将 char 发送到  数字温度控制器(RB900)、

我希望接收温度字符、但我仍然收到原始字符、

我的问题是、我不知道我的串行端口是否有设置错误、或者我的 RX 代码错误。

如果有人能解决我的问题、我将会非常出色。


 

代码:

#include 
#include "DSP28x_Project.h" //设备头文件和示例包括文件
#include "DSP2833x_Device.h" // DSP2833x 头文件包含文件
#include "DSP2833x_examples.h"// DSP2833x 示例包括文件

void SCIC_echoback_init (void);
void SCIC_Fifo_init (void);
void InitEPwm1 (void);
void InitScicGpio (void);void (设置
);void (void)
unsigned char data_receive;

UINT16 LoopCount;
UINT16 SendChar[8]={0x0001、0x0003、0x0000、 0x0000、0x0000、0x0001、0x0084、0x000A};
uint16 ReceivedChar[8];

int F、a、i、j;
void main (void)
{
InitSysCtrl();
InitEPwm1Gpio();
InitSciGpio();//初始化SCI引脚

EALLOW;

//
//为所选引脚启用内部上拉
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//
GpioCtrlRegs.GPBPUD.bit.GPIO62=0;//启用 GPIO62的上拉电阻器(SCIRXDC)
GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0;//启用 GPIO63的上拉电阻器(SCITXDC)

//
//仅将所选引脚的限定条件设置为异步
默认情况下、//输入与 SYSCLKOUT 同步。
//这将为所选引脚选择异步(无限定条件)。
//
GpioCtrlRegs.GPBQSEL2.bit.GPIO62=3;//异步输入 GPIO62 (SCIRXDC)

//
//使用 GPIO 寄存器配置 SCI-C 引脚
//这指定哪个可能的 GPIO 引脚将是 SCI 功能
//引脚。
//
GpioCtrlRegs.GPBMUX2.bit.GPIO62=1;//将 GPIO62配置为 SCIRXDC
GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 1;//将 GPIO63配置为 SCITXDC

EDIS;

Dint;
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();

PieCtrlRegs.PIECTRL.bit.ENPIE = 1;使能PIE μ s
PieCtrlRegs.PIEACK.ALL = 0xFFFF;//写1清零,允许所有PIE都能被响应
EINT;//开启总中断 μ s


LoopCount = 0;

SCIC_fifo_init(); //初始化 SCI FIFO
SCIC_echoback_init ();//初始化 SCI
InitEPwm1();

for (;;)
{
DELAY_US (1000000);

将要发送的数据存入SCITXBUF μ s
for (i=1;i<=8;i++)
{
while (ScicRegs.SCICTL2.bit.TXRDY = 0){}
ScicRegs.SCITXBUF=SendChar[i];
}

等待发送完成 μ s
while (SciaRegs.SCIFFRX.bit.RXFFST!=1){}//等待 RRDY/RXFFST =1,以获得 FIFO 中可用的1个数据

for (i=1;i<=8;i++)
{
ReceivedChar[i]= SciaRegs.SCIRXBUF.all;
}
A=ReceivedChar[5];
if (a==24)
{
f=2000;
}
其他
{
f=2500;
}
LoopCount++;
}

}

空 InitEPwm1 (空)
{
EPwm1Regs.CMPA.half.CMPA=F/2;
EPwm1Regs.CMPB=F/2;


//设置 TBCLK
EPwm1Regs.TBPRD = F; // TBPRD=150m/f-1
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000; //相位为0 (相位為0)
EPwm1Regs.TBCTR = 0; 时基计数器清0 μ s
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //向上计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; 时基时钟分频1倍分频 μ s

//设置隐藏
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; CMPA影子装载模式 μ s
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//CTR=0影子寄存器A装载update IT
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

//设置操作
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // CTR上升至CMPA值 置1 ePWMA输出高
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // CTR下降至CMPA值 置0 ePWMA输出低
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; // CTR上升至CMPB值 置1 ePWMB输出高
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // CTR下降至CMPB值 置0 ePWMB输出低

//中断,我们将在其中更改比较值
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD; //选择 PRD 事件上的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_1st; //在发生第一个事件时生成 INT

//设置死区
EPwm1Regs.DBCTL.bit.IN_MODE = 0; ePWMxA是雙邊沿延時輸入源 μ s
EPwm1Regs.DBCTL.bit.OUT_MODE = 3; 使能雙邊沿沿時 μ s
EPwm1Regs.DBCTL.bit.POLSEL = 2; ePWMxA不翻轉,ePWMxB翻轉 μ s
EPwm1Regs.DBFED =625; ///100ns*150m
EPwm1Regs.DBRED =625;

//设置触发区
EALLOW;
EPwm1Regs.TZSEL.bit.OSHT1 = 1; 启用TZ1作为PWM1的错误源 μ s
EPwm1Regs.TZSEL.bit.OSHT5 = 1;
EPwm1Regs.TZCTL.bit.TZA = 2; ///EPWM1A 在发生跳闸事件时被强制为低电平。
EPwm1Regs.TZCTL.bit.TSB = 2;
EPwm1Regs.TZEINT.bit.OST = 1; //启用 OST 中断
EDIS;


}
//步骤7。 在此处插入所有本地中断服务例程(ISR)和函数:



//测试1、SCIA DLB、8位字、波特率0x000F、默认值、1停止位、 无奇偶
校验 void SCIC_echoback_init ()
{
SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
配置通讯协议 μ s //无奇偶校验,8个字符位,
//异步模式,空闲线协议
SciaRegs.SCICTL1.all =0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
SciaRegs.SCIHBAUD = 0x0001;
SciaRegs.SCILBAUD = 0x00E7;
SciaRegs.SCICCR.bit.LOOPBKENA=1;//启用回路
SciaRegs.SCICTL1.all =0x0023; //从复位中撤回 SCI
}

EDIS;//禁用对 EALLOW 受保护寄存器的写入需要此操作
//初始化 SCI FIFO
void SCIC_Fifo_init ()
{
SciaRegs.SCIFFTX.All=0xE040;
SciaRegs.SCIFFRX.All=0x2044;
SciaRegs.SCIFFCT.All=0x0;
} 

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

    Bo-Xiang、

    这是您第三次提出相同的问题!  请参阅之前的帖子以获取答案 (其中还包含指向原始帖子的链接):

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/835723/3091330?tisearch=e2e-quicksearch&keymatch=RB900#3091330

    您已将此问题/帖子标记为"已解决"、因此我不知道您为什么继续提出相同的问题...

    请注意、您已启用'Loopback '、因此这将是预期结果。  请记住 、RB900 温度控制器 使用 RS-485类型 的通信。  正如我原来的答覆所解释的那样、F28335 SCI 使用 RS-232类型通信。   这两种通信标准 不兼容。

    - Ken

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

    我一直在使用适配器将 RS-485转换为 RS-232、但代码仍然无法正常工作。  

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

    Bo-Xiang、

    从我上次发布的帖子中、您是否检查了回送设置?  如果启用了回送、您将收到您要发送的数据。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken

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

    Bo-Xiang、

    我上次听说过您、已经有一段时间了。 因此、我假设我的上次答复解决了您的问题、我将关闭此主题。 如果情况并非如此,请拒绝此解决方案或回复此主题。 如果此主题被锁定、请制作一个描述问题当前状态的新主题。 谢谢你。

    Ken