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.

[参考译文] TMS320F28.0025万C:LIN SCI的故障排除设置-不确定如何为外部回送配置GPIO

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1098011/tms320f280025c-troubleshooting-setup-of-lin-sci---unsure-of-how-to-configure-gpio-for-external-loopback

部件号:TMS320F28.0025万C

我在为LIN SCI协议配置GPIO针脚28/29上的外部回送测试时遇到了挑战。 我已确保主板上的开关位于“1”位置,并且J101上存在分流板。 这是我的代码。 我认为它与配置GPIO有关,因为我已经了解了LIN的设置。 可以帮帮我吗?

//#######################################################################
//
//文件: lin_ex2_sci_loopback.c
//
//标题: LIN SCI模式内部回环,带中断
//
//! \addtogroup driver_example_list
//! <H1>LIN SCI模式内部回送,带中断</H1>
//!
//!  本示例将SCI模式的LIN模块配置为内部回送
//!  使用中断。 LIN模块以SCI的形式执行,带有一个设置字符
//!  和帧长度。 模块设置为
//!  连续传输字符,等待接收该字符,然后
//!  重复。
//!
//! \b外部连接\n
//!  无。
//!
//! \b监视变量\n
//!  - rxCount - RX中断数
//!  -传输字符-要传输的字符
//!  - receivedChar -收到的字符
//!
//
//#######################################################################
//
//
//$Copyright:
//版权所有(C) 2021 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,无论是否使用
//修改,但前提是满足以下条件
//满足:
//
// 重新分发源代码必须保留上述版权
// 注意,此条件列表和以下免责声明。
//
// 以二进制形式重新分发必须复制上述版权
// 注意,此条件列表和中的以下免责声明
// 随提供的文档和/或其他材料  
// 分发。
//
// 既不是德州仪器(TI)公司的名称,也不是的名称
// 其贡献者可用于支持或促销衍生产品
// 未经特定的事先书面许可。
//
//本软件由版权所有者和贡献者提供
//“按原样”和任何明示或暗示的担保,包括但不包括
//仅限于适销性和适用性的暗示担保
//不承担特定目的。 在任何情况下,版权都不应享有
//所有者或贡献者对任何直接,间接,附带,
//特殊,典型或后果性损害(包括但不包括
//仅限于采购替代货物或服务;无法使用,
//数据或利润;或业务中断)
//责任理论,无论是合同,严格责任还是侵权行为
//(包括疏忽或其他)因使用而产生的任何问题
//此软件的任何版本,即使已被告知可能会造成此类损坏。
//$
//#######################################################################

//
//包含的文件
//
#include "driverlib.h"
包含"device.h"

//
//定义
//
#define char_length   8.
#define frame_length   1.

//
//全局
//
易失性UINT32_t rxCount =0
volatile UINT32_t矢量偏移=0
易失性uint16_t错误= 0
UINT16_t传输字符= 0x0
UINT16_t receivedChar = 0x0

//
//函数原型
//
__interrupt void dataRxISR(void);
void配置SCSIMode(void);

//
//主菜单
//
Void主(void)
  //
  //初始化设备时钟和外围设备
  //
  device_init()

  //
  //初始化GPIO
  //
  DEVICE_INITGPIO ();
  GPIO _setPinConfig (DEVICE_GPIO _CFG_LINTXA);
  GPIO _setPinConfig (DEVICE_GPIO _CFG_LINRXA);

  //初始化RX GPIO引脚
  GPIO设置方向模式(29, GPIO DIR_MODE_IN);
  // gPIO_setPadConfig (29,gPIO_PIN_TYPE_STD);
  GPIO_setQualificationMode (29GPIO _Qual_Async);

  //初始化TX GPIO引脚
  GPIO_setDirectionMode (28GPIO_DIR_MODE_OUT);
  // gPIO_setPadConfig (28,gPIO_PIN_TYPE_STD);
  GPIO_setQualificationMode (28GPIO _Qual_Async);

  //
  //初始化饼图和清除饼图寄存器。 禁用CPU中断。
  //
  // Interrupt_initModule();

  //
  //使用指向外壳中断的指针初始化PIE矢量表
  //服务例程(ISR)。
  //
  // Interrupt_initVectorTable();
  // EINT;
  // ERTM;

  //
  //本示例中使用的中断被重新映射到
  //此文件中找到ISR函数。
  //这将在PIE矢量表中注册中断处理程序。
  //
  //中断注册(INT_Lina_0,&dataRxISR);

  //
  //启用LIN中断信号
  //
  // Interrupt_enable (INT_Lina_0);

  //
  //初始化LIN模块
  //
  LIN_INITModule (Lina_base);

  //
  //将LIN模块配置为在SCI模式下运行
  //
  configureSCSIMode();

  
  //
  //启用全局中断行并将状态清除为已知值
  //
  // lin_enableGlobalInterrupt (Lina_base,lin_interrupT_LINE0);
  // lin_clearGlobalInterruptStatus (Lina_base,lin_interrupT_LINE0);

  //
  //连续传输8位字符,等待ISR运行,然后
  //验证是否正确接收了所有内容
  //
  对于(;;)
  
    矢量偏移量=0

    //
    //将传输字符递增为新值
    //
    传输字符++

    //
    //当大于一个字节时重置传输字符
    //
    IF (传输字符> 0xFF)
    
      传输字符=0
    }

    //
    //等待SCI接收器处于空闲状态
    //
    // while (!lin_isSCIReceiverIdle (Lina_base));

    //
    //传输数据字节
    //
    LIN_writeSCICharBlocking (Lina_base传输字符);

    //
    //等待ISR触发并读取传输的字符
    //
    // while (矢量偏移!= LIN_VECT_RX);
    布尔isReady = LIN_isSCIDataAvailable(Lina_base)
    //
    //等待SCI接收器处于空闲状态
    //
    // while (!lin_isSCIReceiverIdle (Lina_base));
 
    // while (!lin_isSCIDataAvailable (Lina_base));
    //
    //读取传输的字符
    //
    receivedChar = LIN_readSCICharNonBlocking (Lina_baseFALSE);


    //
    //如果出现任何错误,请停止示例
    //
    如果(错误!= 0)
    
      ASM (" ESTOP0");
    }
  }
}

//
//配置SCI模式-此功能将LIN模块配置为按以下方式工作
//带有指定设置的SCI。
//
无效
配置SCIMode (void)
  //
  //输入LIN重置状态以执行配置
  //
  LIN_enterSoftwareReset(Lina_base)

  //重置外围设备
  LIN_performSoftwareReset(Lina_base)

  //
  //将LIN切换到SCI模式
  //
  LIN_ENableSCIMode (Lina_base);

  //
  //将SCI通信模式设置为IDLE LINE
  //
  LIN_setSCICommMode (Lina_baseLIN_COMM_SCI_IDLELINE);

  
  //
  //启用模块(应将RX FUNC和TX FUNC位设置为1,
  //不确定是否有效)
  //
  LIN_ENableModule (Lina_base);

  //
  //设置波特率
  //#这些是针对11.52万波特率的。 见TRM第2351页
  //
  LIN_setBaudRatePrescaler (Lina_base262);

  //#TODO将SCIGCR1中的时钟位设置为1以选择内部时钟

  //
  //将SCI设置为传输一个停止位
  //
  LIN_setSCIStopBits (Lina_baseLIN_SCI_STOP_ONE);

  //
  //禁用奇偶校验
  //
  LIN_disableSCIParity (Lina_base);

  //
  //禁用多缓冲区模式
  //
  LIN_disableMultibufferMode (Lina_base);

  //
  //模块设置为在调试器停止时完成操作
  //
  LIN_setDebugSuspendMode (Lina_baseLIN_DEBUG_COMPLETE);

  //
  //将字符长度设置为8位
  //
  LIN_setSCICharLength (Lina_basechar_length);

  //
  //在响应字段中设置为1个字符
  //
  LIN_setSCIFrameLength (Lina_baseframe_length);

  //
  //启用内部环回模式
  //
  // lin_enableIntLoopback (lina_base);

  //
  //启用外部环回模式
  //
  LIN_ENableExtLoopback (Lina_baseLIN_Looping_digitalLIN_analog_loop_none);

  //
  //禁用内部环回模式
  //
  LIN_DisableIntLoopback (Lina_base);

  //
  //在完全接收帧时启用中断
  //
  // lin_enableSCIInterrupt (Lina_base,LIN_SCI_INT_RX);

  //
  //将中断优先级设置为行0 (高)
  //
  // LIN_setSCIInterruptLevel0 (Lina_base,LIN_SCI_INT_RX);

  //
  //启用数据传输
  LIN_ENableDataTransmitter (Lina_base);
  LIN_ENableDataReceiver (Lina_base);

  //
  //退出LIN重置状态
  //
  LIN_ExitSoftwareReset(Lina_base)
}

//
//接收到的数据ISR -一种中断服务例程(ISR),在新的情况下处理
//接收数据。 一旦收到数据,数据即为读取和中断状态
//已清除。
//
__中断无效
dataRxISR(void)
  //
  //增加中断计数
  //
  rxCount++;

  //
  //读取最高优先级的中断向量
  //
  vectra偏移= LIN_getInterruptLine0Offset (Lina_base)

  //
  //读取传输的字符
  //
  receivedChar = lin_readSCICharBlocking (Lina_baseFALSE);

  //
  //检查接收到的字符是否与传输的字符匹配
  //
  IF (已接收字符!=传输字符)
  
    错误++
  }

  //
  //清除第0行的模块中断标志和全局中断标志
  //
  LIN_clearInterruptStatus (Lina_baseLIN_INT_RX);
  LIN_clearGlobalInterruptStatus (Lina_baseLIN_INTERRUCING_LINE0);

  //
  //确认位于第8组中的此中断
  //
  interrupT_clearACKGroup(interrupT_ACK_group8)
}

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

    我忘了提到:问题是它在内部环回上工作,但尝试将GPIO28连接到GPIO29并更改为外部似乎不起作用。 我无法判断是否正在加载移位寄存器。

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

    它似乎不是通过线缆发送任何内容。 我有一个示波器连接到板上的引脚GPIO28和接地,在传输数据时,没有应该存在的峰值。

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

    您好,Cannon,

    如果从外部跳过GPIO29到GPIO29的线缆,则不需要在代码中配置extloopback。 是否可以删除该代码行并查看是否可以观察到任何切换?

    此致,

    Nirav

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

    我现在正在尝试,谢谢

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

    我这样做了,并解决了另一个问题(我正在重置状态)

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

    现在,我们在示波器上有一个信号!

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

    好的,很好。 我现在将关闭此线程。