请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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 (29,GPIO _Qual_Async);
//初始化TX GPIO引脚
GPIO_setDirectionMode (28,GPIO_DIR_MODE_OUT);
// gPIO_setPadConfig (28,gPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (28,GPIO _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_base,FALSE);
//
//如果出现任何错误,请停止示例
//
如果(错误!= 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_base,LIN_COMM_SCI_IDLELINE);
//
//启用模块(应将RX FUNC和TX FUNC位设置为1,
//不确定是否有效)
//
LIN_ENableModule (Lina_base);
//
//设置波特率
//#这些是针对11.52万波特率的。 见TRM第2351页
//
LIN_setBaudRatePrescaler (Lina_base,26,2);
//#TODO将SCIGCR1中的时钟位设置为1以选择内部时钟
//
//将SCI设置为传输一个停止位
//
LIN_setSCIStopBits (Lina_base,LIN_SCI_STOP_ONE);
//
//禁用奇偶校验
//
LIN_disableSCIParity (Lina_base);
//
//禁用多缓冲区模式
//
LIN_disableMultibufferMode (Lina_base);
//
//模块设置为在调试器停止时完成操作
//
LIN_setDebugSuspendMode (Lina_base,LIN_DEBUG_COMPLETE);
//
//将字符长度设置为8位
//
LIN_setSCICharLength (Lina_base,char_length);
//
//在响应字段中设置为1个字符
//
LIN_setSCIFrameLength (Lina_base,frame_length);
//
//启用内部环回模式
//
// lin_enableIntLoopback (lina_base);
//
//启用外部环回模式
//
LIN_ENableExtLoopback (Lina_base,LIN_Looping_digital,LIN_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_base,FALSE);
//
//检查接收到的字符是否与传输的字符匹配
//
IF (已接收字符!=传输字符)
{
错误++;
}
//
//清除第0行的模块中断标志和全局中断标志
//
LIN_clearInterruptStatus (Lina_base,LIN_INT_RX);
LIN_clearGlobalInterruptStatus (Lina_base,LIN_INTERRUCING_LINE0);
//
//确认位于第8组中的此中断
//
interrupT_clearACKGroup(interrupT_ACK_group8);
}
//
//文件结束
//