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.
工具与软件:
我希望这封邮件能让您满意。
我在做 硬件连接如下所示:
F28335TX 至 RS232转换器 RX 至(连接的 DB9连接器)、使用 TTL 转换器将 TTL 输出转换为 RS232 DB9引脚连接器。
F28335 RX 到 RS232转换器 TX 到(连接的 DB9连接器)、使用 TTL 转换器将 TTL 输出转换为 RS232 DB9引脚连接器。
从 F28335到 外部器件 RS232 (LabView) 的数据发送正在正确执行。 但是、 由 外部器件 RS232 (LabView)发送的 F28335数据接收未执行。
已针对内部环路和外部环路(通过将 TX 线路连接到 RX 线路)进行测试、正在正确执行。
查询:
1.您能告诉我,所有的配置都需要完成吗?
2.如果我的 SCI 数据接收器和配置功能代码不正确、请更正 X 中所附的代码吗?
/* * SCI.c * * Created on: Aug 27, 2024 * Author: CG00844381 */ #include "Mcu1_Device.h" #include "SCI.h" #include "stdio.h" #include "stdlib.h" #include "string.h" UNS8 receivedData[4] = { 0 }; UNS16 rx_loop = 0; void main() { /* Initialize system */ InitSysCtrl(); EALLOW; SysCtrlRegs.HISPCP.all = 0x3; EDIS; DINT; //disabliling cpu interrupts /* Initialize the PIE control registers to their default state */ InitPieCtrl(); IER = 0x0000; IFR = 0x0000; /* Initialize the PIE vector table with pointers to the shell Interrupt Service Routines (ISR). */ InitPieVectTable(); IER |= M_INT1; // here Enabling CPU INT9 EINT; //disable // // Enabling interrupt ERTM; for(rx_loop=0;rx_loop<=4;rx_loop++) { Sci_rx(); ScibRegs.SCIFFRX.bit.RXFIFORESET = 0; Sci_tx(); } } void Sci_Config() { EALLOW; SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // enabiling peripheral clock EDIS; EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; EDIS; ScibRegs.SCICCR.all = 0x0007; // sci control reg are set as 8-bit data, no parity, 1 stop bit //0000 0000 0000 0111 ScibRegs.SCICTL1.all = 0x0063; // Enabling TX and RX reset ScibRegs.SCICTL2.all = 0x0000; ScibRegs.SCIHBAUD = 0x0000; // Setting the baud rate (high register) ScibRegs.SCILBAUD = 0x0079; //Setting baud rate (low register) 38.46kHz ScibRegs.SCIFFTX.all = 0x0000; ScibRegs.SCIFFRX.all = 0x0000; ScibRegs.SCIFFTX.all = 0xE044; //Try E044 ScibRegs.SCIFFRX.all = 0x0064; //Try 0064 //to check fifo status change 4 to 10 ScibRegs.SCIFFCT.all = 0x0000; ScibRegs.SCIPRI.bit.FREE = 1; /* Configure SCI Priority register for SOFT bit */ ScibRegs.SCIPRI.bit.SOFT = 1; EALLOW; GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynchronous input (SCIRXDA) GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2; //config gpio as SCITXDA Same in 28069 GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2; //config gpioas SCIRXDA EDIS; //Peripheral intialization PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block PieCtrlRegs.PIEIER9.bit.INTx3 = 1; // here Enabling SCI RX interrupt in PIE group 9 PieCtrlRegs.PIEIER9.bit.INTx4 = 1; // here Enabling SCI TX interrupt in PIE group 9 EDIS; } BOOL Sci_rx() { UNS16 Rx_sts; UNS16 Rx_rdy = 0x0040; do { Rx_sts = ScibRegs.SCIRXST.all; } while ((Rx_sts & Rx_rdy) == 0); receivedData[rx_loop] = ScibRegs.SCIRXEMU; ScibRegs.SCIFFRX.bit.RXFIFORESET = 1; printf("rx :0x%x\n",receivedData[rx_loop]); } BOOL Sci_tx() { while (ScibRegs.SCICTL2.bit.TXRDY == 0); { ScibRegs.SCITXBUF = receivedData[rx_loop]; printf("tx : 0x%X\n", ScibRegs.SCITXBUF); } }
谢谢、此致、
Chaya
尊敬的 Chaya:
我建议尝试确定是哪个器件导致了问题。 您可以调整 SCI RX 引脚上的信号并确认进入 F28335的 UART 信号是否 正确吗?
您第一眼看到代码就会希望直接读取 SCI_RXBUF ()中的 SCI_Rx ()、而不是 SCIRXEMU 寄存器(因为只有 CCS 才应该使用它来读取寄存器视图的 RX 内容)。 另一个可能值得检查的是 SCIRXST 寄存器中错误标志的状态。 用户可以在此条件下添加断点、并查看正在设置的错误标志、以帮助评估问题是什么。
此致、
Delaney
您好!
USB 到 RS232 |
这里我附加的波形55数据是这样的:
TI 板到 TTL 转换器 |
我在此附加55数据的波形、如下所示:
1.我们发现 USB 到 RS232转换器不符合 RS232电气规范,电压电平始终为正。
2.虽然我们的转换器 TI 在连接时符合 RS232协议,但我们发现数据交换没有正常进行,这可能是由于电压电平不兼容造成的问题。
3.您有任何改进建议吗?
谢谢、此致
Chaya
尊敬的 Chaya:
为了正确解读 F2833x 接收到的数据、它必须遵循 UART 标准协议、具有~3.3V 的逻辑高电压电平和~0V 的逻辑低电压电平。 您将必须使用符合这些规格的收发器、或为信号添加某种电平转换器以将其转换为正确的电压。
此致、
Delaney
您好!
我们知道 TI 电路板具有 RS232所需的所有转换和转换功能。 J3、可兼容 RS -232。
我们尝试了使用两个 TTL 转换器连接两个 TI 电路板、这时我们成功地在两个电路板之间建立了通信、而没有丢失数据。
现在、我们使用 RS -232兼容 J3标签将 TI 板连接至 USB RS USB-232。 此 USB RS -232连接到 LabVIEW。
从 F28335到 外部器件 RS232 (LabView) 的数据发送正在正确执行。
但是、 外部器件 RS232 (LabView)发送的 F28335数据接收无法正常进行。 但我们能够在 F28335中通过 RS232 (LabView)传输的 J3标签的 RX 引脚中正确地看到波形。 当我们尝试在控制台中打印数据时、它不会打印预期数据、数据重复或丢失。
void Mcu1_Arinc429_Configuration() { SciaRegs.SCICCR.all = 0x0027; SciaRegs.SCICTL1.all = 0x0067; SciaRegs.SCICTL2.all = 0x0003; SciaRegs.SCIHBAUD = 0x0000; SciaRegs.SCILBAUD = 0x0079; SciaRegs.SCIFFTX.all = 0x0000; SciaRegs.SCIFFRX.all = 0x0000; SciaRegs.SCIFFRX.all = 0x0064; SciaRegs.SCIFFRX.bit.RXFFIL = 0x1F; SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; SciaRegs.SCIPRI.bit.FREE = 1; SciaRegs.SCIPRI.bit.SOFT = 0; } void Receiver() { do { }while((SciaRegs.SCIFFRX.bit.RXFFST == 0) && (SciaRegs.SCIRXST.bit.RXRDY == 0)); Received_Data_g = SciaRegs.SCIRXBUF.bit.RXDT; for(cd=0;cd<=1000;cd++) { } }
请向我们建议我们需要做些什么来改进。
谢谢、此致、
Chaya
尊敬的 Chaya:
我有几个澄清问题:
从 F28335的角度来看、问题在于接收数据、对吗?
看看你的代码, 你的 Receiver()函数是否在你的主/后台循环中连续调用?
该函数中的逻辑也可能会导致一些问题;您是否知道主机器件(LabView) 一次将发送一个字符的数据?
当我们尝试在控制台中打印数据时、它没有打印预期数据、数据重复或丢失。 [报价]您说的是 PC 上的 COM 端口吗? 或通过 LabView 程序打印到控制台、即从 F28335传输的数据? 无论哪种方式、我都不建议这样调试、因为您已经在为您的应用使用传输线。 您能否通过 在"Expressions"视图中查看 Received_Data_ 3872尝试连接调试器并在 CCS 中查看接收到的数据? (注意:确保打开了持续刷新)
此致、
Delaney
您好!
是的、问题在于从 F28335角度接收数据。
是的、我们在 main 中连续调用接收器函数。
主机器件将一次发送1个字节。
我们尝试在 CCS 控制台中将从主机(LabView)接收到的数据打印到 F28335。 我们尝试仅在 CCS 控制台中打印此 Received_Data_ 3079。
此外、当数据流在 SCI 上的 RXD 输入为0-3.3V TTL 的情况下传输时、我们只能接收一个字节的数据
谢谢、此致、
Chaya
尊敬的 Chaya:
由于您在非 FIFO 模式下运行、因此无需检查 SCIFFRX。 RXFFST 域。 您是否可以尝试在 while ()循环中删除此检查? 您的代码应如下所示:
void Receiver()
{
do
{
}while((SciaRegs.SCIRXST.bit.RXRDY == 0));
Received_Data_g = SciaRegs.SCIRXBUF.bit.RXDT;
for(cd=0;cd<=1000;cd++)
{
}
}
另外、您是否可以尝试向从 RX 缓冲区中读取的 Received_Data_所在的行添加一个断点、并在 CCS 监视窗口中查看该行? 如果使用此方法仍然发现某些数据丢失、可能是由于出现了帧或中断检测错误、可以使用 SCIRXST 寄存器中的标志进行检查。
此致、
Delaney
您好!
是的、我们尝试了检查 SCIRXST.bit.RXRDY 字段。 即使我们这样尝试也是一样的。 数据丢失了。
您可以查看我们的 SCI 配置。 配置是否正确、是否缺少任何位配置。 您能不能回顾一下我们的配置。
空 Mcu1_Arinc429_Configuration ()
{
SciaRegs.SCICCR.all = 0x0027;
SciaRegs.SCICTL1.all = 0x0067;
SciaRegs.SCICTL2.all = 0x0003;
SciaRegs。 SCIHBAUD = 0x0000;
SciaRegs。 SCILBAUD = 0x0079;
SciaRegs.SCIFFTX.ALL = 0x0000;
SciaRegs.SCIFFRX.ALL = 0x0000;
SciaRegs.SCIFFRX.ALL = 0x0064;
SciaRegs.SCIFFRX.bit.RXFFIL = 0x1F;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
SciaRegs.SCIPRI.bit.FREE = 1;
SciaRegs.SCIPRI.bit.soft = 0;
}
谢谢、此致、
Chaya
尊敬的 Chaya:
您能否参考 C2000ware 中的一个 SCI 示例来比较您的位配置? 我自己看不出配置有任何明显的错误。
您是否尝试过用于调试的断点方法?
您还可以尝试在调试器中查看 RXST 寄存器吗? 接收到的数据可能存在帧或中断检测错误。
此外、即使您一次发送一个字节、两个字节之间的线路上是否有任何延迟?
此致、
Delaney