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-F28027F:SCI 初始化问题

Guru**** 2333840 points
Other Parts Discussed in Thread: LAUNCHXL-F28027F, BOOSTXL-DRV8305EVM, MOTORWARE, DRV8305, LAUNCHXL-F28069M
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/568573/launchxl-f28027f-sci-initialization-problem

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

我尝试使用 LAUNCHXL-F28027F 和 BOOSTXL-DRV8305EVM。

我想使用 SCI (UART)从 Linux-PC 控制电机驱动器。

然后我找到了一个示例"

instaspin_soc-SCI-eCAP 中

"
由 Maya 用旧线程编写"e2e.ti.com/.../1887277"、  

该示例起作用、但 启动过程中存在一些问题。  

我在 sci.h 中打开了#define SCI_FIFO

按照 hal.c 中 void HAL_setupSCI (HAL_Handle handle)中的代码执行操作

>>

MSG ="\r\n****** SCI 设置完成! 小部分 \0";
sci_writeMsg (obj->sciaHandle、msg);

<<

永远生成奇怪 的消息,如192 192 192 192 ...  

但是

按下 HW RESET SW (S2)后、代码运行良好。

我尝试忽略像这样的代码、

// msg ="\r\n****** SCI 设置完成! 小部分 \0";
// SCI_writeMsg (o

SCI 返回 短消息、如下所示、但通信很快停止

"

读取:192 192 192 192 192 192 128 128 128 128 128 128 128 128 128 128 128 128 1 192 192 192 192 192 192 192 192 192 192 128 128 128 128 128 128 1 192 192 192 192 192 192

读取:128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128 192 192 192 192 192

阅读:  

阅读:

阅读:

阅读:  

"

如何正确复位 SCI 设置和 FIFO 缓冲器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请按照我在这篇文章中规定的步骤将 SCI 添加到 Motorware 项目 e2e.ti.com/.../2078355中

    确保您初始化可用于 UART 终端通信的正确 SCI 端口(我认为它是 SCI-A、但您必须仔细检查)。 您可能还必须更改 LaunchPad 上的跳线设置、以便通过 FTDI 芯片将 SCI 信号路由到 PC 终端

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用 SCI-A、S1的 JAmper 设置为1开2开3关。

    在启动时出现问题一次(打开电源开关)、按下复位按钮后、我可以正确使用 SCI。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我无法回答为什么 SCI 模块以这种方式为您服务、这个领域不是我的专业知识。 我已经通过上面给出的步骤成功地将 SCI 模块连接到一个终端程序;另外、通过按照器件 TRM 中给出的步骤、应该能够添加 FIFO 功能和中断例程。

    我查看了您提到的客户代码、但没有发现问题的原因。 如果您愿意、我可以将其移至一般 C2000论坛、并离开电机控制论坛。

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然无法使用 InstaSPIN 解决 SCI 问题。
    您是否使用 boostxl 模块和电机测试了 SCI?
    您能向我们展示完整的示例代码吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在我的示例中、我使用了项目 lab11a。 所有对 proj_lab11a 的引用均可根据您要使用的项目进行多路复用。

    1) 1)将 sci.c 源文件添加到您的项目中、请确保将其正确链接、而不是将其复制到您的工作区中。 按照本实验中使用的相同相对寻址过程进行操作。 右键单击项目名称,然后选择“属性”->“资源”->“链接资源”->“链接资源”选项卡,以查看其他源文件的链接方式

    2) 2)请确保 sci.h 文件位于 include 路径。 默认情况下应为。 在项目中,展开“包含”部分,并检查是否可以通过以下 include 目录选项获得 sw->drivers->sci->src->32b->F28x->f2806x

    3) 3)在 HAL_init ()函数中添加 SCI 句柄、该函数在 proj_lab11a.c 中调用、并在 hal.c 中实例化

    在 HAL_init() add 中

     obj->sciaHandle = SCI_init ((void *) SCIA_BASE_ADDR、sizeof (SCI_Obj));

    4) 4)在 HAL_setParams ()函数中添加 SCI 初始化函数、该函数在 proj_lab11a.c 中调用并在 hal.c 中实例化

    在 hal.h 中添加

     extern void HAL_setupSciA (HAL_Handle handle);

    添加 hal.c

     void HAL_setupSciA (HAL_Handle handle)

       HAL_Obj * obj =(HAL_Obj *)句柄;

       SCI_RESET (obj->sciaHandle);
       sci_enableTx (obj->sciaHandle);
       sci_enableRx (obj->sciaHandle);
       sci_disableParity (obj->sciaHandle);
       SCI_setNumStopBits (obj->sciaHandle、SCI_NumStopBits);
       SCI_setCharLength (obj->sciaHandle、SCI_CharLength _8_Bits);
       //将波特率设置为115200
       SCI_setBaudRate (obj->sciAHandle、(SCI_budRate_e)(0x0061));
       SCI_setPriority (obj->sciaHandle、SCI_Priority_freRun);
       sci_enable (obj->sciaHandle);

       返回;
       // HAL_setupSciA()函数结束


    **根据系统需要更改功能参数

    在 HAL_setParams()加法中

     HAL_setupSciA (句柄);

    **即,调用刚创建的函数

    3) 3)启用 SCI-A 外设时钟

    在 hal.c 中的 HAL_setupPeripheralClks ()中,添加

     clk_enableSpiaClock (obj->clkHandle);

    4) 4)确保 SCI-A 的 GPIO 设置正确

    在 HAL_setupGpio()中,检查哪些 GPIO 引脚已启用为 SCIATXDA 和 SCIRXDA。

     // UARTA RX
     GPIO_setMode (obj->gpioHandle、GPIO_Number_28、GPIO_28_Mode_SCIRXDA);

     // UARTA TX
     GPIO_setMode (obj->gpioHandle、GPIO_Number_29、GPIO_29_Mode_SCITXDA);

    **我使用的是 F2806x+BoostXL DRV8305,HAL_setupGpio()函数中已经存在这些行

    5) 5)如果需要中断,则实例化函数,例如:sciARxISR()

    6) 6)将中断功能添加到中断矢量表中

    在 hal.h 中的 HAL_initIntVectorTable()中,添加

     PI->SCIRXINTA =&sciARxISR;

    7) 7)添加用于启用 SCI 中断的函数调用。 您可以在 proj_lab11a.c 中看到名为"HAL_enableAdcInts()"的函数。 您将需要对这个函数建模、但对于 SCI 而不是 ADC

    在 hal.h 中添加 HAL_enableSciInts()的声明,类似于您在上面所做的操作

    在 hal.c 中添加 HAL_enableSciInts()的实例,类似于您在上面所做的操作

    void HAL_enableSciInts (HAL_Handle handle)

       HAL_Obj * obj =(HAL_Obj *)句柄;

       //启用与 SCI 中断关联的 PIE 中断
       //在 PIE 中启用 SCIA RX 中断
       PI_enableInt (obj->压 电致、PI_GroupNumber_9、PI_InterruptSource_SCIARX);

       //启用 SCIA RX 中断
       sci_enableRxInt (obj->sciaHandle);

       //为 SCI 中断启用 CPU 中断
       cpu_enableInt (obj->cpuHandle、cpu_IntNumber_9);

    }// HAL_enableSciInts()函数结束

    **我在我的末尾创建的功能

    **在 proj_lab11a.c 中添加 HAL_enableSciInts(),即调用刚刚创建的函数。

    我强烈建议您将 ADC 中断从 CPU 中断编号10更改为 CPU 中断编号1、以避免 SCI 中断抢占 ADC 中断(这对于 FOC 至关重要)。 我的实验为 SCI 使用了一个简单的位轮询循环(即、不是由中断驱动)、这对我的应用很好。

    请花点时间阅读 SCI/UART 模块上相应的技术参考手册、因为它介绍了寄存器结构、模块初始化的正确顺序以及其他功能、例如我没有触摸的 FIFO。 如果您要使用中断、还应阅读 CPU 中断部分、尤其是饼图。 您将看到 ADC1可以被分配一个 HP 代号(高优先级);如果您要使用中断驱动的 SCI 模块、我建议您使用这个名称

    肖恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请将上述内容与我从上面其他 E2E 帖子链接的指南结合使用、因为它们有点相互补充(这更详细地介绍了、其他指南中也有一些需要处理的行项目)

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

    我阅读了 SCI 的技术参考手册、并修改了 ADC1的优先级。

    我关注了这个主题以及您的评论、

    e2e.ti.com/.../2089647

    HAL.c

    void HAL_enableAdcInts (HAL_Handle handle)

     HAL_Obj * obj =(HAL_Obj *)句柄;

     //启用与 ADC 中断相关的 PIE 中断

     PI_enableAdcInt (obj->压 电式、adc_IntNumber_1HP);

     //启用 ADC 中断

     adc_enableInt (obj->adcHandle、adc_IntNumber_1);

     //为 ADC 中断启用 CPU 中断

     cpu_enableInt (obj->cpuHandle、cpu_IntNumber_1);

     返回;

    }// HAL_enableAdcInts()函数结束

    hal.h

    静态内联 void HAL_initIntVectorTable (HAL_Handle handle)

     HAL_Obj * obj =(HAL_Obj *)句柄;

     PIE_Obj * PIE =(PIE_Obj *) obj->压 电式;

     ENABLE_PROTECTED 寄存器_WRITE_MODE;

     PIe->ADCINT1_HP = mainISR;

     PI->SCIRXINTA =&sciarxISR;

     disable_protected_register_write_mode;

     返回;

    }// HAL_initIntVectorTable()函数结束

    已修改的程序正常工作、但我的第一个问题 SCI 的初始化尚未解决。

    那么、、、、、然后我有2个问题。

    我找到了一个讨论闪存和 RAM SCI 初始化问题的旧线程、

    e2e.ti.com/.../511522

    我认为我的问题与这个问题类似。

    Gudivada 先生解释了一个解决方案:"通过在发送器和接收器之间设计一个良好的协议、确保发送器仅在接收器确认接收到数据时才发送数据、您可以避免溢出。"

    但我无法很好地理解这一提及、您能帮助我们理解吗?

    2.我还尝试根据 MotorWare 中的 scia_loopback _interrupts 示例使用 SCITX 中断。

    它在没有电机的情况下工作、但电机不工作。 由于我已经将 ADC1的优先级更改为1HP、 初始化似乎失败了。  

    如何将 SCITX 中断与电机配合使用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、
    hal.h
    静态内联空 HAL_acqAdcInt (HAL_Handle handle、const ADC_IntNumber_e intNumber)

    HAL_Obj * obj =(HAL_Obj *)句柄;

    //清除 ADC 中断标志
    adc_clearIntFlag (obj->adcHandle、intNumber);

    //确认来自 PIE 组10的中断
    PI_clearInt (obj->压 电筒、PI_GroupNumber_1);

    返回;
    }// HAL_acqAdcInt()函数结束
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在此函数中:

    void HAL_enableAdcInts (HAL_Handle handle)

    HAL_Obj * obj =(HAL_Obj *)句柄;

    //启用与 ADC 中断相关的 PIE 中断

    PI_enableAdcInt (obj->压 电式、adc_IntNumber_1HP);

    //启用 ADC 中断

    adc_enableInt (obj->adcHandle、adc_IntNumber_1);

    //为 ADC 中断启用 CPU 中断

    cpu_enableInt (obj->cpuHandle、cpu_IntNumber_1);

    返回;

    }// HAL_enableAdcInts()函数结束

    您还必须将 ADC_enableInt 的枚举从"ADC_IntNumber_1 "更改为"ADC_IntNumber_1HP"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请检查您的建议、ADC_enableInt 的 ADC_IntNumber_1HP 发生初始化失败。

    //启用 ADC 中断
    adc_enableInt (obj->adcHandle、adc_IntNumber_1);
    您还必须将 ADC_enableInt 的枚举从"ADC_IntNumber_1 "更改为"ADC_IntNumber_1HP"

    在此主题中、
    e2e.ti.com/.../1188229
    Maria 说"但请调用 HAL_acqAdcInt (halHandle、ADC_IntNumber_1);而不是 HAL_acqAdcInt (halHandle、ADC_IntNumber_1HP);"

    根据我的理解、为了启用 ADC 高优先级、
    我必须将中断的 ADC_IntNumber_1HP 与 ADC 标志的 ADC_IntNumber1相关联。
    这是个问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查看 ADC_enableInt()函数,如果使用_HP 枚举,实际上无关紧要,因为该函数将其转换为与非 HP 枚举相同的值
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用 Motorware v17和 BOOSTXL-DRV8305EVM、LAUNCHXL-F28027F 以及 LAUNCHXL-F28069M。

    您使用的是哪个版本的 Motorware?

    我找不到表。 我感到困惑。

    在 ADC.h 中、ADC_IntNumber _1_0、ADC_IntNumber_1HP = 9

    //! 简要列举以定义模数转换器(ADC)中断号

    //!

    typedef 枚举

     ADC_IntNumber_1=0、    //!<表示 ADCINT1

     ADC_IntNumber_2、      //!<表示 ADCINT2

     ADC_IntNumber_3、      //!<表示 ADCINT3

     ADC_IntNumber_4、      //!<表示 ADCINT4

     ADC_IntNumber_5、      //!<表示 ADCINT5

     ADC_IntNumber_6、      //!<表示 ADCINT6

     ADC_IntNumber_7、      //!<表示 ADCINT7

     ADC_IntNumber_8、      //!<表示 ADCINT8

     ADC_IntNumber_9、      //!<表示 ADCINT9

     ADC_IntNumber_1HP、    //!<表示 ADCINT1高优先级、仅与 PIE_enableAdcInt ()一起使用

     ADC_IntNumber_2HP、    //!<表示 ADCINT2高优先级仅与 PIE_enableAdcInt ()一起使用

     ADC_IntNumber_9HP=0xE  //!<表示 ADCINT9高优先级仅与 PIE_enableAdcInt ()一起使用

    } ADC_IntNumber_e;

    在 ADC.c 中

    void ADC_enableInt (ADC_Handle adcHandle、const ADC_IntNumber_e intNumber)

     ADC_Obj * ADC =(ADC_Obj *) adcHandle;

     uint_least8_t regNumber = intNumber >> 1;

     UINT_least8_t Lshift = ADC_INTSELxNy_NUMBITS_PER_REG -((((intNumber+1)& 0x1)<< ADC_INTSELxNy_log2_NUMBITS_PER_REG);

     uint16_t setValue = ADC_INTSELxNy_Inte_BITS << Lshift;

     ENABLE_PROTECTED 寄存器_WRITE_MODE;

     //设置值

     ADC->INTSELxNy[regNumber]|= setValue;

     disable_protected_register_write_mode;

     返回;

    }// adc_enableInt()函数结束

    调平位移 可以得到:

    0b00000000 >> 1 = 0b00000000、

    0b00001001 >> 1 = 0b00000100

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

    您是对的、回看我在我的 adc.c 版本上添加了如下所示的代码行:

    void ADC_enableInt (ADC_Handle adcHandle、const ADC_IntNumber_e intNumber)

     uint16_t newIntNumber = intNumber;

     if (intNumber = ADC_IntNumber_1HP || intNumber = ADC_IntNumber_2HP)

     {

     newIntNumber -= 9;

     }

     ADC_Obj * ADC =(ADC_Obj *) adcHandle;

     uint_least8_t regNumber = newIntNumber >> 1;

     UINT_least8_t Lshift = ADC_INTSELxNy_NUMBITS_PER_REG -(((newIntNumber+1)& 0x1)<< ADC_INTSELxNy_log2_NUMBITS_PER_REG);

     uint16_t setValue = ADC_INTSELxNy_Inte_BITS << Lshift;

     ENABLE_PROTECTED 寄存器_WRITE_MODE;

     //设置值

     ADC->INTSELxNy[regNumber]|= setValue;

     disable_protected_register_write_mode;

     返回;

    您应该将枚举保留为 ADC_IntNumber_1。

    如果在启用 SPI 中断的情况下让电机旋转时遇到问题、我们需要检查您是否正在进入 mainISR。 您是否在例程中放置了调试点或计数器、以查看是否正在进入 ISR?

    肖恩

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

    >如果您在启用 SPI 中断时遇到电机旋转问题、我们需要检查您是否正在进入 mainISR。 您是否在例程中放置了调试点或计数器、以查看是否正在进入 ISR?

    我没有明确检查它、但我记得电位计工作正常。 它读取了 mainISR 处的值。

    我知道我必须很快直接检查。
    但我的 launchxl-f28027f 被刷写超过40次而损坏。 我已经坏了4个 lauchxl-f28027f、我没有储备。
    需要一些时间...

    我还在 LAUNCHXL-F28069M 中尝试了相同的代码、找不到问题。
    当电源从 BOOSTXL-DRV8305EVM 供电时、LAUNCHXL-F28027F 中将出现初始化问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否正确理解您在 F28027上看到的 F28069问题?

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我在 F28069上找不到相同的问题。

    初始化问题仅在 F28027F 上发生。
    设置
    我使用此示例启用了 SCI。 github.com/.../instaspin_foc-SCI-eCAP
    2.我删除了 JP1、JP2、JP3。
    3.我启用了串行开关,引导开关为1:开、2:开、3:关。
    我通过 BOOSTXL-DRV8305EVM 供电、得到+24V。
    我连接了 PC 和 F28027F 的 USB 端口。 我使用终端单调软件监控串行通信。

    执行
    1、我接通+24V 电源、f28027f 和 drv8305被制动、但无法正常工作。
    2.串行显示器收到奇怪的长文本。
    3.我按下 F28027F 的 RST (S2)开关、电机开始旋转、串行监视器收到正确的文本。

    我想解决这个问题、以便将驱动程序集成到系统中。