我已导入 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 输出波形确定波特率?