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