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.

[参考译文] CCS/TMS320F28379D:CPU 的 SCI 回送错误2.

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/839596/ccs-tms320f28379d-sci-echoback-error-with-cpu-2

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

大家好、

我正在尝试使用 CPU02实现 sci 回波(通过修改双 CPU 闪烁示例)。 现在、这里是我要执行的步骤。

1) 1)处理从 CPU01到 CPU02的 SCI GPIO


GPIO_SetupPinMux (43、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (43、GPIO_INPUT、GPIO_PushPull);
GPIO_SetupPinMux (42、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (42、GPIO_output、GPIO_Async);

2) 2)将数据从 Cpu02发送到 sci 数据寄存器。

这是 cpu01代码-

//######################################################################################################################
//
//文件:Blinky_cpu01.c
//
//标题:F2837xD 的 LED 闪烁示例。
//
//! addtogroup dual_example_list
//!

Blinky


//!
//! 双核 Blinky 示例。 此示例演示了如何实现
//! 并在两个内核上运行独立应用程序。
//!
//
//######################################################################################################################
//$TI 发行版:F2837xD 支持库 v3.05.00.00 $
//$Release Date:Thu OCT 18 15:48:42 CDT 2018 $
//版权所有:
//版权所有(C) 2013-2018 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//$
//######################################################################################################################

//
//包含的文件
//
#include "F28x_Project.h"
#include "F2837xD_IPC_DRIVERS.h"

//
//主函
//
void main (void)

uint16 i=0;
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();

#ifdef _standalone
#ifdef _flash
//
//发送引导命令以允许 CPU2应用程序开始执行
//
IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
其他
//
//发送引导命令以允许 CPU2应用程序开始执行
//
IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _RAM);
#endif
#endif

//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
#ifdef _flash
InitFlash();
#endif

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();//针对此示例跳过
EALLOW;
GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;

GPIO_SetupPinMux (43、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (43、GPIO_INPUT、GPIO_PushPull);
GPIO_SetupPinMux (42、GPIO_MUX_CPU2、0xF);
GPIO_SetupPinOptions (42、GPIO_output、GPIO_Async);

for (i=0;i<8;i++)

GPIO_SetupPinMux (I、GPIO_MUX_CPU2、0);
GPIO_SetupPinOptions (I、GPIO_INPUT、GPIO_PULLUP);

//
// TODO 添加代码以允许使用 IPC 从 CPU02配置 GPADIR
//
EDIS;
GpioDataRegs.GPADD.bit.GPIO31 = 1;//关闭 LED

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

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

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

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

//
//启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//
//步骤6. 空闲循环。 只需坐下来循环(可选):
//
for (;;)

//
//打开 LED
//
GpioDataRegs.GPADAT.bit.GPIO31 = 0;
//
//延迟一位。
//
DELAY_US (1000 * 500);

//
//关闭 LED
//
GpioDataRegs.GPADAT.bit.GPIO31 = 1;
//
//延迟一位。
//
DELAY_US (1000 * 500);

//
//文件结束
//

CPU02代码

 

//
//包含的文件
//
#include "F28x_Project.h"
#include "F2837xD_IPC_DRIVERS.h"
uint16环计数;

//
//函数原型
//
void scia_echoback_init (void);
void scia_fifo_init (void);
void scia_xmit (int a);
void scia_msg (char * msg);
void scia_xmit32 (uint32 b);

//
//主函
//

#ifdef _flash
//
//这些由链接器定义(请参阅器件链接器命令文件)
//
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadSize;
extern UINT16 RamfuncsRunStart;
#endif

//
//主函
//
void main (void)


char *msg;
//
//将时间关键代码和闪存设置代码复制到 RAM
//这包括 InitFlash()、闪存 API 函数和任何函数
//分配给 ramfuncs 段。
// RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
//符号由链接器创建。 请参阅器件.cmd 文件。
//
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
#ifdef _flash
InitFlash();
#endif

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
// InitGpio();//针对此示例跳过

EALLOW;
//
//TODO 添加代码以通过 IPC 配置 GPADIR
//
//GPIO_WritePin (34、1);

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

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

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

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

//
//启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//
//步骤6. 空闲循环。 只需坐下来循环(可选):
//
scia_fifo_init();//初始化 SCI FIFO
scia_echoback_init ();//初始化用于 echoback 的 SCI

MSG ="\r\n\n\nHello World!\0";
scia_msg (msg);

MSG ="\r\n 您将输入一个字符,DSP 将回显它! \n\n";
scia_msg (msg);

for (;;)

MSG ="\r\n 输入字符:\0";
scia_msg (msg);

//
//等待 inc 字符
//
/* while (SciaRegs.SCIFFRX.bit.RXFFST ==0){}//等待空状态

//
//获取字符
//
ReceivedChar = SciaRegs.SCIRXBUF.ALL;

//
//回显字符
//
MSG ="您已发送:\0";
scia_msg (msg);
scia_xmit (ReceivedChar);

LoopCount++;*/

scia_xmit32 (GpioDataRegs.GPADAT.all);
DELAY_US (1000*500);


void scia_echoback_init ()

//
//注意:SCIA 外设的时钟被打开
//在 InitSysCtrl()函数中
//

SciaRegs.SCICCR.all = 0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
SciaRegs.SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.all = 0x0003;
SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;

//
// SCIA 为9600波特
//@LSPCLK = 50MHz (200MHz SYSCLK) HBAUD = 0x02且 LBAUD = 0x8B。
//@LSPCLK = 30MHz (120MHz SYSCLK) HBAUD = 0x01且 LBAUD = 0x86。
//
SciaRegs.SCIHBAUD.ALL = 0x0002;
SciaRegs.SCILBAUD.ALL = 0x008B;

SciaRegs.SCICTL1.all = 0x0023;//从复位中撤回 SCI

//
// scia_xmit -从 SCI 发送一个字符
//
void scia_xmit (int a)

while (SciaRegs.SCIFFTX.bit.TXFFST!= 0){}
SciaRegs.SCITXBUF.ALL =A;

//函数用于传输32位整数、因为 SCITXBUF 的最低有效
//8位缓冲器
void scia_xmit32 (uint32 b)

int msg8位、j;
for (j=0;j<8;j++)

msg8bit=((b)>j)&1)+48;
while (SciaRegs.SCIFFTX.bit.TXFFST!= 0){}
SciaRegs.SCITXBUF.all =msg8bit;

//
// scia_msg -通过 SCIA 发送消息
//
void scia_msg (char * msg)

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

scia_xmit (msg[i]);
i++;

//
// scia_fifo_init -初始化 SCI FIFO
//
void scia_fifo_init()

SciaRegs.SCIFFTX.ALL = 0xE040;
SciaRegs.SCIFFRX.ALL = 0x2044;
SciaRegs.SCIFFCT.all = 0x0;

//
//文件结束
//

 

下面是项目文件夹和添加的文件的快照-

看起来 CPU02没有访问 SCI 寄存器。

请帮助。

提前感谢。

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

    您好!

    当您说 CPU2没有访问 SCI 寄存器时,是否正在 CPU2侧启用 SCI 外设?

    CPU2是否在 CPU1完成配置之前运行?

    您能否查看 C2000Ware\device_support\f2837xd\examples\dual\IPC_GPIO_toggle 示例以检查 IPC 是否看起来正常?

    此致。

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

    大家好、Meghana、

    感谢您的回答。 首先、我修改了此代码的 IPC_GPIO_TOGGLE 示例。 我使用 core1来初始化引脚多路复用

    //核心1代码的一部分

    InitGpio();//针对此示例跳过
    EALLOW;
    GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;

    GPIO_SetupPinMux (43、GPIO_MUX_CPU2、0xF);
    GPIO_SetupPinOptions (43、GPIO_INPUT、GPIO_PushPull);
    GPIO_SetupPinMux (42、GPIO_MUX_CPU2、0xF);
    GPIO_SetupPinOptions (42、GPIO_output、GPIO_Async);

    for (i=0;i<8;i++)

    GPIO_SetupPinMux (I、GPIO_MUX_CPU2、0);
    GPIO_SetupPinOptions (I、GPIO_INPUT、GPIO_PULLUP);

    然后、我放置来自(IPC_GPIO_TOGGLE)的 IPC 代码


    #ifdef _standalone
    #ifdef _flash
    //
    //发送引导命令以允许 CPU2应用程序开始执行
    //
    IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
    其他
    //
    //发送引导命令以允许 CPU2应用程序开始执行
    //
    IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _RAM);
    #endif
    #endif

    //
    //调用闪存初始化以设置闪存等待状态
    //此函数必须驻留在 RAM 中
    //
    #ifdef _flash
    InitFlash();
    #endif

    我还在内核2上启动 scia_init()。

    除此之外、我不明白您说通过 CPU2启用 SCI 是什么意思。

    请听我说。

    谢谢你。

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

    您好 Arindam,

    当然。 我的意思是,您还在 CPU2侧调用 Device init ()吗?

    我还希望看到一条类似下面针对 SPI 所做的声明、以便在 CPU1完成其配置后控制 CPU2。

    SYSCTL_selectCPUForPeripheral (SYSCTL_CPUSEL6_SPI、1、SYSCTL_CPUSEL_CPU2);

    参考: C2000Ware\driverlib\f2837xd\examples\dual\dma

    只有在这个传输控制之后、我们才能在 CPU2侧完成 sci 初始化。

    此致。