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.

[参考译文] LAUNCHXL-F28379D:了解示波器上观察到的 SCI TX 和 SCI RX 输出

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1003435/launchxl-f28379d-understanding-the-sci-tx-and-sci-rx-outputs-observed-on-oscilloscope

器件型号:LAUNCHXL-F28379D

我已导入 sci_echoback 并将其加载到两个 LaunchPad 上。 第一个 LaunchPad 通过第一个 Launchpad (GPIO 18)的 SCIB TX 引脚传输字符"A"、并且能够从第二个 LaunchPad 接收 SCIB RX 引脚(GPIO 19)上的字符"A"。 在第一个 LaunchPad 上运行的代码如下:  

//

//包含的文件

//

#include "F28x_Project.h"

#include "stdio.h"

//

//全局

//

uint16环计数;

 

//

//函数原型

//

void scib_echoback_init (void);

void scib_fifo_init (void);

void scib_xmit (int a);

void scib_msg (char * msg);

 

//

//主函

//

void main (void)

   uint16 ReceivedChar;

   char *msg;

 

//

//步骤1. 初始化系统控制:

// PLL、安全装置、启用外设时钟

//此示例函数位于 F2837xD_SYSCTRL.c 文件中。

//

  InitSysCtrl()

 

//

//步骤2. 初始化 GPIO:

//此示例函数位于 F2837xD_GPIO.c 文件和中

//说明了如何将 GPIO 设置为其默认状态。

//

  InitGpio()

 

//

//对于这个示例、只初始化针对 SCI-B 端口的引脚。

// GPIO_SetupPinMux ()-设置 GPxMUX1/2和 GPyMUX1/2寄存器位

// GPIO_SetupPinOptions ()-设置 GPIO 的方向和配置

//这些函数可在 F2837xD_GPIO.c 文件中找到。

//

  GPIO_SetupPinMux (19、GPIO_MUX_CPU1、0x2);               //SCIB RX J1 PIN3

  GPIO_SetupPinOptions (19、GPIO_INPUT、GPIO_PushPull);

  GPIO_SetupPinMux (18、GPIO_MUX_CPU1、0x2);               //SCIB TX J1 PIN4

  GPIO_SetupPinOptions (18、GPIO_OUTPUT、GPIO_异 步);

 

//

//步骤3. 清除所有_interrupts 并初始化 PIE 矢量表:

//禁用 CPU __interrupts

//

  Dint;

 

//

//将 PIE 控制寄存器初始化为默认状态。

//默认状态为禁用所有 PIE __interrupts 和标志

//被清除。

//此函数位于 F2837xD_PIECTRL.c 文件中。

//

  InitPieCtrl()

 

//

//禁用 CPU __interrupts 并清除所有 CPU __interrupt 标志:

//

  IER = 0x0000;

  IFR = 0x0000;

 

//

//使用指向 shell 中断的指针初始化 PIE 矢量表

//服务例程(ISR)。

//这将填充整个表,即使是__interrupt

//在本例中未使用。  这对于调试很有用。

//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程

//此函数可在 F2837xD_PieVect.c 中找到

//

  InitPieVectTable()

 

//

//步骤4. 用户特定代码:

//

  LoopCount = 0;

 

  scib_fifo_init();      //初始化 SCI FIFO

  scib_echoback_init ();  //初始化用于 echoback 的 SCI

 

 

     {

      MSG ="A\0";

      scib_msg (msg);

 

      //

      //等待 inc 字符

      //

      while (ScibRegs.SCIFFRX.bit.RXFFST ==0){}//等待空状态

 

      //

      //获取字符

      //

      ReceivedChar = ScibRegs.SCIRXBUF.ALL;

 

      LoopCount++;

  }

 

//

// scib_echoback_init -测试1、SCIA DLB、8位字、波特率为0x000F、

//                      默认,1个停止位,无奇偶校验

//

void scib_echoback_init ()

   //

   //注意:SCIB 外设的时钟被打开

   //在 InitSysCtrl()函数中

   //

 

   ScibRegs.SCICCR.all = 0x0007;  // 1停止位, 无环回

                                   //无奇偶校验,8个字符位,

                                   //异步模式,空闲线协议

   ScibRegs.SCICTL1.all = 0x0003; //启用 TX、RX、内部 SCICLK、

                                   //禁用 RX ERR、睡眠、TXWAKE

   ScibRegs.SCICTL2.all = 0x0003;

   ScibRegs.SCICTL2.bit.TXINTENA=1;

   ScibRegs.SCICTL2.bit.RXBKINTENA=1;

 

   //

   // SCIA 为9600波特

   //@LSPCLK = 50MHz (200MHz SYSCLK) HBAUD = 0x02且 LBAUD = 0x8B。

   //@LSPCLK = 30MHz (120MHz SYSCLK) HBAUD = 0x01且 LBAUD = 0x86。

   //

   ScibRegs.SCIHBAUD.ALL = 0x0002;

   ScibRegs.SCILBAUD.ALL = 0x008B;

   ScibRegs.SCICTL1.ALL = 0x0023; //从复位中撤回 SCI

 

//

// scib_xmit -从 SCI 发送一个字符

//

scib_xmit (int a)

   while (ScibRegs.SCIFFTX.bit.TXFFST!= 0){}

   ScibRegs.SCITXBUF.ALL =A;

 

//

// scib_msg -通过 SCIB 发送消息

//

void scib_msg (char * msg)

   int i;

   I = 0;

   while (msg[i]!='\0')

   {

//printf ("%c"、msg[i]);

       scib_xmit (msg[i]);

       i++;

   }

 

//

// scib_fifo_init -初始化 SCI FIFO

//

void scib_fifo_init()

   SCIFFTX.ALL = 0xE040;

   ScibRegs.SCIFFRX.ALL = 0x2044;

   ScibRegs.SCIFFCT.all = 0x0;

 

//

//文件结束

//


第二个 LaunchPad 在 SCIC RX (GPIO 139)上接收 charater "A"、并通过 SCIC TX (GPIO 56)将其发送回第一个 Launchpad。 第二个 Launchpad 上运行的代码如下所示:  

//

//包含的文件

//

#include "F28x_Project.h"

 

//

//全局

//

uint16环计数;

 

//

//函数原型

//

void SCIC_echoback_init (void);

void scic_fifo_init (void);

void SCIC_xmit (int a);

void SCIC_msg (char * msg);

 

//

//主函

//

void main (void)

   uint16 ReceivedChar;

   char *msg;

 

//

//步骤1. 初始化系统控制:

// PLL、安全装置、启用外设时钟

//此示例函数位于 F2837xD_SYSCTRL.c 文件中。

//

  InitSysCtrl()

 

//

//步骤2. 初始化 GPIO:

//此示例函数位于 F2837xD_GPIO.c 文件和中

//说明了如何将 GPIO 设置为其默认状态。

//

  InitGpio()

 

//

//对于这个示例、只初始化针对 SCI-C 端口的引脚。

// GPIO_SetupPinMux ()-设置 GPxMUX1/2和 GPyMUX1/2寄存器位

// GPIO_SetupPinOptions ()-设置 GPIO 的方向和配置

//这些函数可在 F2837xD_GPIO.c 文件中找到。

//

  GPIO_SetupPinMux (139、GPIO_MUX_CPU1、0x6);               //SCIC RX J5 PIN3

  GPIO_SetupPinOptions (139、GPIO_INPUT、GPIO_PushPull);

  GPIO_SetupPinMux (56、GPIO_MUX_CPU1、0x6);               //SCIC TX J5 PIN4

  GPIO_SetupPinOptions (56、GPIO_OUTPUT、GPIO_异 步);

 

//

//步骤3. 清除所有_interrupts 并初始化 PIE 矢量表:

//禁用 CPU __interrupts

//

  Dint;

 

//

//将 PIE 控制寄存器初始化为默认状态。

//默认状态为禁用所有 PIE __interrupts 和标志

//被清除。

//此函数位于 F2837xD_PIECTRL.c 文件中。

//

  InitPieCtrl()

 

//

//禁用 CPU __interrupts 并清除所有 CPU __interrupt 标志:

//

  IER = 0x0000;

  IFR = 0x0000;

 

//

//使用指向 shell 中断的指针初始化 PIE 矢量表

//服务例程(ISR)。

//这将填充整个表,即使是__interrupt

//在本例中未使用。  这对于调试很有用。

//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程

//此函数可在 F2837xD_PieVect.c 中找到

//

  InitPieVectTable()

 

//

//步骤4. 用户特定代码:

//

  LoopCount = 0;

 

  SCIC_fifo_init();      //初始化 SCI FIFO

  SCIC_echoback_init ();  //初始化用于 echoback 的 SCI

  for (;;)

  {

 

      //

      //等待 inc 字符

      //

      while (scicRegs.SCIFFRX.bit.RXFFST = 0){}//等待空状态

 

      //

      //获取字符

      //

      ReceivedChar = ScicRegs.SCIRXBUF.ALL;

 

      //

      //回显字符

      //

      //msg =" 您发送了:\0";

      //SCIC_msg (msg);

      SCIC_xmit (ReceivedChar);

 

      LoopCount++;

  }

 

//

// SCIC_echoback_init -测试1、SCIC DLB、8位字、波特率为0x000F、

//                      默认,1个停止位,无奇偶校验

//

void SCIC_echoback_init ()

   //

   //注意:SCIC 外设的时钟被打开

   //在 InitSysCtrl()函数中

   //

 

   ScicRegs.SCICCR.ALL = 0x0007;  // 1停止位, 无环回

                                   //无奇偶校验,8个字符位,

                                   //异步模式,空闲线协议

   ScicRegs.SCICTL1.ALL = 0x0003; //启用 TX、RX、内部 SCICLK、

                                   //禁用 RX ERR、睡眠、TXWAKE

   ScicRegs.SCICTL2.all = 0x0003;

   ScicRegs.SCICTL2.bit.TXINTENA=1;

   ScicRegs.SCICTL2.bit.RXBKINTENA=1;

 

   //

   // SCIC 为9600波特

   //@LSPCLK = 50MHz (200MHz SYSCLK) HBAUD = 0x02且 LBAUD = 0x8B。

   //@LSPCLK = 30MHz (120MHz SYSCLK) HBAUD = 0x01且 LBAUD = 0x86。

   //

   ScicRegs.SCIHBAUD.ALL = 0x0002;

   ScicRegs.SCILBAUD.ALL = 0x008B;

 

   ScicRegs.SCICTL1.ALL = 0x0023; //从复位中撤回 SCI

 

//

// SCIC_xmit -从 SCI 发送一个字符

//

void SCIC_xmit (int a)

   while (ScicRegs.SCIFFTX.bit.TXFFST!= 0){}

   ScicRegs.SCITXBUF.ALL =A;

 

//

// SCIC_msg -通过 SCIC 发送消息

//

void SCIC_msg (char * msg)

   int i;

   I = 0;

   while (msg[i]!='\0')

   {

       SCIC_xmit (msg[i]);

       i++;

   }

 

//

// SCIC_fifo_init -初始化 SCI FIFO

//

void scic_fifo_init ()

   ScicRegs.SCIFFTX.ALL = 0xE040;

   ScicRegs.SCIFFRX.ALL = 0x2044;

   ScicRegs.SCIFFCT.ALL = 0x0;

 

//

//文件结束

//

 我在示波器上观察到 SCIB TX 的输出、如下图所示:  

输出的放大版本如下所示:  


我无法理解该输出。 我的具体问题是:  
示波器上观察到的数据帧结构是什么?  
2.字符"A"在哪里?
如何根据这个 SCI 输出波形确定波特率?  

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

    在技术参考手册的帮助下、我已经解决了这个问题。