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-F28069M:接收 UART 数据

Guru**** 2605785 points
Other Parts Discussed in Thread: MSP430F5529, C2000WARE, CONTROLSUITE, LAUNCHXL-F28069M

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/679380/launchxl-f28069m-receiving-uart-data

器件型号:LAUNCHXL-F28069M
主题中讨论的其他器件:MSP430F5529C2000WAREcontrolSUITE

您好! 我正在尝试从运行频率为9600BAUD 的 HC06接收字符串。 我在 MSP430F5529上有一个工作的系统。  

这是我想象中应该起作用的代码。 我的问题实际上不是在 RXBUF 中接收任何内容。 我正在被中断、这意味着我正在接收一个字节、但没有任何内容传输到我的数组。

我曾尝试假设 LSPCLK 为90MHz、默认 SYSCLK/4等于22.5MHz。 使用公式:

LSPCLK/(9600*8)- 1、我发现22.5MHz 的值为0x123、90MHz 的值为0x492、存储在:  

SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = 0x0492;// 9600波特,我还尝试了0x0123。

我一定会做些错误的事! 如果有人能帮我、这将是学校项目的一小部分、我们将不胜感激!

谢谢!

以下是我正在运行的代码(相关内容):


_interrupt void sciaRxFifoIsr (void);
char RXParseData[256]={};//将接收到的数据存储在 RXBUF 中的数组

void main (void)



//-- CPU 初始化
InitSysCtrl();//初始化 CPU (文件:sysctrl.c)

InitPieCtrl();//初始化并启用 PIE (文件:PIECTRL.c)
InitWatchdog();//初始化看门狗计时器(文件:watchdog.c)

//-- SCI ----设置
EALLOW;

/*为所选引脚启用内部上拉*/
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。

GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;//为 GPIO28启用上拉(SCIRXDA)

/*将所选引脚的限定条件设置为仅异步*/
默认情况下、//输入与 SYSCLKOUT 同步。
//这将为所选引脚选择异步(无限定条件)。

GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;//异步输入 GPIO28 (SCIRXDA)


/*使用 GPIO 寄存器配置 SCI-A 引脚*/
//这指定哪些可能的 GPIO 引脚将是 SCI 功能引脚。

GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;//为 SCIRXDA 操作配置 GPIO28

EDIS;

//结束 SCI 设置

//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
InitPieVectTable();

//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.SCIRXINTA =&sciaRxFifoIsr;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

//FIFO 设置
SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议

SciaRegs.SCICTL1.all =0x0001;//启用 RX、内部 SCICLK、
//禁用 TX、RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = 0x0492;// 9600波特,我还尝试了0x0123。

SciaRegs.SCIFFRX.All=0x0022;
SciaRegs.SCIFFCT.All=0x00;

SciaRegs.SCICTL1.all =0x0021;//从复位中撤回 SCI
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

//启用此示例所需的中断
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
PieCtrlRegs.PIEIER9.bit.INTx1=1;// PIE 组9,INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1;// PIE 组9,int2
IER = 0x100;//启用 CPU INT
EINT;

//--启用全局中断
asm (" CLRC INTM、DBGM");//启用全局中断和实时调试



_interrupt void sciaRxFifoIsr (void)

uint16 i = 0;

while (1)

RXParseData[i]=SciaRegs.SCIRXBUF.all;
i++;  



SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志

PieCtrlRegs.PIEACX.All|=0x100;//发出 PIE ACK

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

    您的波特率计算似乎正常。 如果我理解正确、则会生成中断(即接收数据)、但 ISR 中的问题是未加载数组。 在 ISR 中、请将 PIEACK 移至顶部(就在 UINT16 I=0之后)。 请告诉我这是否解决了问题。

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

    不幸的是,这没有解决这个问题。 是的、您正确理解了问题!

    ISR 更改:

    _interrupt void sciaRxFifoIsr (void)

      uint16 i = 0;

      PieCtrlRegs.PIEACX.All|=0x100;   //发出 PIE ACK

      while (1)

      {

       RXParseData[i]=SciaRegs.SCIRXBUF.all; //读取数据

       i++;

      }

      SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; //清除溢出标志

      SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; //清除中断标志

    经过一些思考、我对我的硬件设置提出了疑问。 现在、我将 HC06的 TX 连接到 C2000的引脚3。 我在 JP6和 JP7上有两个跳线。  这可能是个问题吗?

    我对 UART 有相当好的了解、所以我想问:如果我正在接收中断、但没有任何内容传输到我的数组、我如何接收中断? 这是否至少会被视为起始位、后跟八个0、然后是停止位? 数组显示0还是仅显示"。" 如此处所示(I = 9 @此截屏时间、在我发送消息'Route 1'后):

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

    有关跳线 J6和 J7设置、请参阅第7页的 F28069M LaunchPad 用户指南 SPRUI11。 此外、请确认您正在执行 ISR。 在 ISR 中放置一个断点、然后查看程序是否在那里停止。 请告诉我发生了什么。

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

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

    我遵循了该指南、我想确认我已正确连接它。

    此外、如果您能抽出一些时间来解决我的问题、我将非常感激、正如我在本页上的前两篇文章中所说的、我正在进入 ISR、我还提供了我在 ISR 中的程序的图片、 我还确认您对问题的理解是正确的、因为您之前回答过

    "安得烈、

    您的波特率计算似乎正常。 如果我理解正确、则会生成中断(即接收数据)、但 ISR 中的问题是未加载数组。 在 ISR 中、请将 PIEACK 移至顶部(就在 UINT16 I=0之后)。 请告诉我这是否解决了问题。

    -肯"

    我相信我已经遵循了用户手册中的所有说明、我在这个问题上花了太长时间、我真的可以使用一些指导。 我无法解决问题。 我想重申的是、这个程序在 MSP430上运行、所以我必须在软件(寄存器)设置或硬件设置方面做一些错误、但我无法将其引脚指向!

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

    我注意到、ISR 中有一个无限循环、这意味着您将永远停留在这个循环中。 同时、主代码中没有 while 循环。 其理念是代码应位于 main (初始化后)的 while 循环中、直到收到中断、然后在数据被复制到缓冲区的位置执行 ISR。 复制完成后、代码返回到 main 中的 while 循环、并重复该过程。 此外、禁用看门狗时也不清楚。 您应该在测试代码时禁用看门狗。 要确认看门狗已禁用、请在 main 中的第一行之后放置一个断点、您不应在那里停止。 如果启用了看门狗但未提供服务、则将不断重置器件。

    有关如何为 SCI 提供服务的示例、请参阅 C2000Ware 中的以下内容(下载最新版本):

    C:\ti\c2000Ware_1_00_04_00\device_support\f28066\examples\c28\scia_loopback _interrupts

    请注意第236行的 ISR。 另外、请注意在第98行初始化之后 main 中的循环。

    作为参考并了解有关 F2806x 器件的更多信息、请参阅 F2806x 多日技术讲座、网址为:

    processors.wiki.ti.com/.../C2000_Archived_Workshops

    在这里、您会发现执行了相同的过程-初始化后会在 main 中输入一个 while 循环;然后中断是服务的、程序控制返回到 while 循环。

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

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ISR 中的 while (1)仅用于测试目的、因为一旦我进入 ISR、我应该会看到数据被传送到数组、但仍然没有数据!
    虽然(1)是主代码、但我的主代码中有很多其他代码(计时器、ECAP、ePWM、GPIO、发生事件的逻辑等)。 我刚才已经介绍了这个问题的相关内容。

    我确实遵循了 scia_loopback_interrupts 示例、这是代码的来源。 我重新配置了代码、使其仅为接收器、并重新计算了应用的波特率、但仍然存在此问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Andrew、

    1. 验证 LSPCLK 的频率。
      1. 您说过的第一篇帖子假设您的 LSPCLK ... 我建议使用 XCLKOUT 来验证频率、波特率不匹配是一个常见的问题。
    2. 您能否使用示波器确认 HC06正在发送数据、并且数据以正确的波特率传入?
      1. 可能是、但请幽默我
    3. 您是否已将 TX 连接到 RX 和 RX 连接到 TX?
      1. 您会感到惊讶的是、这种情况发生的频率有多高。

    现在、您在 ISR 中写入此 while (1)循环的方式将导致缓冲区充斥"数据"。 如果 您在 RXBUF 中有数据、数组将不加区分地填充。  由于您收到了一个中断、我本以为前几个数组元素应该有值。(这很奇怪)现在我从未像器件之前那样从 RX 缓冲区中读取数据、 因此、我真的不知道假设 RXBUF 中没有值、它会填充缓冲区的'data'。 有时是的、您会在缓冲区中收到一个值、该值将被传输到数组、但在某个点会被覆盖。

    我建议您从 RXFFST 寄存器中读取数据、然后确定您希望从 FIFO 中拉出多少个字。 当您读取这些字时、您可以根据需要将其放入数组中、但之后您应该确认中断并从 ISR 返回。

    如果我在上述帖子中遗漏了任何此类信息、请原谅我。

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Cody! 是 Andrew、就在我的合作伙伴账户上。

    我研究了验证 XCLKOUT、但我对设置输出来显示 XCLKOUT 有点困惑。 您能否为我提供代码来进行验证? 我不想问、但我在项目的一小部分中这么做、我完全被这个项目中的其他所有东西以及我的6个其他课程所淹没! 如果您没有代码、我会尝试将一些时间一起清理出来。

    我知道 HC06正在以正确的波特率发送正确的数据、因为我在 MSP430上使用同一个系统。

    我只有从 HC06到 launchpad RX 的 TX。 我正在被中断、因此我确定我必须具有正确的值。

    我知道、如果我让 ISR 运行、阵列会快速溢出。 我将在 ISR 中设置断点并读取 RXBUF (单步执行)。

    关于 RXFFST 寄存器、读数最长的字符串将是'Route 1'(从'Go''Stop 'Route 1''Route 2')、因此我觉得使用 FIFO 会是很多寄存器来配置、而我不会使用这些寄存器。

    我想认为 LSPCLK 是个问题、但我想我的数据将是"垃圾"、而不是任何数据。 这使我相信我必须有一些配置问题。 我将 HC06的 TX 连接到 launchpad (GPIO 28)的引脚3。 我在 JP6和 JP7上有两个跳线。 这可能是个问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Cody!
    您认为将 LSPCLK 设置为频率而不是测量频率更容易吗? 我最近去检查了它的频率、但我对寄存器有点困惑。 我没有花太多的时间来学习它、因为我正忙于这个项目和我的其他课程。 如果我们只能将其设置为 SYSCLK/4、那就太棒了! 您是否能够为其提供代码?

    我已确认 HC06正在发送正确的数据。 我还有最初在 MSP430上运行的同一个系统。

    我将 HC06的 TX 连接到 launchpad 上的引脚3、该引脚设置为 GPIO28、因为我打开了 JP6和 JP7跳线。 (我认为这是正确的)

    我知道 ISR while 循环不正确。 这只是为了调试程序。 我正在设置一个断点、并立即进入该点并检查数据、但数据未显示! 我还使用了"如果我检测到零"、但这也会中断(我认为它最终是一个永久性循环)。

    我登录 RXFFST 寄存器、但我将以非常长的时间间隔接收最多4个唯一字符串(GO、STOP、Route 1和 Route 2)。 我觉得使用 FIFO 外设会很麻烦、因为我只需要一个简单的接收程序来读取几个字符进行解析。 我最初曾研究过这一点、但我觉得我应该配置寄存器以不使用它们。

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

    哎呀、抱歉! 当我在我的合作伙伴计算机上发送此邮件时、它没有显示! 另外、直到我发送了刚刚发送的消息后、才会显示出来!... 他们说的都是一样的!

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

    Andrew、

    很抱歉、Andrew、如果没有大量的法律因素、我无法提供代码。 在 GPIO18的多路复用器配置上配置 XCLKOUT 非常简单、though...select XCLKOUT、然后确保您使用的是正确的分频器(请参阅 TRM 中的图1.4.2.11 "XCLKOUT Generation")、并检查您是否看到了您在 GPIO18上期望的时钟速率。

    如果您不想使用 FIFO、为什么要配置它们(请参阅下面的报价)? 您应该使用 FIFO、您从开始的代码已经对其进行配置、因此它不应该是任何额外的工作。

    [引用用户="Andrew Wenaus"] SciaRegs.SCIFFRX.All=0x0022;

    我还建议您创建一种标准的沟通语言、 无需使其可读的"route 1"和"GO"可以编码为较短的消息、如"r1"和"C1"、其中 R 后面的数字是路由选择、C 后面的数字是命令(0= STOP、1= GO、2= IDLE、3=胜利舞蹈、 等) 它将加快速度!

    是的、在 JP6和 JP7上使用跳线可能会是一个问题、原理图指出这是"UART 禁用"。 如果要在 GPIO28和 GPIO29上使用 UART、则应配置 MUX_SEL=0和 CH_SEL=1。 MUX_SEL 和 CH_SEL 的选择由 JP6/JP7完成、并在原理图的第6页进行了全面介绍。 原理图(LAUNCHXL-F28069M_sch.pdf)可在 C2000Ware 和 controlSUITE 中找到。

    我们都面临着一套看似不可逾越的任务,把它看作是一个增长的时代,它将是一个时代。

    希望它能帮助你!

    此致、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚刚确认系统时钟为90MHz! 关于标准通信理念、这是一个奇妙的理念! 谢谢!

    我修复了 JP6和 JP7的情况、但现在我根本没有收到中断!

    我会把它看作是成长的,它是疯狂的压力! 我期待一切结束!

    不管怎样,我要开始一个新的线程,如果你愿意看,我将尽可能多地提供信息,因为我是一个失利的人!

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

    好的、我们将把这个标记为完成、并在新线程中继续调试。

    此致、
    Cody